{"id":445107,"date":"2026-10-28T11:01:26","date_gmt":"2026-10-28T10:01:26","guid":{"rendered":"https:\/\/www.kafinea.com\/documentation\/uncategorized\/api-rest-regions-fiscales\/"},"modified":"2026-10-28T12:53:51","modified_gmt":"2026-10-28T11:53:51","password":"","slug":"api-rest-regions-fiscales","status":"publish","type":"docs","link":"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/","title":{"rendered":"API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales"},"content":{"rendered":"<p>L&rsquo;API donne acc\u00e8s \u00e0 tout le param\u00e9trage de l&rsquo;\u00e9cran <strong>Calcul des taxes<\/strong> : les taxes et leur mode de calcul, les frais et leurs montants par r\u00e9gion, les r\u00e9gions fiscales, la r\u00e9gion de chaque pays, les exceptions territoriales, la proposition automatique et le testeur d&rsquo;adresse. Les contr\u00f4les sont ceux de l&rsquo;\u00e9cran : ce qu&rsquo;il refuse, l&rsquo;API le refuse avec le m\u00eame motif.<\/p>\n<p>Les trois op\u00e9rations utilisent la session de l&rsquo;<a href=\"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-introduction\/\">API REST<\/a> et sont r\u00e9serv\u00e9es aux comptes <strong>administrateurs<\/strong>.<\/p>\n<div style=\"overflow-x:auto\">\n<table>\n<thead>\n<tr>\n<th>Op\u00e9ration<\/th>\n<th>M\u00e9thode<\/th>\n<th>R\u00e9sultat<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>tax_region_configuration<\/code><\/td>\n<td>GET<\/td>\n<td>Param\u00e9trage complet et contr\u00f4les de coh\u00e9rence<\/td>\n<\/tr>\n<tr>\n<td><code>tax_region_preview<\/code><\/td>\n<td>GET<\/td>\n<td>R\u00e9gion d&rsquo;une adresse, et proposition pour un nouveau document, sans rien enregistrer<\/td>\n<\/tr>\n<tr>\n<td><code>tax_region_configure<\/code><\/td>\n<td>POST<\/td>\n<td>Une modification, valid\u00e9e puis enregistr\u00e9e en une seule fois<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Le param\u00e8tre <code>input<\/code> est un objet JSON. Les cases \u00e0 cocher (<code>enabled<\/code>, <code>active<\/code>, <code>taxable<\/code>, <code>documentTest<\/code>, <code>intravatApproved<\/code>) attendent un vrai bool\u00e9en JSON : la cha\u00eene <code>&quot;false&quot;<\/code> est refus\u00e9e.<\/p>\n<hr \/>\n<h2>1. Lire le param\u00e9trage<\/h2>\n<p><code>tax_region_configuration<\/code> ne prend aucun param\u00e8tre.<\/p>\n<pre><code class=\"language-bash\">curl 'https:\/\/apps.kafinea.com\/YourKafinea\/webservice.php?operation=tax_region_configuration&amp;sessionName=YOUR_SESSION_ID'\n<\/code><\/pre>\n<div style=\"overflow-x:auto\">\n<table>\n<thead>\n<tr>\n<th>Cl\u00e9 de <code>result.configuration<\/code><\/th>\n<th>Contenu<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>regions<\/code><\/td>\n<td>Identifiant num\u00e9rique et nom de chaque r\u00e9gion fiscale<\/td>\n<\/tr>\n<tr>\n<td><code>taxes<\/code><\/td>\n<td>Chaque taxe des articles (<code>appliesTo: product<\/code>) et des frais (<code>shipping<\/code>), inactives comprises : <code>taxId<\/code>, nom, <code>active<\/code>, mode de calcul <code>method<\/code>, type, <code>compoundOn<\/code>, taux par d\u00e9faut <code>defaultRate<\/code> et taux par r\u00e9gion <code>ratesByRegionId<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>charges<\/code><\/td>\n<td>Chaque frais de l&rsquo;onglet <strong>Frais (&amp; leurs taxes)<\/strong> : <code>chargeId<\/code>, nom, <code>format<\/code>, type, montant par d\u00e9faut <code>defaultValue<\/code>, montants par r\u00e9gion <code>valuesByRegionId<\/code>, <code>taxable<\/code> et taxes appliqu\u00e9es <code>taxIds<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>countries<\/code><\/td>\n<td>Chaque pays : identifiant, code ISO, r\u00e9gion de base, r\u00e9gions professionnelle et particulier, condition professionnelle<\/td>\n<\/tr>\n<tr>\n<td><code>rules<\/code><\/td>\n<td>Les exceptions territoriales, actives ou non, avec leur crit\u00e8re et leur priorit\u00e9<\/td>\n<\/tr>\n<tr>\n<td><code>enabled<\/code>, <code>departure_country<\/code>, <code>operation_kind<\/code>, <code>organization_ids<\/code><\/td>\n<td>La proposition automatique et son p\u00e9rim\u00e8tre<\/td>\n<\/tr>\n<tr>\n<td><code>diagnostics<\/code><\/td>\n<td><code>configurationIssues<\/code> (pays en double, exceptions qui se chevauchent, r\u00e9gion supprim\u00e9e) et <code>missingRates<\/code> (taux absents pour une r\u00e9gion utilis\u00e9e)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Les identifiants de cette r\u00e9ponse sont ceux \u00e0 renvoyer dans les modifications. Ils diff\u00e8rent d&rsquo;une instance \u00e0 l&rsquo;autre : lisez-les sur l&rsquo;instance vis\u00e9e.<\/p>\n<hr \/>\n<h2>2. Tester une adresse ou un nouveau document<\/h2>\n<p><code>tax_region_preview<\/code> re\u00e7oit l&rsquo;adresse dans <code>input<\/code> : <code>country<\/code> (code ISO, nom fran\u00e7ais ou anglais), <code>postcode<\/code> et <code>state<\/code>.<\/p>\n<pre><code class=\"language-bash\">curl -G 'https:\/\/apps.kafinea.com\/YourKafinea\/webservice.php' \\\n  --data-urlencode 'operation=tax_region_preview' \\\n  --data-urlencode 'sessionName=YOUR_SESSION_ID' \\\n  --data-urlencode 'input={&quot;country&quot;:&quot;France&quot;,&quot;postcode&quot;:&quot;97300&quot;}'\n<\/code><\/pre>\n<p>La r\u00e9ponse indique le pays reconnu, la r\u00e9gion g\u00e9ographique (<code>geography<\/code>) et la r\u00e8gle ou le pays qui l&rsquo;a choisie. Avec <code>documentTest: true<\/code>, ajoutez les faits du client et de l&rsquo;op\u00e9ration (<code>partyNature<\/code>, <code>intravatApproved<\/code>, <code>vatNumber<\/code>, <code>organizationId<\/code>, <code>operation<\/code>, <code>goodsOrServices<\/code>, <code>departureCountry<\/code>, <code>partyRegionId<\/code>) : la r\u00e9ponse contient alors la r\u00e9gion qu&rsquo;un <strong>nouveau<\/strong> document recevrait (<code>document<\/code>). Aucun fait n&rsquo;est devin\u00e9. <code>vatNumber<\/code> est le num\u00e9ro de TVA du client, une cha\u00eene JSON ; un autre type est refus\u00e9.<\/p>\n<p><code>organizationId<\/code> accepte l&rsquo;identifiant de la soci\u00e9t\u00e9 ou son nom exact (\u00e9galement via <code>organizationName<\/code>). Une soci\u00e9t\u00e9 absente, inconnue ou dont le nom est port\u00e9 par plusieurs soci\u00e9t\u00e9s est signal\u00e9e dans <code>inputIssues<\/code>, avec les soci\u00e9t\u00e9s configur\u00e9es.<\/p>\n<p>Quand le contexte de l&rsquo;op\u00e9ration ne permet pas de proposer une r\u00e9gion, <code>document.advisories<\/code> contient <code>UNSUPPORTED_TAX_CONTEXT<\/code> et <code>document.advisory_details<\/code> en pr\u00e9cise la cause :<\/p>\n<div style=\"overflow-x:auto\">\n<table>\n<thead>\n<tr>\n<th><code>cause<\/code><\/th>\n<th>Signification<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>ORGANIZATION_NOT_CONFIGURED<\/code><\/td>\n<td>La soci\u00e9t\u00e9 ne fait pas partie des soci\u00e9t\u00e9s retenues pour la s\u00e9lection automatique<\/td>\n<\/tr>\n<tr>\n<td><code>OPERATION_KIND_NOT_SUPPORTED<\/code><\/td>\n<td>L&rsquo;op\u00e9ration ne porte pas sur des biens<\/td>\n<\/tr>\n<tr>\n<td><code>DEPARTURE_COUNTRY_NOT_CONFIGURED<\/code><\/td>\n<td>Le pays de d\u00e9part du param\u00e9trage est absent ou non reconnu<\/td>\n<\/tr>\n<tr>\n<td><code>DEPARTURE_COUNTRY_UNKNOWN<\/code><\/td>\n<td>Le pays de d\u00e9part fourni est absent ou non reconnu<\/td>\n<\/tr>\n<tr>\n<td><code>DEPARTURE_COUNTRY_MISMATCH<\/code><\/td>\n<td>Le pays de d\u00e9part fourni diff\u00e8re de celui du param\u00e9trage<\/td>\n<\/tr>\n<tr>\n<td><code>MODULE_NOT_SUPPORTED<\/code><\/td>\n<td>Le document n&rsquo;est pas un document de vente<\/td>\n<\/tr>\n<tr>\n<td><code>OPERATION_NOT_SALE<\/code><\/td>\n<td>L&rsquo;op\u00e9ration n&rsquo;est pas une vente<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Chaque entr\u00e9e donne aussi la valeur re\u00e7ue (<code>actual<\/code>), la valeur attendue (<code>expected<\/code>) et un <code>message<\/code> lisible, par exemple : \u00ab La soci\u00e9t\u00e9 0 ne fait pas partie des soci\u00e9t\u00e9s configur\u00e9es pour la s\u00e9lection automatique de la r\u00e9gion : 530 (Ma soci\u00e9t\u00e9). \u00bb<\/p>\n<p>Pour essayer une modification avant de l&rsquo;enregistrer, ajoutez <code>configurationPreview<\/code> : le m\u00eame objet que celui de <code>tax_region_configure<\/code>, compl\u00e9t\u00e9 par <code>configurationKind<\/code> (<code>settings<\/code>, <code>country<\/code> ou <code>rule<\/code>).<\/p>\n<hr \/>\n<h2>3. Modifier le param\u00e9trage<\/h2>\n<p><code>tax_region_configure<\/code> re\u00e7oit <code>kind<\/code> et l&rsquo;objet <code>input<\/code> complet de la modification.<\/p>\n<div style=\"overflow-x:auto\">\n<table>\n<thead>\n<tr>\n<th><code>kind<\/code><\/th>\n<th>Effet<\/th>\n<th><code>input<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>region<\/code><\/td>\n<td>Cr\u00e9e, renomme ou supprime une r\u00e9gion<\/td>\n<td><code>{&quot;action&quot;:&quot;save&quot;,&quot;name&quot;:&quot;\u2026&quot;}<\/code> pour cr\u00e9er ; ajoutez <code>region_id<\/code> pour renommer ; <code>{&quot;action&quot;:&quot;delete&quot;,&quot;region_id&quot;:12}<\/code> pour supprimer<\/td>\n<\/tr>\n<tr>\n<td><code>tax_grid<\/code><\/td>\n<td>Remplace le taux par d\u00e9faut et les taux par r\u00e9gion d&rsquo;une taxe existante<\/td>\n<td><code>appliesTo<\/code>, <code>taxId<\/code>, <code>defaultRate<\/code>, <code>ratesByRegionId<\/code> complet, par exemple <code>{&quot;3&quot;:0,&quot;5&quot;:20}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>tax<\/code><\/td>\n<td>Cr\u00e9e une taxe, ou red\u00e9finit une taxe existante<\/td>\n<td><code>appliesTo<\/code>, <code>name<\/code>, <code>active<\/code>, <code>method<\/code> (<code>Simple<\/code>, <code>Compound<\/code> ou <code>Deducted<\/code>), <code>type<\/code> (<code>Fixed<\/code> ou <code>Variable<\/code>), <code>defaultRate<\/code>, <code>ratesByRegionId<\/code>, <code>compoundOn<\/code> ; <code>taxId<\/code> pour modifier<\/td>\n<\/tr>\n<tr>\n<td><code>tax_status<\/code><\/td>\n<td>Active ou d\u00e9sactive une taxe<\/td>\n<td><code>appliesTo<\/code>, <code>taxId<\/code>, <code>active<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>charge<\/code><\/td>\n<td>Cr\u00e9e un frais, ou red\u00e9finit un frais existant avec ses montants par r\u00e9gion<\/td>\n<td><code>name<\/code>, <code>format<\/code> (<code>Flat<\/code> ou <code>Percent<\/code>), <code>type<\/code>, <code>defaultValue<\/code>, <code>valuesByRegionId<\/code>, <code>taxable<\/code>, <code>taxIds<\/code> ; <code>chargeId<\/code> pour modifier<\/td>\n<\/tr>\n<tr>\n<td><code>charge_delete<\/code><\/td>\n<td>Supprime un frais<\/td>\n<td><code>chargeId<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>country<\/code><\/td>\n<td>Change la r\u00e9gion d&rsquo;un pays, ou de plusieurs pays \u00e0 la fois<\/td>\n<td><code>country_id<\/code>, <code>mdstaxregionid<\/code>, <code>mdsprofessionaltaxregionid<\/code>, <code>mdsindividualtaxregionid<\/code>, <code>mdsprofessionaltaxcondition<\/code> (<code>nature_only<\/code>, <code>qualified_customer<\/code> ou <code>vat_number<\/code>) ; ou <code>isocodes<\/code> avec seulement les champs \u00e0 changer (voir plus bas)<\/td>\n<\/tr>\n<tr>\n<td><code>rule<\/code><\/td>\n<td>Cr\u00e9e ou modifie une exception territoriale<\/td>\n<td><code>label<\/code>, <code>country<\/code>, <code>criterion_type<\/code> (<code>postcode_prefix<\/code>, <code>postcode_range<\/code>, <code>subdivision<\/code>), <code>criterion_value<\/code>, <code>criterion_end<\/code> pour une plage, <code>priority<\/code>, <code>active<\/code>, les trois r\u00e9gions et la condition ; <code>ruleid<\/code> pour modifier<\/td>\n<\/tr>\n<tr>\n<td><code>settings<\/code><\/td>\n<td>Active ou r\u00e8gle la proposition automatique<\/td>\n<td><code>enabled<\/code>, <code>departure_country<\/code>, <code>operation_kind<\/code> (<code>goods<\/code> pour activer), <code>organization_ids<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>french_baseline<\/code><\/td>\n<td>Ex\u00e9cute <strong>G\u00e9n\u00e9rer le param\u00e9trage fiscal France<\/strong><\/td>\n<td><code>{}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<pre><code class=\"language-bash\">curl -X POST 'https:\/\/apps.kafinea.com\/YourKafinea\/webservice.php' \\\n  -d 'operation=tax_region_configure' \\\n  -d 'sessionName=YOUR_SESSION_ID' \\\n  -d 'kind=rule' \\\n  --data-urlencode 'input={&quot;label&quot;:&quot;Canaries \u2013 Las Palmas&quot;,&quot;country&quot;:&quot;ES&quot;,&quot;criterion_type&quot;:&quot;postcode_prefix&quot;,&quot;criterion_value&quot;:&quot;35&quot;,&quot;priority&quot;:50,&quot;active&quot;:true,&quot;mdstaxregionid&quot;:5,&quot;mdsprofessionaltaxregionid&quot;:0,&quot;mdsindividualtaxregionid&quot;:0,&quot;mdsprofessionaltaxcondition&quot;:&quot;nature_only&quot;}'\n<\/code><\/pre>\n<p>Dans cet exemple, <code>5<\/code> est l&rsquo;identifiant de la r\u00e9gion \u00ab Hors UE \u00bb lu sur l&rsquo;instance. Une r\u00e9gion vaut <code>0<\/code> quand elle n&rsquo;est pas renseign\u00e9e. La r\u00e9ponse <code>{&quot;saved&quot;:true,&quot;result&quot;:{\u2026}}<\/code> donne l&rsquo;identifiant cr\u00e9\u00e9 ou modifi\u00e9 (<code>region_id<\/code>, <code>ruleid<\/code>, <code>taxId<\/code>, <code>chargeId<\/code>). Relisez ensuite le param\u00e9trage avec <code>tax_region_configuration<\/code>, puis testez quelques adresses.<\/p>\n<p>Les garanties sont celles de l&rsquo;\u00e9cran :<\/p>\n<ul>\n<li>une modification est enregistr\u00e9e en entier ou pas du tout ; la cr\u00e9ation d&rsquo;une taxe et <code>french_baseline<\/code> sont enti\u00e8rement contr\u00f4l\u00e9es avant d&rsquo;\u00e9crire ;<\/li>\n<li>une r\u00e9gion encore utilis\u00e9e par un pays, une exception, une grille de taux, un article ou un document enregistr\u00e9 est conserv\u00e9e ;<\/li>\n<li>deux exceptions actives de m\u00eame priorit\u00e9 qui peuvent viser la m\u00eame adresse sont refus\u00e9es ;<\/li>\n<li>la proposition automatique ne s&rsquo;active qu&rsquo;avec un param\u00e9trage sans incoh\u00e9rence ;<\/li>\n<li>un taux nul est un taux configur\u00e9, et une taxe fixe garde une grille vide ;<\/li>\n<li><code>french_baseline<\/code> ne compl\u00e8te que ce qui manque et ne remplace jamais une r\u00e9gion, un taux ou un pays d\u00e9j\u00e0 param\u00e9tr\u00e9. Sa r\u00e9ponse liste ce qui a \u00e9t\u00e9 cr\u00e9\u00e9 ; rejou\u00e9e, elle ne cr\u00e9e rien.<\/li>\n<\/ul>\n<p>Un refus commence par un code stable, par exemple <code>LBL_TAX_REGION_INVALID_RULE<\/code>, suivi de l&rsquo;explication affich\u00e9e par l&rsquo;\u00e9cran et, pour un objet incomplet, du champ manquant. Testez le code dans vos programmes et affichez l&rsquo;explication.<\/p>\n<p>Les r\u00e9gions sont aussi lisibles et modifiables par les <a href=\"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-operations-crud\/\">op\u00e9rations CRUD<\/a> sur le module ci-dessous, avec les m\u00eames contr\u00f4les :<\/p>\n<pre><code class=\"language-text\">elementType=MdsTaxRegion   champ : name\n<\/code><\/pre>\n<p>La condition <code>vat_number<\/code> accorde la r\u00e9gion professionnelle \u00e0 un client professionnel dont la fiche porte un num\u00e9ro de TVA d\u2019un autre pays que le pays de d\u00e9part : seuls la pr\u00e9sence d&rsquo;un chiffre et le pr\u00e9fixe de deux lettres comptent, <code>EL<\/code> d\u00e9signe la Gr\u00e8ce, un num\u00e9ro sans pr\u00e9fixe est accept\u00e9. La case <strong>Exon\u00e9ration intracommunautaire autoris\u00e9e<\/strong> coch\u00e9e sur la fiche (<code>mdsintravatapproved<\/code>) remplit aussi la condition. Sinon, la r\u00e9gion de base s&rsquo;applique avec l&rsquo;avis <code>VAT_NUMBER_MISSING<\/code>.<\/p>\n<p><strong>Plusieurs pays \u00e0 la fois.<\/strong> Avec <code>isocodes<\/code> (de 1 \u00e0 300 codes ISO de la liste des pays) au lieu de <code>country_id<\/code>, seuls les champs envoy\u00e9s sont \u00e9crits, sur chaque pays de la liste : chaque pays garde ses autres champs, si bien qu&rsquo;un pays r\u00e9gl\u00e9 \u00e0 part n&rsquo;est pas align\u00e9 sur ses voisins au-del\u00e0 de ces champs. La r\u00e9gion professionnelle s&rsquo;envoie toujours avec sa condition. Tous les pays sont \u00e9crits, ou aucun ; la r\u00e9ponse les liste dans <code>result.isocodes<\/code> et l&rsquo;historique garde une ligne par pays. Plac\u00e9 dans <code>configurationPreview<\/code>, le m\u00eame objet se teste avec <code>tax_region_preview<\/code> avant d&rsquo;\u00eatre enregistr\u00e9.<\/p>\n<pre><code class=\"language-bash\">curl -X POST 'https:\/\/apps.kafinea.com\/YourKafinea\/webservice.php' \\\n  -d 'operation=tax_region_configure' \\\n  -d 'sessionName=YOUR_SESSION_ID' \\\n  -d 'kind=country' \\\n  --data-urlencode 'input={&quot;isocodes&quot;:[&quot;BE&quot;,&quot;DE&quot;,&quot;IT&quot;],&quot;mdsprofessionaltaxregionid&quot;:6,&quot;mdsprofessionaltaxcondition&quot;:&quot;vat_number&quot;}'\n<\/code><\/pre>\n<p>La r\u00e9gion d&rsquo;un pays se modifie de pr\u00e9f\u00e9rence avec <code>kind: &quot;country&quot;<\/code> : seule cette op\u00e9ration r\u00e8gle aussi les r\u00e9gions professionnelle et particulier. Les op\u00e9rations g\u00e9n\u00e9riques sur le module des pays appliquent les m\u00eames garanties :<\/p>\n<pre><code class=\"language-text\">elementType=MdsTaxCountry   champs : countryname, isocode, mdstaxregionid, taxzone\n<\/code><\/pre>\n<ul>\n<li><code>update<\/code> et <code>revise<\/code> peuvent changer <code>mdstaxregionid<\/code> : la r\u00e9gion choisie est contr\u00f4l\u00e9e comme sur l&rsquo;\u00e9cran, et les r\u00e9gions professionnelle et particulier d\u00e9j\u00e0 r\u00e9gl\u00e9es sont conserv\u00e9es ;<\/li>\n<li>le code ISO d&rsquo;un pays ne change pas (<code>LBL_TAX_COUNTRY_ISO_IMMUTABLE<\/code>) ; la casse et les espaces sont tol\u00e9r\u00e9s ;<\/li>\n<li><code>create<\/code> n&rsquo;accepte qu&rsquo;un code ISO existant et absent de la liste (<code>LBL_TAX_COUNTRY_ISO_UNKNOWN<\/code>, <code>LBL_TAX_COUNTRY_ISO_DUPLICATE<\/code>) ;<\/li>\n<li><code>delete<\/code> est refus\u00e9 (<code>LBL_TAX_COUNTRY_DELETE_REFUSED<\/code>) : videz plut\u00f4t la correspondance du pays.<\/li>\n<\/ul>\n<p>Les taxes (<code>Tax<\/code>) et les taxes des articles (<code>ProductTaxes<\/code>) restent lisibles par <code>retrieve<\/code> et <code>query<\/code>, mais leurs op\u00e9rations g\u00e9n\u00e9riques d&rsquo;\u00e9criture sont refus\u00e9es (<code>LBL_TAX_GENERIC_WRITE_REFUSED<\/code>, <code>LBL_PRODUCT_TAXES_GENERIC_WRITE_REFUSED<\/code>) : une taxe se cr\u00e9e et se modifie avec <code>kind: &quot;tax&quot;<\/code>, <code>tax_grid<\/code> ou <code>tax_status<\/code>. La mise \u00e0 jour d&rsquo;un produit ou d&rsquo;un service par l&rsquo;API ne touche \u00e0 ses cat\u00e9gories de taxe que si elle envoie des champs de taxe (<code>tax1<\/code>, <code>tax2<\/code>\u2026) : les champs envoy\u00e9s avec une valeur deviennent alors l&rsquo;ensemble de ses cat\u00e9gories, et un champ envoy\u00e9 vide retire la cat\u00e9gorie correspondante. Sans champ de taxe, les cat\u00e9gories restent telles quelles.<\/p>\n<h3>Cr\u00e9er une taxe<\/h3>\n<p>Une taxe se cr\u00e9e avec <code>kind: &quot;tax&quot;<\/code> sans <code>taxId<\/code>. Ses r\u00e8gles sont celles du formulaire <strong>Ajouter une taxe<\/strong> :<\/p>\n<ul>\n<li>le nom est unique parmi les taxes de m\u00eame port\u00e9e, inactives comprises ;<\/li>\n<li>le mode de calcul se choisit \u00e0 la cr\u00e9ation et ne change plus ; pour en changer, cr\u00e9ez une autre taxe et d\u00e9sactivez l&rsquo;ancienne ;<\/li>\n<li>une taxe compos\u00e9e (<code>Compound<\/code>) s&rsquo;applique sur d&rsquo;autres taxes simples actives, list\u00e9es dans <code>compoundOn<\/code> ;<\/li>\n<li>une taxe d\u00e9duite (<code>Deducted<\/code>) ne concerne que les articles et reste fixe ;<\/li>\n<li>seule une taxe variable (<code>Variable<\/code>) re\u00e7oit des taux par r\u00e9gion.<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">curl -X POST 'https:\/\/apps.kafinea.com\/YourKafinea\/webservice.php' \\\n  -d 'operation=tax_region_configure' \\\n  -d 'sessionName=YOUR_SESSION_ID' \\\n  -d 'kind=tax' \\\n  --data-urlencode 'input={&quot;appliesTo&quot;:&quot;product&quot;,&quot;name&quot;:&quot;\u00c9co-participation&quot;,&quot;active&quot;:true,&quot;method&quot;:&quot;Simple&quot;,&quot;type&quot;:&quot;Fixed&quot;,&quot;defaultRate&quot;:0.5,&quot;ratesByRegionId&quot;:{},&quot;compoundOn&quot;:[]}'\n<\/code><\/pre>\n<p>La cr\u00e9ation ajoute une colonne aux lignes des documents : une taxe ne se supprime pas, elle se d\u00e9sactive avec <code>kind: &quot;tax_status&quot;<\/code>. Tous les contr\u00f4les ont lieu avant cette cr\u00e9ation. Cochez ensuite la nouvelle taxe sur les produits et services concern\u00e9s.<\/p>\n<h3>R\u00e9gler les frais par r\u00e9gion<\/h3>\n<p>Un frais variable re\u00e7oit un montant par r\u00e9gion dans <code>valuesByRegionId<\/code>, par exemple <code>{&quot;3&quot;:15,&quot;5&quot;:0}<\/code>. Le montant <code>Flat<\/code> est exprim\u00e9 dans la devise de base ; un frais <code>Percent<\/code> reste compris entre 0 et 100. Un frais taxable liste les taxes de frais actives dans <code>taxIds<\/code>.<\/p>\n<p>Comme dans l&rsquo;\u00e9cran, <code>kind: &quot;charge_delete&quot;<\/code> retire un frais des nouveaux documents ; les documents enregistr\u00e9s gardent leurs montants. Donnez un autre nom \u00e0 un nouveau frais. Rejou\u00e9e, la suppression r\u00e9pond <code>alreadyDeleted: true<\/code>.<\/p>\n<hr \/>\n<h2>4. Avec le serveur MCP et l&rsquo;Assistant<\/h2>\n<p>Le serveur MCP et l&rsquo;Assistant Kafinea utilisent ces m\u00eames op\u00e9rations, sous leurs contr\u00f4les de modification des donn\u00e9es. Une modification du param\u00e9trage ne recalcule pas les documents d\u00e9j\u00e0 enregistr\u00e9s.<\/p>\n<hr \/>\n<h2>5. R\u00e9gion fiscale d&rsquo;un document enregistr\u00e9 par l&rsquo;API<\/h2>\n<p>Les op\u00e9rations <code>create<\/code>, <code>update<\/code> et <code>revise<\/code> des devis, commandes, factures et avoirs lisent le champ <code>region_id<\/code> ainsi :<\/p>\n<div style=\"overflow-x:auto\">\n<table>\n<thead>\n<tr>\n<th><code>region_id<\/code> envoy\u00e9<\/th>\n<th>Cr\u00e9ation<\/th>\n<th>Modification avec <code>LineItems<\/code><\/th>\n<th>Modification sans <code>LineItems<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>absent<\/td>\n<td>r\u00e9gion propos\u00e9e, ou r\u00e9gion par d\u00e9faut du client, sinon aucune<\/td>\n<td>inchang\u00e9e<\/td>\n<td>inchang\u00e9e<\/td>\n<\/tr>\n<tr>\n<td><code>null<\/code><\/td>\n<td>comme absent<\/td>\n<td>r\u00e9gion retir\u00e9e<\/td>\n<td>refus\u00e9e si elle diff\u00e8re de la r\u00e9gion enregistr\u00e9e<\/td>\n<\/tr>\n<tr>\n<td><code>&quot;&quot;<\/code> ou <code>0<\/code><\/td>\n<td>absence explicite de r\u00e9gion<\/td>\n<td>absence explicite<\/td>\n<td>refus\u00e9e si elle diff\u00e8re de la r\u00e9gion enregistr\u00e9e<\/td>\n<\/tr>\n<tr>\n<td>identifiant de r\u00e9gion<\/td>\n<td>cette r\u00e9gion<\/td>\n<td>cette r\u00e9gion<\/td>\n<td>refus\u00e9e si elle diff\u00e8re de la r\u00e9gion enregistr\u00e9e<\/td>\n<\/tr>\n<tr>\n<td>autre valeur<\/td>\n<td>refus\u00e9e (<code>INVALID_ID_ATTRIBUTE<\/code>), rien n&rsquo;est enregistr\u00e9<\/td>\n<td>refus\u00e9e<\/td>\n<td>refus\u00e9e<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Le taux de chaque ligne d\u00e9pend de la r\u00e9gion : une r\u00e9gion ne change qu&rsquo;avec les lignes. Une modification sans <code>LineItems<\/code> qui change la r\u00e9gion est refus\u00e9e (<code>MANDATORY_FIELDS_MISSING<\/code>). Renvoyer la r\u00e9gion d\u00e9j\u00e0 enregistr\u00e9e, par exemple apr\u00e8s un <code>retrieve<\/code>, reste accept\u00e9 ; <code>null<\/code> et <code>0<\/code> y sont \u00e9quivalents.<\/p>\n<p>Chaque document garde sa propre r\u00e9gion : la r\u00e9gion d&rsquo;un document n&rsquo;est jamais reprise par le document enregistr\u00e9 juste apr\u00e8s dans le m\u00eame traitement.<\/p>\n<hr \/>\n<h2>R\u00e9f\u00e9rences associ\u00e9es<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.kafinea.com\/fr\/documentation\/parametrage\/la-configuration-des-taxes\/\">La configuration des taxes<\/a><\/li>\n<li><a href=\"https:\/\/www.kafinea.com\/fr\/documentation\/parametrage\/la-region-fiscale-des-documents\/\">La r\u00e9gion fiscale des documents<\/a><\/li>\n<li><a href=\"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-introduction\/\">Introduction \u00e0 l&rsquo;API REST<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;API donne acc\u00e8s \u00e0 tout le param\u00e9trage de l&rsquo;\u00e9cran Calcul des taxes : les taxes et leur mode de calcul, les frais et leurs montants par r\u00e9gion, les r\u00e9gions fiscales, la r\u00e9gion de chaque pays, les exceptions territoriales, la proposition automatique et le testeur d&rsquo;adresse. Les contr\u00f4les sont ceux de l&rsquo;\u00e9cran : ce qu&rsquo;il refuse,&#8230;<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"doc_category":[58],"doc_tag":[],"class_list":["post-445107","docs","type-docs","status-publish","hentry","doc_category-api"],"year_month":"2026-10","word_count":2438,"total_views":"1","reactions":{"happy":"0","normal":"0","sad":"0"},"author_info":{"name":"David Valminos","author_nicename":"david","author_url":"https:\/\/www.kafinea.com\/fr\/author\/david\/"},"doc_category_info":[{"term_name":"API","term_url":"https:\/\/www.kafinea.com\/fr\/documentation\/api\/"}],"doc_tag_info":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Documentation - API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales &#8226; Kafinea<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Documentation - API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales &#8226; Kafinea\" \/>\n<meta property=\"og:description\" content=\"L&rsquo;API donne acc\u00e8s \u00e0 tout le param\u00e9trage de l&rsquo;\u00e9cran Calcul des taxes : les taxes et leur mode de calcul, les frais et leurs montants par r\u00e9gion, les r\u00e9gions fiscales, la r\u00e9gion de chaque pays, les exceptions territoriales, la proposition automatique et le testeur d&rsquo;adresse. Les contr\u00f4les sont ceux de l&rsquo;\u00e9cran : ce qu&rsquo;il refuse,...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/\" \/>\n<meta property=\"og:site_name\" content=\"Kafinea\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-28T11:53:51+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/documentation\\\/api\\\/api-rest-regions-fiscales\\\/\",\"url\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/documentation\\\/api\\\/api-rest-regions-fiscales\\\/\",\"name\":\"Documentation - API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales &#8226; Kafinea\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/#website\"},\"datePublished\":\"2026-10-28T10:01:26+00:00\",\"dateModified\":\"2026-10-28T11:53:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/documentation\\\/api\\\/api-rest-regions-fiscales\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/documentation\\\/api\\\/api-rest-regions-fiscales\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/documentation\\\/api\\\/api-rest-regions-fiscales\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/\",\"name\":\"Kafinea\",\"description\":\"Une solution unique pour toutes vos ambitions\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/#organization\",\"name\":\"Kafinea\",\"url\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.kafinea.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Logo-Kafinea-SVG-orange-bleu.svg\",\"contentUrl\":\"https:\\\/\\\/www.kafinea.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Logo-Kafinea-SVG-orange-bleu.svg\",\"width\":296.31,\"height\":66.48,\"caption\":\"Kafinea\"},\"image\":{\"@id\":\"https:\\\/\\\/www.kafinea.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/kafinea\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Documentation - API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales &#8226; Kafinea","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/","og_locale":"fr_FR","og_type":"article","og_title":"Documentation - API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales &#8226; Kafinea","og_description":"L&rsquo;API donne acc\u00e8s \u00e0 tout le param\u00e9trage de l&rsquo;\u00e9cran Calcul des taxes : les taxes et leur mode de calcul, les frais et leurs montants par r\u00e9gion, les r\u00e9gions fiscales, la r\u00e9gion de chaque pays, les exceptions territoriales, la proposition automatique et le testeur d&rsquo;adresse. Les contr\u00f4les sont ceux de l&rsquo;\u00e9cran : ce qu&rsquo;il refuse,...","og_url":"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/","og_site_name":"Kafinea","article_modified_time":"2026-10-28T11:53:51+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/","url":"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/","name":"Documentation - API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales &#8226; Kafinea","isPartOf":{"@id":"https:\/\/www.kafinea.com\/fr\/#website"},"datePublished":"2026-10-28T10:01:26+00:00","dateModified":"2026-10-28T11:53:51+00:00","breadcrumb":{"@id":"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.kafinea.com\/fr\/documentation\/api\/api-rest-regions-fiscales\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.kafinea.com\/fr\/"},{"@type":"ListItem","position":2,"name":"API REST \u2013 Taxes, r\u00e9gions fiscales et r\u00e8gles territoriales"}]},{"@type":"WebSite","@id":"https:\/\/www.kafinea.com\/fr\/#website","url":"https:\/\/www.kafinea.com\/fr\/","name":"Kafinea","description":"Une solution unique pour toutes vos ambitions","publisher":{"@id":"https:\/\/www.kafinea.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.kafinea.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.kafinea.com\/fr\/#organization","name":"Kafinea","url":"https:\/\/www.kafinea.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.kafinea.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.kafinea.com\/wp-content\/uploads\/2024\/10\/Logo-Kafinea-SVG-orange-bleu.svg","contentUrl":"https:\/\/www.kafinea.com\/wp-content\/uploads\/2024\/10\/Logo-Kafinea-SVG-orange-bleu.svg","width":296.31,"height":66.48,"caption":"Kafinea"},"image":{"@id":"https:\/\/www.kafinea.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/kafinea\/"]}]}},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"David Valminos","author_link":"https:\/\/www.kafinea.com\/fr\/author\/david\/"},"uagb_comment_info":0,"uagb_excerpt":"L&rsquo;API donne acc\u00e8s \u00e0 tout le param\u00e9trage de l&rsquo;\u00e9cran Calcul des taxes : les taxes et leur mode de calcul, les frais et leurs montants par r\u00e9gion, les r\u00e9gions fiscales, la r\u00e9gion de chaque pays, les exceptions territoriales, la proposition automatique et le testeur d&rsquo;adresse. Les contr\u00f4les sont ceux de l&rsquo;\u00e9cran : ce qu&rsquo;il refuse,...","_links":{"self":[{"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/docs\/445107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/comments?post=445107"}],"version-history":[{"count":1,"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/docs\/445107\/revisions"}],"predecessor-version":[{"id":445148,"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/docs\/445107\/revisions\/445148"}],"wp:attachment":[{"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/media?parent=445107"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/doc_category?post=445107"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/www.kafinea.com\/fr\/wp-json\/wp\/v2\/doc_tag?post=445107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}