# Collecter des taxes Utilisez les API Stripe Tax pour implémenter le calcul des taxes dans votre intégration personnalisée. Les API Stripe Tax vous permettent de calculer les taxes dans vos tunnels de paiement personnalisés. Une fois le paiement effectué par votre client, enregistrez la transaction pour qu’elle apparaisse dans les rapports de Stripe Tax. Les exemples de ce guide se basent sur les paiements Stripe, mais vous pouvez utiliser l’API Tax avec n’importe quel prestataire de services de paiement ou plusieurs prestataires de services de paiement. > #### Choisir la bonne intégration fiscale > > Stripe propose deux manières de gérer les taxes dans les tunnels de paiement personnalisés. Choisissez en fonction du degré de contrôle dont vous avez besoin sur les annulations fiscales : > > - Utilisez [l’intégration Payment Intents](https://docs.stripe.com/tax/payment-intent.md) si vous souhaitez que Stripe gère automatiquement les transactions et les annulations fiscales, et que les annulations de remboursement forfaitaires répondent à vos besoins. - Utilisez **l’API custom tax** si vous avez besoin d’un contrôle au niveau des postes sur les annulations fiscales (par exemple, le remboursement d’éléments spécifiques), travaillez avec plusieurs prestataires de services de paiement ou avez besoin d’un contrôle total sur le moment où les transactions sont enregistrées. Nous proposons également une fonctionnalité d’aperçu public qui vous permet d’utiliser le composant [Element de numéro fiscal](https://docs.stripe.com/elements/tax-id-element.md) pour collecter les identifiants fiscaux des clients. Pour plus d’informations, consultez la section [Collecter les identifiants fiscaux des clients ci-dessous](https://docs.stripe.com/tax/custom.md#collect-customer-tax-ids). Vous pouvez également intégrer Stripe Tax avec [Payment Links](https://docs.stripe.com/tax/payment-links.md), [Checkout](https://docs.stripe.com/tax/checkout.md), [Billing](https://docs.stripe.com/tax/subscriptions.md) et [Invoicing](https://docs.stripe.com/tax/invoicing.md) avec des configurations no-code ou low-code. Diagramme présentant une vue d'ensemble de l'intégration de l'API Tax (See full diagram at https://docs.stripe.com/tax/custom) Cette vidéo présente une intégration de l’API Stripe Tax utilisant l’API Payment Intents et l’Element Payment. [Watch on YouTube](https://www.youtube.com/watch?v=OfHJiC9Iek0) ## Ajouter des immatriculations Stripe Tax calcule les taxes uniquement dans les juridictions où vous êtes immatriculé pour collecter la TVA. Vous devez [ajouter vos immatriculations fiscales](https://docs.stripe.com/tax/registering.md#add-a-registration) dans le Dashboard. ## Optional: Collecter l'adresse du client [Côté client] La taxe que vous collectez dépend généralement de l’emplacement de votre client. Pour un calcul de taxe plus précis, veuillez collecter l’adresse complète de votre client. Avant de collecter l’adresse, vous pouvez afficher une estimation à votre client en fonction de son [adresse IP](https://docs.stripe.com/tax/custom.md#ip-address). > Les exemples ci-dessous utilisent un simple formulaire d’adresse personnalisé, mais vous pouvez également utiliser le composant [Adress Element](https://docs.stripe.com/elements/address-element.md) pour collecter les adresses des clients avec des fonctionnalités de saisie semi-automatique et de localisation. Le formulaire ci-dessous exige la saisie d’une adresse postale complète : ```html
``` Vous pouvez transmettre l’adresse à l’endpoint de votre serveur comme suit : ```js const address = { line1: document.getElementById('address_line1').value, city: document.getElementById('address_city').value, state: document.getElementById('address_state').value, postal_code: document.getElementById('address_postal_code').value, country: document.getElementById('address_country').value, }; var response = fetch('/preview-cart', { method: 'POST', body: JSON.stringify({address: address}), headers: {'Content-Type': 'application/json'}, }).then(function(response) { return response.json(); }).then(function(responseJson) { // Handle errors, or display calculated tax to your customer. }); ``` Les informations d’adresse requises pour le calcul de la taxe [varient selon le pays du client](https://docs.stripe.com/tax/customer-locations.md#supported-formats) : - **États-Unis** : nous exigeons au moins le code postal de votre client. Pour un calcul plus précis des taxes, nous vous recommandons de fournir une adresse complète. - **Canada** : nous avons besoin du code postal ou de la province de votre client. - **Autres pays** : nous exigeons uniquement le code pays de votre client. ## Calculer la taxe [Côté serveur] Vous choisissez quand et à quelle fréquence [calculer la taxe](https://docs.stripe.com/api/tax/calculations/create.md). Par exemple, vous pouvez : - Montrez une estimation des taxes [basée sur l’adresse IP de votre client](https://docs.stripe.com/tax/custom.md#ip-address) lorsqu’il accède à votre tunnel de paiement - Recalculer les taxes lorsque le client saisit son adresse de facturation ou de livraison - Calculer le montant final de la taxe à percevoir lorsque votre client a saisi son adresse Stripe [ facture des frais](https://stripe.com/tax/pricing) par appel API de calcul de taxe. Vous pouvez limiter les appels API de calcul de taxe afin de gérer vos coûts. Les exemples ci-dessous montrent comment calculer la taxe dans différents scénarios. Stripe Tax ne calcule la taxe que dans les juridictions où vous avez effectué votre enregistrement pour la percevoir. Vous devez [ajouter vos immatriculations fiscales](https://docs.stripe.com/tax/registering.md#add-a-registration) dans le Dashboard. #### Exemple - États-Unis : article hors taxes Cet exemple calcule la taxe pour une adresse de livraison aux États-Unis. Le poste a un prix de 10 USD et utilise le [code fiscal prédéfini de votre compte](https://docs.stripe.com/tax/set-up.md#preset-tax-code). ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][line1]=920 5th Ave" \ -d "customer_details[address][city]=Seattle" \ -d "customer_details[address][state]=WA" \ -d "customer_details[address][postal_code]=98104" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" ``` #### Exemple - États-Unis : plusieurs articles avec livraison Dans cet exemple, il y a plusieurs postes hors taxe et des frais de livraison de 5 USD. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_code]=txcd_99999999" \ -d "line_items[1][amount]=5000" \ -d "line_items[1][reference]=L2" \ -d "line_items[1][tax_code]=txcd_99999999" \ -d "line_items[2][amount]=9999" \ -d "line_items[2][reference]=L3" \ -d "line_items[2][tax_code]=txcd_99999999" \ -d "shipping_cost[amount]=500" \ -d "customer_details[address][line1]=920 5th Ave" \ -d "customer_details[address][city]=Seattle" \ -d "customer_details[address][state]=WA" \ -d "customer_details[address][postal_code]=98104" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" ``` #### Exemple - États-Unis : article et quantité À New York, les vêtements ne sont pas soumis à la taxe sur les ventes si chaque article coûte moins de 110 USD. Cet exemple présente un poste de vêtements avec un prix total de 150 USD et une quantité de 3. Cela signifie que chaque article de vêtements coûte 50 USD et est donc exonéré de la taxe sur les ventes. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=15000" \ -d "line_items[0][quantity]=3" \ -d "line_items[0][reference]=Clothing" \ -d "line_items[0][tax_code]=txcd_30011000" \ -d "shipping_cost[amount]=500" \ -d "customer_details[address][state]=NY" \ -d "customer_details[address][postal_code]=10001" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" ``` #### Exemple - Europe : poste TTC Dans cet exemple, la taxe est calculée pour une adresse de facturation en Irlande, où les taxes sont généralement incluses dans les tarifs pratiqués pour les clients non professionnels. L’article est proposé à un tarif de 29,99 EUR et utilise le code fiscal `txcd_10302000` (ebook). ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=eur \ -d "line_items[0][amount]=2999" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=inclusive" \ -d "line_items[0][tax_code]=txcd_10302000" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=billing" ``` #### Exemple - Europe : plusieurs articles avec livraison Dans cet exemple, la taxe est calculée pour une adresse de livraison en Irlande, où les taxes sont généralement incluses dans les tarifs pratiqués pour les clients non professionnels. L’article est proposé à un tarif de 59,99 EUR, auquel s’ajoutent des frais de livraison de 5 EUR. Comme les deux montants sont TTC, le client paie toujours 64,99 EUR. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=eur \ -d "line_items[0][amount]=5999" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=inclusive" \ -d "line_items[0][tax_code]=txcd_99999999" \ -d "shipping_cost[amount]=500" \ -d "shipping_cost[tax_behavior]=inclusive" \ -d "customer_details[address][line1]=123 Some House" \ -d "customer_details[address][city]=Dublin" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=shipping" ``` #### Exemple - Adresse de l'expéditeur Avec cette fonctionnalité préliminaire (bêta), les taxes sont prélevées en fonction de l’adresse d’expédition, si vous fournissez une adresse d’expédition dans certains États (comme l’Illinois) et que l’envoi contient des biens physiques. Si l’envoi contient à la fois des biens physiques et des services, les taxes sont appliquées aux deux en fonction de l’adresse d’expédition. Cet exemple calcule la taxe en fonction du lieu d’expédition de la commande à Naperville, dans l’Illinois, au lieu de l’adresse de l’entreprise (située en dehors de l’Illinois) et de l’adresse de livraison à Springfield, dans l’Illinois. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=exclusive" \ -d "line_items[0][tax_code]=txcd_99999999" \ -d "shipping_cost[amount]=500" \ -d "shipping_cost[tax_behavior]=exclusive" \ -d "customer_details[address][city]=Springfield" \ -d "customer_details[address][state]=IL" \ -d "customer_details[address][postal_code]=62704" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=billing" \ -d "ship_from_details[address][city]=Naperville" \ -d "ship_from_details[address][state]=IL" \ -d "ship_from_details[address][postal_code]=60540" \ -d "ship_from_details[address][country]=US" ``` La [réponse de calcul](https://docs.stripe.com/api/tax/calculations/object.md) contient des montants que vous pouvez afficher à votre client, et utiliser pour accepter les paiements : | Attribut | Description | | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [amount_total](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-amount_total) | Le montant total après calcul des taxes. Utilisez ce montant pour définir le [montant](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-amount) du PaymentIntent à facturer à votre client. | | [tax_amount_exclusive](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-tax_amount_exclusive) | Le montant des taxes qui vient s’ajouter aux postes de facture et aux frais de livraison, faisant s’accroître la valeur `amount_total`. Utilisez-le pour indiquer à votre client le montant de taxes ajouté au sous-total de la transaction. | | [tax_amount_inclusive](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-tax_amount_inclusive) | Le montant des taxes inclus dans vos postes de facture et vos frais de livraison (si vous avez opté pour les tarification TTC). Ce montant n’augmente pas la valeur `amount_total`. Utilisez-le pour communiquer à votre client quelle est la part des taxes dans le montant total payé. | | [tax_breakdown](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-tax_breakdown) | Liste de montants de taxe répartis par taux d’imposition du pays ou de l’État. Vous pouvez vous en servir pour indiquer à vos clients quelles taxes vous collectez. | ### Gérer les erreurs d’emplacement du client Le calcul renvoie le code d’erreur `customer_tax_location_invalid` si l’adresse de votre client est invalide ou n’est pas suffisamment précise pour calculer la taxe : ```json { "error": { "doc_url": "https://docs.stripe.com/error-codes#customer-tax-location-invalid","code": "customer_tax_location_invalid", "message": "We could not determine the customer's tax location based on the provided customer address.", "param": "customer_details[address]", "type": "invalid_request_error" } } ``` Si vous recevez cette erreur, demandez à votre client de vérifier l’adresse saisie et de corriger toute éventuelle faute de frappe. ### Utiliser le calcul avec un autre sous-traitant Si vous traitez des transactions en dehors de Stripe, vous pouvez ignorer les étapes suivantes et appliquer le calcul à vos transactions traitées en externe. ## Créer une transaction fiscale [Côté serveur] La création d’une transaction fiscale enregistre les taxes que vous avez collectées auprès de votre client, afin que vous puissiez ultérieurement [télécharger des exports et générer des rapports ](https://docs.stripe.com/tax/reports.md)pour faciliter votre déclaration fiscale. Vous pouvez [créer une transaction](https://docs.stripe.com/api/tax/transactions/create_from_calculation.md) à partir d’un calcul jusqu’à la date d’expiration [(expires_at)](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-expires_at), soit 90 jours après sa création. Toute tentative d’utilisation après cette période renverra une erreur. > La transaction est considérée comme effective à la date d’appel de `create_from_calculation`, et les montants de taxe ne seront pas recalculés. Lorsque vous créez une transaction fiscale, vous devez fournir une `reference` unique pour la transaction et pour chaque poste de facture. Ces références apparaissent dans les exports des taxes et permettent de rapprocher les taxes perçues et les commandes de votre système. Par exemple, une transaction fiscale portant la référence `pi_123456789`, les références de poste de facture `L1` et `L2` et des frais de livraison prend la forme suivante dans les exportations détaillées des taxes. | ID | line_item_id | type | devise | transaction_date | | ------------ | ------------ | ------- | ------ | ------------------- | | pi_123456789 | L1 | externe | USD | 23/02/2023 17:01:16 | | pi_123456789 | L2 | externe | USD | 23/02/2023 17:01:16 | | pi_123456789 | livraison | externe | USD | 23/02/2023 17:01:16 | Lorsque votre client paie, utilisez l’ID de calcul pour enregistrer la taxe perçue. Vous pouvez le faire de deux manières : - Si votre serveur dispose d’un endpoint où votre client soumet sa commande, vous pouvez créer la transaction fiscale une fois la commande soumise. - Écoutez l’événement webhook [paiement_intent.succeeded](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.succeeded). Récupérez l’identifiant de calcul à partir des `metadata` de PaymentIntent. L’exemple ci-dessous crée une transaction et utilise l’identifiant PaymentIntent comme référence unique : ```curl curl https://api.stripe.com/v1/tax/transactions/create_from_calculation \ -u "<>:" \ -d calculation={{TAX_CALCULATION}} \ -d "reference={{PAYMENTINTENT_ID}}" \ -d "expand[]=line_items" ``` Sauvegardez [l’identifiant de la transaction fiscale](https://docs.stripe.com/api/tax/transactions/object.md#tax_transaction_object-id) pour enregistrer les remboursements ultérieurement. Vous pouvez sauvegarder l’identifiant de la transaction dans votre base de données ou dans les métadonnées de la PaymentIntent : ```curl curl https://api.stripe.com/v1/payment_intents/{{PAYMENTINTENT_ID}} \ -u "<>:" \ -d "metadata[tax_transaction]={{TAX_TRANSACTION}}" ``` ## Enregistrer des remboursements [Côté serveur] Après avoir créé une transaction fiscale correspondant à une vente à un client, vous devrez peut-être enregistrer des remboursements. Ces opérations sont représentées par des transactions fiscales dans lesquelles `type=reversal`. Les transactions d’annulation compensent des transactions antérieures en présentant des montants de signes opposés. Par exemple, le remboursement intégral d’une vente de 50 USD sera représenté par une opération de -50 USD. Lorsque vous émettez un remboursement (via Stripe ou en dehors de Stripe), vous devez créer une transaction fiscale d’annulation avec une `référence` unique. Voici quelques stratégies courantes : - Ajoutez un suffixe à la référence originale. Par exemple, si la transaction d’origine porte la référence `pi_123456789`, créez une transaction d’annulation avec la référence `pi_123456789-refund`. - Utilisez l’ID de [remboursement de Stripe](https://docs.stripe.com/api/refunds/object.md) ou un identifiant de remboursement provenant de votre système. Par exemple`re_3MoslRBUZ691iUZ41bsYVkOg` ou`myRefund_456`. Choisissez l’approche qui fonctionne le mieux pour rapprocher les commandes de vos clients avec vos [exportations fiscales](https://docs.stripe.com/tax/reports.md). ### Remboursement intégral d’une vente Une fois que vous avez effectué le remboursement intégral d’une vente dans votre système, créez une transaction d’annulation avec le paramètre `mode=full`. Dans l’exemple ci-dessous, `tax_1MEFAAI6rIcR421eB1YOzACZ` est la transaction fiscale qui enregistre la vente à votre client : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=full \ -d original_transaction=tax_1MEFAAI6rIcR421eB1YOzACZ \ -d reference=pi_123456789-cancel \ -d "expand[]=line_items" ``` La transaction d’annulation intégrale ainsi créée est alors renvoyée : ```json { "id": "tax_1MEFtXI6rIcR421e0KTGXvCK", "object": "tax.transaction", "created": 1670866467, "currency": "eur", "customer": null, "customer_details": { "address": { "city": null, "country": "IE", "line1": null, "line2": null, "postal_code": null, "state": null }, "address_source": "billing", "ip_address": null, "tax_ids": [], "taxability_override": "none" }, "line_items": { "object": "list", "data": [ { "id": "tax_li_MyCIgTuP9F9mEU", "object": "tax.transaction_line_item", "amount": -4999, "amount_tax": -1150, "livemode": false, "metadata": { }, "quantity": 1, "reference": "L1", "reversal": { "original_line_item": "tax_li_MyBXPByrSUwm6r" }, "tax_behavior": "exclusive", "tax_code": "txcd_10000000", "type": "reversal" }, { "id": "tax_li_MyCIUNXExXmJKU", "object": "tax.transaction_line_item", "amount": -1090, "amount_tax": -90, "livemode": false, "metadata": { }, "quantity": 1, "reference": "L2", "reversal": { "original_line_item": "tax_li_MyBX3Wu3qd2mXj" }, "tax_behavior": "exclusive", "tax_code": "txcd_10000000", "type": "reversal" } ], "has_more": false, "total_count": 2, "url": "/v1/tax/transactions/tax_1MEFtXI6rIcR421e0KTGXvCK/line_items" }, "livemode": false, "metadata": { }, "reference": "pi_123456789-cancel", "reversal": { "original_transaction": "tax_1MEFAAI6rIcR421eB1YOzACZ" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` L’annulation complète d’une transaction n’affecte pas les annulations partielles précédentes. Lorsque vous enregistrez une annulation complète, veillez à [annuler intégralement](https://docs.stripe.com/tax/custom.md#reversals-void-refund) toutes les annulations partielles précédentes pour la même transaction afin d’éviter les remboursements en double. ### Remboursement partiel d’une vente Après [émission d’un remboursement](https://docs.stripe.com/api/refunds/create.md) à votre client, créez un opération fiscale d’annulation avec `mode=partial`. Cela vous permet d’enregistrer un remboursement partiel en fournissant les montants des postes remboursés. Vous pouvez créer jusqu’à 30 annulations partielles pour chaque vente. Si vous annulez plus que la quantité de taxes que vous avez collectée, une erreur est renvoyée. Dans l’exemple ci-dessous, seul le premier poste de la transaction d’origine est remboursé : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=partial \ -d original_transaction=tax_1MEFAAI6rIcR421eB1YOzACZ \ -d reference=pi_123456789-refund_1 \ -d "line_items[0][original_line_item]=tax_li_MyBXPByrSUwm6r" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][amount]=-4999" \ -d "line_items[0][amount_tax]=-1150" \ -d "metadata[refund]={{REFUND_ID}}" \ --data-urlencode "metadata[refund_reason]=Refunded line 1 of pi_123456789 (customer was unhappy)" \ -d "expand[0]=line_items" ``` La transaction d’annulation partielle ainsi créée est alors renvoyée : ```json { "id": "tax_1MEFACI6rIcR421eHrjXCSmD", "object": "tax.transaction", "created": 1670863656, "currency": "eur", ... "line_items": { "object": "list", "data": [ { "id": "tax_li_MyBXC98AhtaR37", "object": "tax.transaction_line_item", "amount": -4999, "amount_tax": -1150, "livemode": false, "metadata": { }, "quantity": 1, "reference": "L1", "reversal": { "original_line_item": "tax_li_MyBXPByrSUwm6r" }, "tax_behavior": "exclusive", "tax_code": "txcd_10000000", "type": "reversal" } ], "has_more": false, "total_count": 1, "url": "/v1/tax/transactions/tax_1MEFACI6rIcR421eHrjXCSmD/line_items" }, "livemode": false, "metadata": { "refund": "{{REFUND_ID}}", "description": "Refunding pi_123456789 (customer was unhappy)" }, "reference": "pi_123456789-refund_1", "reversal": { "original_transaction": "tax_1MEFAAI6rIcR421eB1YOzACZ" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` Pour chaque poste annulé, vous devez fournir l’`amount` et `amount_tax` annulés. L’`amount` inclut la taxe si le poste initial du calcul incluait la taxe. La façon dont les attributs `amount` et `amount_tax` sont déterminés dépend de votre situation : - Si vos transactions comportent toujours un seul poste, utilisez les [annulations complètes](https://docs.stripe.com/tax/custom.md#reversals-full) à la place. - Si vous remboursez toujours les postes dans leur intégralité, utilisez les valeurs `amount` et `amount_tax` du poste d’origine, mais avec des signes négatifs. - Si vous remboursez une partie de la valeur des postes, vous devez calculer les montants remboursés. Par exemple, pour une transaction de vente avec `amount=5000` et `amount_tax=500`, après avoir remboursé la moitié de la valeur du poste, vous créez une annulation partielle avec la valeur de poste `amount=-2500` et `amount_tax=-250`. #### Rapports fiscaux avec remboursements partiels Un remboursement de la taxe effectué partiellement peut rompre la cohérence entre le sous-total et le montant de taxe appliqué.Dans ce cas, vos rapports fiscaux risquent de ne plus être fiables. Le système n’ajustera pas automatiquement les montants taxables et non taxables et ne reflétera pas le motif de l’annulation de la taxe (par exemple : produit ou client exonéré ou autoliquidation). Évitez les remboursements partiels de taxe par poste. Annulez plutôt la transaction, puis créez-en une nouvelle avec les paramètres appropriés afin de garantir un calcul fiscal exact. ### Remboursement partiel d’une vente par montant fixe Vous pouvez également créer une annulation avec le paramètre `mode=partial` en spécifiant le montant fixe après impôt que vous souhaitez rembourser. Ce montant est alors réparti entre les différents postes et frais de livraison de manière proportionnelle, en fonction du montant restant à rembourser pour chacun d’entre eux. Dans l’exemple ci-dessous, la transaction comporte deux postes de facture : un poste de 10 USD et un poste de 20 USD, tous deux taxés à 10 %. Le montant total de la transaction est de 33,00 USD. On reçoit un remboursement d’un montant fixe de 16,50 USD : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=partial \ -d original_transaction=tax_1NVcKqBUZ691iUZ4xMZtcGYt \ -d reference=pi_234567890-refund_1 \ -d flat_amount=-1650 \ -d "metadata[refund]={{REFUND_ID}}" \ --data-urlencode "metadata[refund_reason]=Refunded 16.50 USD of pi_234567890 (customer was unhappy)" \ -d "expand[]=line_items" ``` La transaction d’annulation partielle ainsi créée est alors renvoyée : ```json { "id": "tax_1NVcQYBUZ691iUZ4SBPukGa6", "object": "tax.transaction", "created": 1689780994, "currency": "usd", ... "line_items": { "object": "list", "data": [ { "id": "tax_li_OICqymcWjlbevq", "object": "tax.transaction_line_item", "amount": -500, "amount_tax": -50, "livemode": false, "metadata": {}, "product": null, "quantity": 1, "reference": "refund_li_1", "reversal": { "original_line_item": "tax_li_OICmRXkFuWr8Df" }, "tax_behavior": "exclusive", "tax_code": "txcd_10103000", "type": "reversal" }, { "id": "tax_li_OICq2H1qHjwyzX", "object": "tax.transaction_line_item", "amount": -1000, "amount_tax": -100, "livemode": false, "metadata": {}, "product": null, "quantity": 1, "reference": "refund_li_2", "reversal": { "original_line_item": "tax_li_OICmxhnSJxF7rY" }, "tax_behavior": "exclusive", "tax_code": "txcd_10103000", "type": "reversal" } ], "has_more": false, "total_count": 2, "url": "/v1/tax/transactions/tax_1NVcQYBUZ691iUZ4SBPukGa6/line_items" }, "livemode": false, "metadata": { "refund": "{{REFUND_ID}}", "description": "Refunding pi_234567890 (customer was unhappy)" }, "reference": "pi_234567890-refund_1", "reversal": { "original_transaction": "tax_1NVcKqBUZ691iUZ4xMZtcGYt" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` Les montants remboursés et taxes correspondant à chaque poste de facture et frais de livraison de la transaction initiale sont calculés comme suit : 1. Tout d’abord, nous calculons le montant total remboursable sur la transaction. Puisque celle-ci n’avait fait l’objet d’aucun remboursement précédent, le montant total pouvant être remboursé est de 33,00 USD. 1. Ensuite, nous calculons le montant à rembourser pour chaque poste de facture, en fonction de la proportion que représente le montant remboursable de ce poste par rapport au montant total remboursable sur la transaction. Par exemple, le poste de 10 USD présente un montant remboursable de 11 USD, ce qui représente 33,33 % du montant total remboursable sur la transaction. Le montant à rembourser pour ce poste est donc de `-16.50 USD * 33.33% = -5.50 USD`. 1. Enfin, pour chaque poste, le montant total à rembourser est réparti entre les attributs `amount` et `amount_tax`. Cette opération s’effectue également au prorata du montant de taxe remboursable sur un poste par rapport au montant total remboursable. Si on reprend l’exemple du poste de 10 USD, la taxe (1,00 USD) représentant 9,09 % du total remboursable (11 USD), la valeur associée à l’attribut `amount_tax` est donc de `-5.50 USD * 9.09% = -0.50 USD`. Le montant forfaitaire est réparti en fonction du montant *left* to refund dans la transaction, et non du montant initialement enregistré. Par exemple, au lieu d’enregistrer un remboursement d’un montant forfaitaire de 16,50 USD, vous enregistrez d’abord une annulation partielle du montant total du poste de 10 USD : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=partial \ -d original_transaction=tax_1NVcKqBUZ691iUZ4xMZtcGYt \ -d reference=pi_234567890-refund_1 \ -d "line_items[0][original_line_item]=tax_li_OICmRXkFuWr8Df" \ -d "line_items[0][reference]=partial_refund_l1" \ -d "line_items[0][amount]=-1000" \ -d "line_items[0][amount_tax]=-100" \ -d "metadata[refund]={{REFUND_ID}}" \ --data-urlencode "metadata[refund_reason]=Refunded line 1 of pi_234567890 (customer was unhappy)" \ -d "expand[0]=line_items" ``` Ensuite, vous enregistrez une annulation d’un montant fixe de 16,50 USD : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=partial \ -d original_transaction=tax_1NVcKqBUZ691iUZ4xMZtcGYt \ -d reference=pi_234567890-refund_2 \ -d flat_amount=-1650 \ -d "metadata[refund]={{REFUND_ID}}" \ --data-urlencode "metadata[refund_reason]=Refunded 16.50 USD of pi_234567890 (customer was still unhappy)" \ -d "expand[]=line_items" ``` La transaction d’annulation partielle suivante est alors renvoyée : ```json { "id": "tax_1NVxFIBUZ691iUZ4saOIloxB", "object": "tax.transaction", "created": 1689861020, "currency": "usd", ... "line_items": { "object": "list", "data": [ { "id": "tax_li_OIYM8xd8BzrATd", "object": "tax.transaction_line_item", "amount": 0, "amount_tax": 0, "livemode": false, "metadata": {}, "product": null, "quantity": 1, "reference": "refund_li_1", "reversal": { "original_line_item": "tax_li_OICmRXkFuWr8Df" }, "tax_behavior": "exclusive", "tax_code": "txcd_10103000", "type": "reversal" }, { "id": "tax_li_OIYMNBH6s8oQj9", "object": "tax.transaction_line_item", "amount": -1500, "amount_tax": -150, "livemode": false, "metadata": {}, "product": null, "quantity": 1, "reference": "refund_li_2", "reversal": { "original_line_item": "tax_li_OICmxhnSJxF7rY" }, "tax_behavior": "exclusive", "tax_code": "txcd_10103000", "type": "reversal" } ], "has_more": false, "total_count": 2, "url": "/v1/tax/transactions/tax_1NVxFIBUZ691iUZ4saOIloxB/line_items" }, "livemode": false, "metadata": {}, "reference": "pi_234567890-refund_2", "reversal": { "original_transaction": "tax_1NVcKqBUZ691iUZ4xMZtcGYt" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` Étant donné que le montant total restant à rembourser sur la transaction est désormais de 22,00 USD et que le poste de 10 USD est intégralement remboursé, les 16,50 USD sont entièrement imputés au poste de 20 USD, puis répartis, selon la logique de l’étape 3, entre attribut `amount = -15,00 USD` et attribut `amount_tax = -1,50 USD`. Pendant ce temps, le poste de 10 USD de la transaction enregistre un remboursement de 0 USD. ### Annuler un remboursement partiel Les transactions fiscales sont immuables, mais vous pouvez annuler un remboursement partiel en créant une [annulation intégrale](https://docs.stripe.com/api/tax/transactions/create_reversal.md#tax_transaction_create_reversal-mode). Vous pouvez être amené à le faire dans les cas suivants : - Le [remboursement](https://docs.stripe.com/refunds.md#failed-refunds) du paiement échoue et vous n’avez pas fourni le bien ou le service à votre client - La mauvaise commande ou les mauvais montants sont remboursés - La vente initiale est intégralement remboursée et les remboursements partiels ne sont plus valides Dans l’exemple ci-dessous, `tax_1MEFACI6rIcR421eHrjXCSmD` est la transaction qui représente le remboursement partiel : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=full \ -d original_transaction=tax_1MEFACI6rIcR421eHrjXCSmD \ -d reference=pi_123456789-refund_1-cancel \ -d "metadata[refund_reason]=User called to cancel because they selected the wrong item" \ -d "expand[]=line_items" ``` La transaction d’annulation intégrale ainsi créée est alors renvoyée : ```json { "id": "tax_1MEFADI6rIcR421e94fNTOCK", "object": "tax.transaction", "created": 1670863657, "currency": "eur", ... "line_items": { "object": "list", "data": [ { "id": "tax_li_MyBXMOlwenCyFB", "object": "tax.transaction_line_item", "amount": 4999, "amount_tax": 1150, "livemode": false, "metadata": { }, "quantity": 1, "reference": "L1", "reversal": { "original_line_item": "tax_li_MyBXC98AhtaR37" }, "tax_behavior": "exclusive", "tax_code": "txcd_10000000", "type": "reversal" } ], "has_more": false, "total_count": 1, "url": "/v1/tax/transactions/tax_1MEFADI6rIcR421e94fNTOCK/line_items" }, "livemode": false, "metadata": { "refund_reason": "User called to cancel because they picked the wrong item" }, "reference": "pi_123456789-refund_1-cancel", "reversal": { "original_transaction": "tax_1MEFACI6rIcR421eHrjXCSmD" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` ## Test Utilisez les *environnements de test* (A sandbox is an isolated test environment that allows you to test Stripe functionality in your account without affecting your live integration. Use sandboxes to safely experiment with new features and changes) dont la structure de réponse est identique à celle du mode production, pour vérifier que votre intégration fonctionne correctement avant de la mise en production. > Dans les environnements de test, les calculs ne garantissent pas des résultats de taxation à jour. Vous êtes limité à 1 000 calculs de taxes par jour. Si vous avez besoin d’une limite plus élevée, contactez le [service d’assistance Stripe](https://support.stripe.com/contact). Pour obtenir des conseils sur les tests automatisés et les stratégies permettant d’éviter les limites d’appels dans les environnements de test, consultez la section [Tests automatisés](https://docs.stripe.com/automated-testing.md). ## Afficher les transactions fiscales Vous pouvez afficher toutes les transactions comportant des taxes de votre compte sur la page [Transactions avec taxe](https://dashboard.stripe.com/test/tax/transactions) du Dashboard. Cliquez sur une transaction donnée pour afficher le détail des taxes calculées par territoire fiscal et par produit inclus dans la transaction. > La page Transactions fiscales n’inclut que les *transactions* et non les *calculations*. Si vous vous attendez à voir un calcul et que vous ne le trouvez pas sur cette page, vérifiez que vous avez bien [créé une transaction fiscale](https://docs.stripe.com/tax/custom.md#tax-transaction) à partir du calcul. ## Optional: Exemples d'intégration Vous pouvez calculer la taxe pour votre client avant de collecter les informations relatives au moyen de paiement et de [créer un PaymentIntent](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=elements&api-integration=paymentintents#web-create-intent). Par exemple, vous pouvez afficher le total du panier lorsque le client indique son code postal. Dans l’exemple ci-dessous, votre serveur définit un endpoint `/preview-cart` sur lequel est envoyée l’adresse du client depuis votre formulaire côté client. Le serveur calcule la taxe en fonction des postes de factures inclus dans le panier et de l’adresse du client. #### Node.js ```javascript // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys const stripe = require('stripe')('<>'); const express = require('express'); const app = express(); // Parse the request body as JSON. app.use(express.json()); app.post('/preview-cart', async (req, res) => { const cart = ...; // Load the cart/order from your system // Convert each cart item to a Stripe line item object const lineItems = cart.items.map( cartItem => ({ reference: cartItem.id, amount: cartItem.unitPrice * cartItem.quantity, quantity: cartItem.quantity }) ); // Get the customer's address from the request body const address = req.body.address; // Create a tax calculation using the Stripe API const calculation = await stripe.tax.calculations.create({ currency: cart.currency, line_items: lineItems, customer_details: { address: { line1: address.line1, city: address.city, state: address.state, postal_code: address.postal_code, country: address.country, }, address_source: "billing" }, expand: ['line_items.data.tax_breakdown'] }); // Return the tax amount as a JSON response res.json({ tax_amount: calculation.tax_amount_exclusive }); }); app.listen(4242, () => { console.log('Running on port 4242'); }); ``` Lorsque vous pouvez accepter le paiement, créez une PaymentIntent à partir du résultat du calcul des taxes. Sauvegardez l’identifiant du calcul des taxes dans les [métadonnées](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-metadata) de PaymentIntent ou dans votre propre base de données, afin de pouvoir créer une transaction fiscale lorsque votre client aura effectué le paiement. L’exemple ci-dessous montre un endpoint serveur qui calcule la taxe, crée (ou met à jour) un PaymentIntent et renvoie le résultat au client. Vous pouvez ensuite afficher la taxe à votre client. Utilisez le paramètre `client_secret` pour[ accepter le paiement](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=elements&api-integration=paymentintents#web-collect-payment-details). #### Node.js ```javascript // Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys const stripe = require('stripe')('<>'); const express = require('express'); const app = express(); // Parse the request body as JSON. app.use(express.json()); app.post('/calculate-cart', async (req, res) => { const cart = ...; // Load the cart/order from your system // Create a tax calculation using the Stripe API const calculation = await stripe.tax.calculations.create(...); let paymentIntent; // Update the PaymentIntent if one already exists for this cart. if (cart.paymentIntent) { paymentIntent = await stripe.paymentIntents.update(cart.paymentIntent, { amount: calculation.amount_total, metadata: {tax_calculation: calculation.id}, }); } else { paymentIntent = await stripe.paymentIntents.create({ currency: cart.currency, amount: calculation.amount_total, metadata: {tax_calculation: calculation.id}, // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. automatic_payment_methods: {enabled: true}, }); } // Store PaymentIntent ID in cart or customer session. cart.paymentIntent = paymentIntent.id; // Return calculated amounts and PaymentIntent secret to the client. res.json({ total: calculation.amount_total, tax_amount: calculation.tax_amount_exclusive, client_secret: paymentIntent.client_secret }); }); app.listen(4242, () => { console.log('Running on port 4242'); }); ``` Si votre intégration utilise le composant Payment Element, [ récupérez les mises à jour du serveur](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=elements&api-integration=paymentintents#fetch-updates) après la mise à jour du PaymentIntent. ## Optional: Calculer les taxes sur les frais de livraison [Côté serveur] Pour calculer les taxes sur les frais de livraison, utilisez le paramètre `shipping_cost` : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][line1]=920 5th Ave" \ -d "customer_details[address][city]=Seattle" \ -d "customer_details[address][state]=WA" \ -d "customer_details[address][postal_code]=98104" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" \ -d "shipping_cost[amount]=500" \ -d "shipping_cost[tax_code]=txcd_92010001" ``` Transmettez l’identifiant d’un [ShippingRate](https://docs.stripe.com/api/shipping_rates/object.md) existant pour utiliser son `amount`, son `tax_code` et son `tax_behavior` : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][line1]=920 5th Ave" \ -d "customer_details[address][city]=Seattle" \ -d "customer_details[address][state]=WA" \ -d "customer_details[address][postal_code]=98104" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" \ -d "shipping_cost[shipping_rate]=shr_1Mlh8YI6rIcR421eUr9SJzAD" ``` ## Optional: Estimer le montant des taxes à partir d'une adresse IP [Côté serveur] Si vous fournissez l’[adresse IP](https://docs.stripe.com/api/tax/calculations/create.md#calculate_tax-customer_details-ip_address) à votre client, nous la géolocalisons et utilisons cet emplacement comme celui de votre client. Utilisez cette fonctionnalité pour afficher une estimation de taxe à votre client avant qu’il ne fournisse son adresse postale. > Étant donné que l’emplacement d’une adresse IP peut être loin de l’emplacement actuel du client, nous vous déconseillons d’utiliser une adresse IP pour déterminer le montant *final* de la taxe à percevoir. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[ip_address]=127.0.0.1" ``` ## Optional: Collecter les numéros fiscaux des clients [Côté serveur] Dans certains cas, comme la fourniture de services transfrontaliers, votre client peut être tenu de déclarer la TVA selon le [mécanisme d’autoliquidation de la TVA](https://docs.stripe.com/tax/zero-tax.md#reverse-charges). Au lieu de collecter la TVA, vous devez émettre une facture comportant la mention « Autoliquidation de la TVA par le client ». Cela informe votre client qu’il est responsable du paiement de la TVA sur son achat. Fournissez les [numéros fiscaux](https://docs.stripe.com/api/tax/calculations/create.md#calculate_tax-customer_details-tax_ids) de votre client pour déterminer automatiquement si l’autoliquidation de la TVA s’applique : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=billing" \ -d "customer_details[tax_ids][0][type]=eu_vat" \ -d "customer_details[tax_ids][0][value]=DE123456789" ``` Si vous fournissez un numéro fiscal au format invalide, le calcul renvoie le code d’erreur `tax_id_invalid` : ```json { "error": { "code": "tax_id_invalid", "doc_url": "https://docs.stripe.com/error-codes#tax-id-invalid", "message": "Invalid value for eu_vat.", "param": "customer_details[tax_ids][0][value]", "type": "invalid_request_error" } } ``` L’API Tax ne valide pas automatiquement les numéros fiscaux auprès des bases de données gouvernementales. Pour valider un numéro fiscal avant de calculer la TVA, vous devez utiliser la [validation du numéro fiscal du client](https://docs.stripe.com/billing/customer/tax-ids.md#validation). ## Optional: Tarification TTC [Côté serveur] Par défaut, la taxe est calculée en plus du montant du poste et des frais de livraison que vous indiquez. Pour calculer la taxe incluse dans vos prix, définissez le paramètre `tax_behavior` sur `inclusive` pour le [poste](https://docs.stripe.com/api/tax/calculations/create.md#calculate_tax-line_items-tax_behavior) ou les [frais de livraison](https://docs.stripe.com/api/tax/calculations/create.md#calculate_tax-shipping_cost-tax_behavior). Dans l’exemple ci-dessous, le client paie toujours 100 EUR : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=eur \ -d "line_items[0][amount]=10000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=inclusive" \ -d "line_items[0][tax_code]=txcd_10103000" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=billing" ``` La réponse renvoie le montant toutes taxes comprises : ```json { ... "amount_total": 10000, ... "tax_amount_exclusive": 0,"tax_amount_inclusive": 1870, "tax_breakdown": [ { "amount": 1870, "inclusive": true, "tax_rate_details": { "country": "IE", "percentage_decimal": "23.0", "state": null, "tax_type": "vat" }, "taxability_reason": "standard_rated", "taxable_amount": 8130 } ], ... } ``` ## Optional: Utiliser un objet Product existant [Côté serveur] Vous pouvez fournir un objet [Produit](https://docs.stripe.com/api/products/object.md) pour chaque poste. Si le produit possède un [tax_code](https://docs.stripe.com/api/products/object.md#product_object-tax_code), nous l’utilisons comme `tax_code` du poste, s’il n’est pas déjà renseigné. Nous n’utilisons pas les autres valeurs du produit, notamment le `tax_behavior` et le `price`, lors du calcul des taxes. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][product]={{PRODUCT_ID}}" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=billing" ``` ## Optional: Utiliser un Account ou un Customer existant [Côté serveur] Le calcul de la taxe utilise automatiquement l’adresse et les identifiants fiscaux du [Customer](https://docs.stripe.com/api/customers/object.md) pertinents, en fonction de la disponibilité des données du client : - L’adresse de livraison du client renseigne le champ `customer_details.address` du calcul. - Sinon, l’adresse du client renseigne le champ `customer_details.address` du calcul. - L’adresse IP du client renseigne le champ `customer_details.ip_address` du calcul. - Si le client bénéficie d’une exonération fiscale, cela renseigne le champ `customer_details.taxability_override` du calcul. - Les identifiants fiscaux du client renseignent le champ `customer_details.tax_ids` du calcul. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer={{CUSTOMER_ID}}" ``` ## Optional: Remplacer l'assujettissement à la taxe du client [Côté serveur] Vous n’avez pas besoin de collecter de taxe dans certains cas, par exemple lorsque votre client est exonéré de taxe. Vous pouvez indiquer l’exonération de taxe à Stripe Tax à l’aide du paramètre [taxability_override](https://docs.stripe.com/api/tax/calculations/create.md#calculate_tax-customer_details-taxability_override). Pour fournir le remplacement d’assujettissement à la taxe du client dans vos calculs : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][line1]=920 5th Ave" \ -d "customer_details[address][city]=Seattle" \ -d "customer_details[address][state]=WA" \ -d "customer_details[address][postal_code]=98104" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=billing" \ -d "customer_details[taxability_override]=customer_exempt" ``` ### Autoliquidation de la TVA Certaines régions, comme l’Union européenne, appliquent un mécanisme d’« autoliquidation de la TVA » où le client est responsable de la déclaration de la TVA s’il achète en tant qu’entreprise. Pour que Stripe Tax applique le régime fiscal approprié, nous vous recommandons de collecter les [numéros fiscaux](https://docs.stripe.com/tax/custom.md#tax-ids) de vos clients. Il se peut que vous ne disposiez pas des numéros fiscaux de votre client, ou que vous ayez déterminé séparément que le mécanisme d’autoliquidation de la TVA s’applique. Dans de tels scénarios, vous pouvez utiliser `taxability_override` pour forcer Stripe Tax à appliquer le mécanisme d’autoliquidation de la TVA. Pour fournir le remplacement d’assujettissement à la taxe du client dans vos calculs : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=eur \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=billing" \ -d "customer_details[taxability_override]=reverse_charge" ``` ## Optional: Spécifier un lieu d'expédition [Côté serveur] Si vous expédiez des marchandises à partir d’une autre adresse que l’adresse principale de votre entreprise, vous pouvez fournir cette adresse pour le calcul des taxes. Pour indiquer l’adresse de l’expéditeur, utilisez le paramètre `ship_from_details`. Dans cet exemple, l’utilisateur est établi en Floride, son client est établi à Springfield (Illinois), et l’utilisateur expédie les marchandises depuis Naperville (Illinois) : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=exclusive" \ -d "line_items[0][tax_code]=txcd_99999999" \ -d "customer_details[address][city]=Springfield" \ -d "customer_details[address][state]=IL" \ -d "customer_details[address][postal_code]=62704" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=billing" \ -d "ship_from_details[address][city]=Naperville" \ -d "ship_from_details[address][state]=IL" \ -d "ship_from_details[address][postal_code]=60540" \ -d "ship_from_details[address][country]=US" ``` La réponse renvoie la taxe calculée en fonction de l’adresse d’expédition de la commande (Naperville, IL) au lieu de l’adresse de destination (Springfield, IL) ou de l’adresse de l’entreprise du commerçant : ```json { ... "amount_total": 1078, ... "tax_amount_exclusive": 78, ... "tax_breakdown": [ { "amount": 78, "inclusive": true,"tax_rate_details": { "country": "US", "percentage_decimal": "7.75", "state": "IL", "tax_type": "sales_tax" }, "taxability_reason": "standard_rated", "taxable_amount": 1000 } ], ... } ``` Pour en savoir plus sur la façon dont nous calculons les taxes dans ces scénarios, consultez la section [Documentation fiscale Stripe](https://docs.stripe.com/tax/calculating.md). ## Optional: Calculer les frais de livraison d’articles au détail [Côté serveur] Stripe Tax prend en charge le calcul des frais de livraison d’articles au détail au Minnesota et au Colorado. Après avoir ajouté une immatriculation fiscale de type `state_retail_delivery_fee` dans les États pris en charge, les frais de livraison au détail sont déterminés lors du calcul des taxes. ```curl curl https://api.stripe.com/v1/tax/registrations \ -u "<>:" \ -d country=US \ -d "country_options[us][state]=CO" \ -d "country_options[us][type]=state_retail_delivery_fee" \ -d active_from=now ``` Pour calculer les frais de livraison au détail, appelez l’API de calcul des taxes en utilisant un [code de taxe sur les produits physiques](https://docs.stripe.com/tax/tax-codes.md?type=physical), tel que `txcd_30011000`, qui représente les Vêtements et les Chaussures. Tous les articles physiques ne déclenchent pas le calcul des frais de livraison au détail. Consultez la documentation de l’État concerné pour savoir quand la taxe s’applique : - [Frais de livraison au détail - Colorado](https://docs.stripe.com/tax/supported-countries/united-states/collect-tax.md?tax-jurisdiction-united-states=colorado#other-taxes) - [Frais de livraison au commerce en ligne - Minnesota](https://docs.stripe.com/tax/supported-countries/united-states/collect-tax.md?tax-jurisdiction-united-states=minnesota#other-taxes) ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=exclusive" \ -d "line_items[0][tax_code]=txcd_30011000" \ -d "shipping_cost[amount]=400" \ -d "customer_details[address][line1]=1437 Bannock St Room 451" \ -d "customer_details[address][city]=Springfield" \ -d "customer_details[address][state]=CO" \ -d "customer_details[address][postal_code]=80202" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" ``` La réponse renvoie la taxe calculée, incluant les frais de livraison au détail pour le Colorado. Il s’agit d’une entrée supplémentaire dans l’objet `tax_breakdown`, avec `tax_breakdown.tax_rate_details.rate_type` défini sur `flat_amount` : ```json { ... "amount_total": 2165, ... "tax_amount_exclusive": 165, ... "tax_breakdown": [ { "amount": 88, "inclusive": false, "tax_rate_details": { "percentage_decimal": "8.81", "rate_type": "percentage", "tax_type": "sales_tax", ... }, "taxability_reason": "standard_rated", "taxable_amount": 1000 }, ... { "amount": 29, "inclusive": false,"tax_rate_details": { "flat_amount": { "amount": 29, "currency": "usd" }, "percentage_decimal": "0.0", "rate_type": "flat_amount", "tax_type": "retail_delivery_fee", ... }, "taxability_reason": "standard_rated", "taxable_amount": 1000 } ], ... } ``` ## Optional: Répartition détaillée des taxes pour les postes de facture [Côté serveur] Le champ [tax_breakdown](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-tax_breakdown) de niveau supérieur est toujours renvoyé et fournit une ventilation simple, adaptée à l’affichage d’une liste de taxes lors du paiement ou sur un reçu. Vous pouvez utiliser le champ [taxability_reason](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-line_items-data-tax_breakdown-taxability_reason) pour comprendre pourquoi la taxe n’est pas appliquée lors de la création de votre intégration. Par exemple, `not_collecting` indique que la taxe n’est pas collectée dans le pays ou l’État où elle serait due. L’ajout d’informations sur les [immatriculations fiscales](https://docs.stripe.com/tax/set-up.md#add-registrations) dans les paramètres de votre compte indique à Stripe où vous collectez la taxe. Si vous avez ajouté une immatriculation fiscale pour l’État de Washington, le motif d’assujettissement à la taxe affiché dans votre résultat est `standard_rated`, ce qui indique que le produit est taxé au taux standard. Développez l’attribut [tax_breakdown](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-line_items-data-tax_breakdown) du poste pour obtenir une ventilation détaillée, incluant les taxes locales et les attributs expliquant la raison de chaque taxe. - Le champ `tax_type` de[tax_rate_details](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-line_items-data-tax_breakdown-tax_rate_details) est une indication de type fiscal de haut niveau qui peut ne pas toujours correspondre au type renvoyé dans les rapports et les exportations de transactions. Par exemple, elle ne fait pas la distinction entre la taxe de vente américaine et la taxe d’utilisation américaine. - Utilisez le champ `display_name` de [tax_rate_details](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-line_items-data-tax_breakdown-tax_rate_details) dans votre tunnel de paiement pour afficher toutes les taxes. Les taxes sont localisées en fonction de l’emplacement du client et des informations fiscales du produit. Par exemple, si la TVA est appliquée pour l’Allemagne car le client se trouve en Allemagne et que le produit est taxé à destination, comme [txcd_10103001 : Software as a service (SaaS) à usage professionnel](https://docs.stripe.com/tax/tax-codes.md?tax_code=txcd_10103001), nous affichons `Umsatzsteuer (USt)`, qui est la désignation allemande de la TVA. Si la TVA est appliquée pour la France car l’adresse du siège social est définie sur la France et que le produit est taxé à l’origine, comme [txcd_20030000 : Général - Services](https://docs.stripe.com/tax/tax-codes.md?tax_code=txcd_20030000), nous affichons `Taxe sur la valeur ajoutée (TVA)`, qui est la désignation française de la TVA. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][line1]=920 5th Ave" \ -d "customer_details[address][city]=Seattle" \ -d "customer_details[address][state]=WA" \ -d "customer_details[address][postal_code]=98104" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" \ -d "expand[0]=line_items.data.tax_breakdown" ``` ```json { ... "tax_breakdown": [ { "amount": 103, "inclusive": false, "tax_rate_details": { "country": "US", "percentage_decimal": "10.25", "state": "WA", "tax_type": "sales_tax" },"taxability_reason": "standard_rated", "taxable_amount": 1000 } ], "line_items": { "object": "list", "data": [ { "id": "tax_li_O84jA8hvV7ZyAa", "object": "tax.calculation_line_item", "amount": 1000, "amount_tax": 103, "product": null, "quantity": 1, "reference": "L1", "tax_behavior": "exclusive", "tax_breakdown": [ { "amount": 65, "jurisdiction": { "country": "US", "display_name": "Washington", "level": "state", "state": "WA" }, "sourcing": "destination", "tax_rate_details": { "display_name": "Retail Sales and Use Tax", "percentage_decimal": "6.5", "tax_type": "sales_tax" },"taxability_reason": "standard_rated", "taxable_amount": 1000 }, { "amount": 0, "jurisdiction": { "country": "US", "display_name": "KING", "level": "county", "state": "WA" }, "sourcing": "destination", "tax_rate_details": null,"taxability_reason": "not_subject_to_tax", "taxable_amount": 0 }, { "amount": 22, "jurisdiction": { "country": "US", "display_name": "SEATTLE", "level": "city", "state": "WA" }, "sourcing": "destination", "tax_rate_details": { "display_name": "Local Sales and Use Tax", "percentage_decimal": "2.2", "tax_type": "sales_tax" },"taxability_reason": "standard_rated", "taxable_amount": 1000 }, { "amount": 14, "jurisdiction": { "country": "US", "display_name": "REGIONAL TRANSIT AUTHORITY", "level": "district", "state": "WA" }, "sourcing": "destination", "tax_rate_details": { "display_name": "Local Sales and Use Tax", "percentage_decimal": "1.4", "tax_type": "sales_tax" },"taxability_reason": "standard_rated", "taxable_amount": 1000 }, { "amount": 2, "jurisdiction": { "country": "US", "display_name": "SEATTLE TRANSPORTATION BENEFIT DISTRICT", "level": "district", "state": "WA" }, "sourcing": "destination", "tax_rate_details": { "display_name": "Local Sales and Use Tax", "percentage_decimal": "0.15", "tax_type": "sales_tax" },"taxability_reason": "standard_rated", "taxable_amount": 1000 } ], "tax_code": "txcd_10000000" } ], "has_more": false, "total_count": 1, "url": "/v1/tax/calculations/taxcalc_1NLoZvBUZ691iUZ4z4cTW6tQ/line_items" }, ... } ``` ## Optional: Résolution des erreurs courantes [Côté serveur] Suivez les étapes ci-dessous pour résoudre les erreurs dans votre intégration fiscale. ### Résolution des erreurs liées aux codes fiscaux non valides Si l’erreur `Code fiscal invalide` est renvoyée, consultez la liste des [Codes fiscaux des produits](https://docs.stripe.com/tax/tax-codes.md) disponibles. Suivez ensuite ces étapes pour résoudre le problème : 1. **Vérifier le code fiscal** : assurez-vous d’utiliser un code fiscal valide parmi la [liste des codes fiscaux disponibles](https://docs.stripe.com/tax/tax-codes.md). Les erreurs courantes comprennent ce qui suit : - Utilisation d’une chaîne vide ou de la valeur `null` comme code fiscal - Faute d’orthographe dans le code fiscal - Utilisation d’un code fiscal inexistant 1. **Mettez à jour votre code** : assurez-vous de passer un code fiscal valide lors de la création d’un `TaxCalculation`. Par exemple : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_code]=txcd_10000000" \ -d "customer_details[address][line1]=354 Oyster Point Blvd" \ -d "customer_details[address][city]=South San Francisco" \ -d "customer_details[address][state]=CA" \ -d "customer_details[address][postal_code]=94080" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" ``` 1. **Utiliser le code fiscal par défaut** : Stripe Tax utilise un code fiscal par défaut pour les calculs lorsqu’aucun code fiscal spécifique n’est fourni pour un produit ou dans une demande de calcul de taxe. Vous pouvez consulter et modifier la valeur par défaut dans vos paramètres fiscaux. Utilisez l’API pour mettre à jour le code fiscal par défaut : ```curl curl https://api.stripe.com/v1/tax/settings \ -u "<>:" \ -d "defaults[tax_code]=txcd_10000000" ``` 1. **Vérifier votre catalogue de produits** : si vous utilisez des codes fiscaux associés aux produits de votre catalogue Stripe, assurez-vous que ces codes sont correctement attribués à vos produits. 1. **Vérifiez les incohérences de données** : assurez-vous que le code fiscal est correctement transmis de votre base de données ou de votre interface utilisateur à votre code côté serveur qui effectue l’appel à l’API vers Stripe. Pour obtenir des calculs fiscaux plus précis, utilisez le code fiscal le plus spécifique qui s’applique à votre produit ou service. Si vous ne savez pas quel code fiscal utiliser, consultez la [documentation sur les codes fiscaux](https://docs.stripe.com/tax/tax-codes.md). Si vous continuez à rencontrer des problèmes, vérifiez la [documentation de l’API des paramètres fiscaux](https://docs.stripe.com/api/tax/settings.md). ## Collecter les numéros fiscaux des clients Il est courant d’exiger que le numéro fiscal et le nom de l’entreprise d’un client figurent sur les *factures* (Invoices are statements of amounts owed by a customer. They track the status of payments from draft through paid or otherwise finalized. Subscriptions automatically generate invoices, or you can manually create a one-off invoice). Vous pouvez utiliser le composant [Element d’identification fiscale](https://docs.stripe.com/elements/tax-id-element.md) pour collecter ces informations. Cette fonctionnalité est disponible en [version bêta publique](https://docs.stripe.com/release-phases.md). > #### Avis de non-responsabilité > > L’API Payment Intents est conçue pour collecter les numéros fiscaux des entreprises, qui peuvent avoir des formats similaires à ceux des identifiants fiscaux personnels dans certaines juridictions. Vous devez vous assurer que seuls les identifiants fiscaux des entreprises, tels que désignés pour ce champ, sont fournis lorsque vous utilisez cette fonctionnalité. ### Activer la version bêta Le composant Element d’identification fiscale avec l’API Payment Intents vous oblige à activer la version bêta du paramètre `elements_tax_id_1`. Ajoutez la version bêta à votre initialisation Stripe.js : ```javascript const stripe = Stripe('<>', { betas: ['elements_tax_id_1'], }); ``` ### Créer une CustomerSession (facultatif) Pour enregistrer les identifiants fiscaux et les réafficher aux clients récurrents, créez une [CustomerSession](https://docs.stripe.com/api/customer_sessions.md), qui fournit un accès sécurisé et temporaire aux données du client sans exposer votre clé API secrète au client. Si vous n’utilisez pas `CustomerSession`, le composant Tax ID fonctionne toujours, mais sans fonctionnalité d’enregistrement et de réaffichage. Vous pouvez utiliser [getValue](https://docs.stripe.com/js/elements_object/get_value_tax_id_element) pour lire les valeurs d’identifiant fiscal depuis le composant et les traiter manuellement. #### Customer v1 Créez ou récupérez un { % terme de glossaire="clients » %}Client{ % /glossary %} : ```curl curl https://api.stripe.com/v1/customers \ -u "<>:" \ --data-urlencode "email=customer@example.com" \ -d "name=Jenny Rosen" ``` Créer une `CustomerSession` avec le composant Tax ID activé : ```curl curl https://api.stripe.com/v1/customer_sessions \ -u "<>:" \ -H "Stripe-Version: 2026-03-25.preview" \ -d "customer={{CUSTOMER_ID}}" \ -d "components[tax_id_element][enabled]=true" \ -d "components[tax_id_element][features][tax_id_redisplay]=enabled" \ -d "components[tax_id_element][features][tax_id_save]=enabled" ``` La `CustomerSession` renvoie un `client_secret` que vous transmettrez au client. ### Créer un PaymentIntent ou un SetupIntent Créez un [PaymentIntent](https://docs.stripe.com/api/payment_intents.md) ou un [SetupIntent](https://docs.stripe.com/api/setup_intents.md) sur votre serveur. Lorsque vous utilisez `CustomerSession`, incluez le paramètre de référence du client afin d’activer la fonctionnalité d’enregistrement et de réaffichage des identifiants fiscaux : #### Customer v1 ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=1099 \ -d currency=usd \ -d "customer={{CUSTOMER_ID}}" ``` > Vous n’avez pas besoin d’inclure de paramètres spécifiques aux identifiants fiscaux lors de la création du PaymentIntent ou du SetupIntent. Le composant Tax ID gère automatiquement la collecte des identifiants fiscaux et les enregistre dans l’objet*Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments) lorsque vous utilisez une CustomerSession avec les autorisations appropriées. ### Initialiser Elements Créez une instance Elements en utilisant la `clientSecret` de votre PaymentIntent ou SetupIntent. Pour permettre l’enregistrement des numéros fiscaux d’un client et leur réaffichage pour les clients fidèles, incluez la clé `customerSessionClientSecret` : ```javascript const stripe = Stripe('<>', { betas: ['elements_tax_id_1'], }); // Fetch the clientSecret from your server const {clientSecret} = await fetch('/create-payment-intent', { method: 'POST', headers: { 'Content-Type': 'application/json' }, }).then((res) => res.json()); // Fetch the customerSessionClientSecret from your server const {customerSessionClientSecret} = await fetch('/create-customer-session', { method: 'POST', headers: { 'Content-Type': 'application/json' }, }).then((res) => res.json()); const elements = stripe.elements({ clientSecret,customerSessionClientSecret, appearance: { /* ... */ } }); ``` ### Créez et montez le composant Element d’identification fiscale Créez une instance du composant Element d’identification fiscale et intégrez-la à votre page : ```html
``` ```javascript const taxIdElement = elements.create('taxId', { visibility: 'auto', // 'auto' | 'always' | 'never' }); taxIdElement.mount('#tax-id-element'); ``` Vous pouvez personnaliser le composant Element d’identification fiscale avec des options telles que la `visibility`, les `fields`, et la `validation`. Pour en savoir plus, consulter la [documentation relative à la création de composants Element d’identification fiscale](https://docs.stripe.com/js/elements_object/create_tax_id_element). ### Utilisation avec le composant Element d’adresse (facultatif) Lorsque vous utilisez le composant Element d’identification fiscale avec le composant [Element d’adresse](https://docs.stripe.com/elements/address-element.md), Stripe détermine automatiquement le type du numéro fiscal et la visibilité des éléments en fonction de l’adresse du client. ### Finaliser le paiement Lorsque le client soumet le formulaire de paiement, appelez le paramètre [confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) ou [confirmSetup](https://docs.stripe.com/js/setup_intents/confirm_setup). Stripe inclut automatiquement les informations relatives au numéro fiscal et les sauvegarde pour le client, si le paiement réussit : ```javascript const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const {error} = await stripe.confirmPayment({ elements, confirmParams: { return_url: 'https://example.com/order/complete', }, }); if (error) { // Handle error console.error(error.message); } // Customer gets redirected to return_url if successful }); ``` Vous pouvez aussi utiliser [getValue](https://docs.stripe.com/js/elements_object/get_value_tax_id_element) du côté client pour lire les valeurs de numéro fiscal avant de soumettre le paiement. ### Tester votre intégration Dans les environnements de test, vous pouvez saisir n’importe quelle chaîne de caractères alphanumériques correspondant au format d’un type de numéro fiscal pris en charge (par exemple, `DE123456789` pour `eu_vat`). Vous trouverez une liste complète d’exemples de numéros fiscaux dans notre [guide sur les numéros fiscaux des clients](https://docs.stripe.com/billing/customer/tax-ids.md#supported-tax-id). Vous pouvez également utiliser nos [numéros fiscaux de test](https://docs.stripe.com/connect/testing.md#test-business-tax-ids) pour tester différents flux d’état de vérification. ### Validation asynchrone du numéro fiscal Lors de la confirmation ou de la configuration du paiement, Stripe vérifie que les numéros fiscaux fournis sont correctement formatés, mais pas qu’ils sont valides. C’est à vous qu’il incombe de garantir la validité des informations clients. Pour vous aider, Stripe effectue automatiquement une validation asynchrone sur les bases de données gouvernementales pour les [Numéros d’identification australiens (ABN)](https://docs.stripe.com/tax/invoicing/tax-ids.md#australian-business-numbers-abn), la [Taxe sur la valeur ajoutée en Europe](https://docs.stripe.com/tax/invoicing/tax-ids.md#european-value-added-tax-eu-vat-numbers) (TVA UE) et la [Taxe sur la valeur ajoutée du Royaume-Uni](https://docs.stripe.com/tax/invoicing/tax-ids.md#united-kingdom-value-added-tax-gb-vat-numbers) (GB TVA). En savoir plus sur les [validations que nous effectuons](https://docs.stripe.com/tax/invoicing/tax-ids.md#validation), et l’utilisation de l’état de ces vérifications. ### Validation du numéro fiscal en temps réel (Aperçu) En plus de la validation asynchrone décrite ci-dessus, vous pouvez activer la vérification synchrone en temps réel des numéros fiscaux directement dans le composant Tax ID. Lorsque cette fonctionnalité est activée, Stripe vérifie les numéros fiscaux dans les bases de données gouvernementales au fur et à mesure que votre client les saisit et affiche le résultat en ligne avant l’envoi du paiement. Stripe prend actuellement en charge la vérification en temps réel des [numéros d’entreprise australiens (ABN)](https://docs.stripe.com/tax/invoicing/tax-ids.md#australian-business-numbers-abn), des [numéros de TVA de l’Union européenne (EU VAT)](https://docs.stripe.com/tax/invoicing/tax-ids.md#european-value-added-tax-eu-vat-numbers) et des [numéros de TVA du Royaume-Uni (GB VAT).](https://docs.stripe.com/tax/invoicing/tax-ids.md#united-kingdom-value-added-tax-gb-vat-numbers) Si une base de données gouvernementale n’est pas disponible, Stripe revient à une validation synchrone du format et effectue la vérification complète de manière asynchrone. Cette fonctionnalité est en [version bêta publique](https://docs.stripe.com/release-phases.md) et nécessite la version bêta suivante : `elements_tax_id_verification_1` ```javascript const taxIdElement = elements.create('taxId', { ... verification: { taxId: { mode: 'if_supported', }, }, }); ``` Lorsque vous activez la vérification, l’événement `change` inclut le champ `verification.taxId.status`. Sa valeur peut être `pending`, `verified`, `unverified` ou `unavailable`. L’état `complete` du composant reflète le résultat de la vérification. Consultez [Créer un composant Tax ID](https://docs.stripe.com/js/elements_object/create_tax_id_element#tax_id_element_create-options-verification) et [Composant Tax ID - événement change](https://docs.stripe.com/js/element/events/on_change?type=taxIdElement#element_on_change-handler-verification) pour plus de détails. ### Types de numéros fiscaux pris en charge Le composant Element d’identification fiscale prend en charge la collecte des numéros fiscaux dans les pays et régions suivants : | Country | Enum | Description | Example | Impact in Tax Calculation* | | ------- | ---------- | --------------------------------------------------------------------------- | -------------------- | -------------------------- | | AE | ae_trn | United Arab Emirates TRN | 123456789012345 | Yes | | AL | al_tin | Albania Tax Identification Number | J12345678N | Yes | | AM | am_tin | Armenia Tax Identification Number | 02538904 | Yes | | AO | ao_tin | Angola Tax Identification Number | 5123456789 | No | | AT | eu_vat | European VAT number | ATU12345678 | Yes | | AU | au_abn | Australian Business Number (AU ABN) | 12345678912 | Yes | | AW | aw_tin | Aruba Tax Identification Number | 12345678 | Yes | | AZ | az_tin | Azerbaijan Tax Identification Number | 0123456789 | Yes | | BA | ba_tin | Bosnia and Herzegovina Tax Identification Number | 123456789012 | Yes | | BB | bb_tin | Barbados Tax Identification Number | 1123456789012 | No | | BD | bd_bin | Bangladesh Business Identification Number | 123456789-0123 | Yes | | BE | eu_vat | European VAT number | BE0123456789 | Yes | | BF | bf_ifu | Burkina Faso Tax Identification Number (Numéro d'Identifiant Fiscal Unique) | 12345678A | Yes | | BG | eu_vat | European VAT number | BG0123456789 | Yes | | BH | bh_vat | Bahraini VAT Number | 123456789012345 | Yes | | BJ | bj_ifu | Benin Tax Identification Number (Identifiant Fiscal Unique) | 1234567890123 | Yes | | BS | bs_tin | Bahamas Tax Identification Number | 123.456.789 | No | | BY | by_tin | Belarus TIN Number | 123456789 | Yes | | CA | ca_bn | Canadian BN | 123456789 | No | | CA | ca_gst_hst | Canadian GST/HST number | 123456789RT0002 | Yes | | CA | ca_pst_bc | Canadian PST number (British Columbia) | PST-1234-5678 | No | | CA | ca_pst_mb | Canadian PST number (Manitoba) | 123456-7 | No | | CA | ca_pst_sk | Canadian PST number (Saskatchewan) | 1234567 | No | | CA | ca_qst | Canadian QST number (Québec) | 1234567890TQ1234 | Yes | | CD | cd_nif | Congo (DR) Tax Identification Number (Número de Identificação Fiscal) | A0123456M | No | | CH | ch_vat | Switzerland VAT number | CHE-123.456.789 MWST | Yes | | CL | cl_tin | Chilean TIN | 12.345.678-K | Yes | | CM | cm_niu | Cameroon Tax Identification Number (Numéro d'Identifiant fiscal Unique) | M123456789000L | No | | CR | cr_tin | Costa Rican tax ID | 1-234-567890 | No | | CV | cv_nif | Cape Verde Tax Identification Number (Número de Identificação Fiscal) | 213456789 | No | | CY | eu_vat | European VAT number | CY12345678Z | Yes | | CZ | eu_vat | European VAT number | CZ1234567890 | Yes | | DE | eu_vat | European VAT number | DE123456789 | Yes | | DK | eu_vat | European VAT number | DK12345678 | Yes | | EC | ec_ruc | Ecuadorian RUC number | 1234567890001 | No | | EE | eu_vat | European VAT number | EE123456789 | Yes | | EG | eg_tin | Egyptian Tax Identification Number | 123456789 | Yes | | ES | es_cif | Spanish NIF number (previously Spanish CIF number) | A12345678 | No | | ES | eu_vat | European VAT number | ESA1234567Z | Yes | | ET | et_tin | Ethiopia Tax Identification Number | 1234567890 | Yes | | FI | eu_vat | European VAT number | FI12345678 | Yes | | FR | eu_vat | European VAT number | FRAB123456789 | Yes | | GB | eu_vat | Northern Ireland VAT number | XI123456789 | Yes | | GB | gb_vat | United Kingdom VAT number | GB123456789 | Yes | | GE | ge_vat | Georgian VAT | 123456789 | Yes | | GN | gn_nif | Guinea Tax Identification Number (Número de Identificação Fiscal) | 123456789 | Yes | | GR | eu_vat | European VAT number | EL123456789 | Yes | | HR | eu_vat | European VAT number | HR12345678912 | Yes | | HU | eu_vat | European VAT number | HU12345678 | Yes | | HU | hu_tin | Hungary tax number (adószám) | 12345678-1-23 | No | | IE | eu_vat | European VAT number | IE1234567AB | Yes | | IN | in_gst | Indian GST number | 12ABCDE3456FGZH | Yes | | IS | is_vat | Icelandic VAT | 123456 | Yes | | IT | eu_vat | European VAT number | IT12345678912 | Yes | | KE | ke_pin | Kenya Revenue Authority Personal Identification Number | P000111111A | No | | KG | kg_tin | Kyrgyzstan Tax Identification Number | 12345678901234 | No | | KH | kh_tin | Cambodia Tax Identification Number | 1001-123456789 | Yes | | KR | kr_brn | Korean BRN | 123-45-67890 | Yes | | KZ | kz_bin | Kazakhstani Business Identification Number | 123456789012 | Yes | | LA | la_tin | Laos Tax Identification Number | 123456789-000 | No | | LI | li_vat | Liechtensteinian VAT number | 12345 | Yes | | LK | lk_vat | Sri Lanka VAT number | 123456789-1234 | Yes | | LT | eu_vat | European VAT number | LT123456789123 | Yes | | LU | eu_vat | European VAT number | LU12345678 | Yes | | LV | eu_vat | European VAT number | LV12345678912 | Yes | | MA | ma_vat | Morocco VAT Number | 12345678 | Yes | | MD | md_vat | Moldova VAT Number | 1234567 | Yes | | ME | me_pib | Montenegro PIB Number | 12345678 | No | | MK | mk_vat | North Macedonia VAT Number | MK1234567890123 | Yes | | MR | mr_nif | Mauritania Tax Identification Number (Número de Identificação Fiscal) | 12345678 | No | | MT | eu_vat | European VAT number | MT12345678 | Yes | | MX | mx_rfc | Mexican RFC number | ABC010203AB9 | No | | NG | ng_tin | Nigerian Tax Identification Number | 12345678-0001 | No | | NL | eu_vat | European VAT number | NL123456789B12 | Yes | | NO | no_vat | Norwegian VAT number | 123456789MVA | Yes | | NP | np_pan | Nepal PAN Number | 123456789 | Yes | | NZ | nz_gst | New Zealand GST number | 123456789 | Yes | | OM | om_vat | Omani VAT Number | OM1234567890 | Yes | | PE | pe_ruc | Peruvian RUC number | 12345678901 | Yes | | PH | ph_tin | Philippines Tax Identification Number | 123456789012 | Yes | | PL | eu_vat | European VAT number | PL1234567890 | Yes | | PL | pl_nip | Polish NIP number | 1234567890 | No | | PT | eu_vat | European VAT number | PT123456789 | Yes | | RO | eu_vat | European VAT number | RO1234567891 | Yes | | RS | rs_pib | Serbian PIB number | 123456789 | No | | RU | ru_inn | Russian INN | 1234567891 | Yes | | RU | ru_kpp | Russian KPP | 123456789 | Yes | | SA | sa_vat | Saudi Arabia VAT | 123456789012345 | Yes | | SE | eu_vat | European VAT number | SE123456789123 | Yes | | SG | sg_gst | Singaporean GST | M12345678X | Yes | | SI | eu_vat | European VAT number | SI12345678 | Yes | | SK | eu_vat | European VAT number | SK1234567891 | Yes | | SN | sn_ninea | Senegal NINEA Number | 12345672A2 | No | | SR | sr_fin | Suriname FIN Number | 1234567890 | Yes | | TH | th_vat | Thai VAT | 1234567891234 | Yes | | TJ | tj_tin | Tajikistan Tax Identification Number | 123456789 | Yes | | TR | tr_tin | Turkish Tax Identification Number | 0123456789 | Yes | | TW | tw_vat | Taiwanese VAT | 12345678 | Yes | | TZ | tz_vat | Tanzania VAT Number | 12345678A | Yes | | UA | ua_vat | Ukrainian VAT | 123456789 | Yes | | UG | ug_tin | Uganda Tax Identification Number | 1014751879 | Yes | | UY | uy_ruc | Uruguayan RUC number | 123456789012 | Yes | | UZ | uz_tin | Uzbekistan TIN Number | 123456789 | No | | UZ | uz_vat | Uzbekistan VAT Number | 123456789012 | Yes | | ZA | za_vat | South African VAT number | 4123456789 | Yes | | ZM | zm_tin | Zambia Tax Identification Number | 1004751879 | No | | ZW | zw_tin | Zimbabwe Tax Identification Number | 1234567890 | No | \*Stripe Tax won't apply tax if this tax ID is provided, in line with the relevant laws. ### Utiliser les identifiants fiscaux dans les calculs (facultatif) Dans certains cas, comme la prestation transfrontalière de services, votre client peut être tenu de déclarer la taxe selon le principe de l’[autoliquidation](https://docs.stripe.com/tax/zero-tax.md#reverse-charges). Au lieu de percevoir la taxe, vous devez émettre une facture portant la mention « Taxe à payer selon le principe de l’autoliquidation ». Lorsque vous fournissez les [numéros fiscaux](https://docs.stripe.com/api/tax/calculations/create.md#calculate_tax-customer_details-tax_ids) de vos clients à Stripe Tax, nous déterminons automatiquement quand l’autoliquidation s’applique : ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=billing" \ -d "customer_details[tax_ids][0][type]=eu_vat" \ -d "customer_details[tax_ids][0][value]=DE123456789" ``` Si vous fournissez un numéro fiscal au format non valide, le calcul renvoie le code d’erreur `tax_id_invalid` : ## See also - [Utiliser Stripe Tax avec Connect](https://docs.stripe.com/tax/connect.md)