Introduction

Qu’est-ce qu’une API ?

Le terme API est l’abréviation d’Application Programming Interfaces, ce qui signifie interface de programmation d’applications. Il s’agit d’un ensemble de définitions et de protocoles utilisés pour développer et intégrer des logiciels.

À quoi sert cette API ?

Cette API nous permet de fournir des informations et de recueillir les données des clients de Natural Systems de manière automatisée.

Nous proposons des méthodes pour obtenir les données de catalogue, le stock, les unités de mesure, les prix et les adresses.

Nous donnons également la possibilité de modifier des données, comme les adresses, l’enregistrement de commandes ou les devis.

Comment commencer ?

Voici notre URL de base

https://api.naturalsystems.es/api

Authentification

Nous utilisons des clés API pour authentifier les requêtes.

Vous pouvez consulter, modifier et supprimer vos clés API depuis votre compte utilisateur, dans la section pour les développeurs.

Vos clés API donnent accès à une grande partie de vos informations sensibles, veillez donc à les garder bien en sécurité. Ne les exposez pas dans des espaces publics comme GitHub ni à travers des requêtes non sécurisées.

L’authentification de l’API se fait au moyen de l’en-tête HTTP Authorization via Bearer token, en utilisant comme jeton d’accès celui obtenu en exécutant la méthode /login avec votre clé API.

Rappel : toutes les requêtes doivent être effectuées en HTTPS. Si elles sont effectuées en HTTP, elles échoueront.

Besoin d’aide avec votre clé API ?

Générez une clé API depuis votre profil utilisateur

L’en-tête d’authentification doit ressembler à celui de cet exemple :

"Authorization: 
    Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk"

Erreurs

Nous utilisons les codes de réponse HTTP conventionnels pour indiquer le succès ou l’échec d’une requête à l’API.

Les codes de la plage 2xx indiquent le bon fonctionnement de l’appel.

Les codes de la plage 4xx représentent des erreurs dans les appels effectués (champs manquants, informations incorrectes, utilisateur non authentifié, etc.).

Les codes de la plage 5xx représentent une erreur dans la syntaxe JSON de l’appel ou, dans de très rares cas, une erreur de connexion avec les serveurs de Natural Systems.

En cas d’erreurs serveur 5xx, vous pouvez contacter it@naturalsystems.es en envoyant l’appel effectué et le contenu transmis, afin que nous puissions examiner le problème et chercher une solution si possible.

Résumé des codes d’erreur

200 - OK. Tout fonctionne comme prévu.

204 - OK. Tout a fonctionné correctement, mais l’appel ne doit renvoyer aucun contenu.

400 - Erreur. Erreur lors du traitement de l’appel. L’erreur concrète est renvoyée en réponse.

401 - Non autorisé. Aucune authentification correcte n’a été effectuée avant la connexion.

403 - Interdit. La clé API ne dispose pas des autorisations nécessaires pour effectuer l’appel.

413 - Corps trop volumineux. La requête dépasse 100 Ko. Découpez la liste en lots plus petits.

429 - Trop de requêtes. La limite d’utilisation a été dépassée. Attendez la réinitialisation de la fenêtre et réessayez.

500 - Erreur serveur. Quelque chose s’est mal passé : JSON mal formé ou erreur de connexion au serveur (peu fréquent)

Limites d’utilisation

Pour que le service reste stable pour tout le monde, l’API limite le nombre de requêtes par fenêtre de temps. Les limites sont larges : une intégration normale ne les atteint pas.

Pour les méthodes qui exigent un jeton, le quota appartient à votre compte et non à l’adresse IP depuis laquelle vous appelez : vous pouvez répartir l’intégration sur plusieurs serveurs sans perdre de quota, et personne partageant votre sortie internet ne peut le consommer.

Toutes les réponses contiennent les en-têtes RateLimit et RateLimit-Policy, avec le quota restant et les secondes qui restent avant la réinitialisation de la fenêtre.

En cas de dépassement, vous recevez un 429 Too Many Requests. Attendez la réinitialisation de la fenêtre —la valeur reset de l’en-tête indique combien de secondes il reste— puis réessayez. Si votre intégration a besoin d’un quota plus large, écrivez-nous à it@naturalsystems.es.

Résumé des limites

600 requêtes / 15 min - Toute l’API, comptées par adresse IP.

20 tentatives / 15 min - Login, comptées par adresse IP.

600 requêtes / 15 min - Méthodes avec jeton, comptées par compte.

60 téléchargements / heure - Exports CSV et PDF des documents, comptés par compte.

30 lots / heure - Remises par lot, comptés par compte.


En-têtes et réponse en cas de dépassement

RateLimit: limit=600, remaining=594, reset=782
RateLimit-Policy: 600;w=900

HTTP/1.1 429 Too Many Requests

{
    "errorMessage": "Too many requests. Please try again later."
}

Login

Effectue une requête d’authentification : la clé API est vérifiée et, si elle est correcte, renvoie le jeton à utiliser dans les autres méthodes.

Le jeton généré a une durée de validité de 24 h.

Endpoint :

POST /login

Méthode pour se connecter

Voici un exemple d’appel pour effectuer la connexion :

1var axios = require('axios');
2var data = JSON.stringify({"apiKey":"$2b$12$EJEMPLOdeAPIKEYnoVALIDA0123456789abcdefghijklmnopqrst"});
3 
4var config = {
5  method: 'post',
6  url: 'https://api.naturalsystems.es/api/login',
7  headers: { 
8    'Content-Type': 'application/json'
9  },
10  data : data
11};
12 
13axios(config)
14.then(function (response) {
15  console.log(JSON.stringify(response.data));
16})
17.catch(function (error) {
18  console.log(error);
19});
20

Get Catégorie

Renvoie l’arborescence complète des catégories de produits, dans le même ordre que sur le site web de Natural Systems.

L’attribut father : null définit la catégorie racine de l’arborescence, tandis que les autres indiquent la catégorie immédiatement supérieure.


Endpoint :

GET /producto/getCategoria

Le paramètre lang accepte 1 (espagnol), 2 (anglais), 3 (français) et 4 (allemand). Avec toute autre valeur, les textes sont renvoyés en espagnol.


Réponse correcte d’obtention des catégories

Voici un exemple de réponse correcte obtenue :

[
    {
        "id": 1,
        "name": "",
        "father": null,
        "position": "1"
    },
    {
        "id": 2828,
        "name": "Sustratos",
        "father": 1,
        "position": "1"
    },
   {
        "id": 3770,
        "name": "Iluminación",
        "father": 1,
        "position": "9"
    }
]

Méthode pour obtenir les catégories de Natural Systems

Voici un exemple d’appel pour obtenir l’arborescence des catégories :

1var axios = require('axios');
2var data = JSON.stringify({"lang":1});
3 
4var config = {
5  method: 'get',
6  url: 'https://api.naturalsystems.es/api/producto/getCategoria',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk', 
9    'Content-Type': 'application/json'
10  },
11  data : data
12};
13 
14axios(config)
15.then(function (response) {
16  console.log(JSON.stringify(response.data));
17})
18.catch(function (error) {
19  console.log(error);
20});
21

Get Stock

Obtient le stock des produits disponibles.


Endpoint :

GET /producto/getStock

Réponse correcte d’obtention du stock du produit

Voici un exemple de réponse correcte obtenue :

[
    {
        "itemCode": "ACCE0032",
        "stock": 99999
    },
    {
        "itemCode": "ACCE0033",
        "stock": 15
    },
    {
        "itemCode": "ACCE0034",
        "stock": 22
    },
    {
        "itemCode": "ACCE0036",
        "stock": 99999
    }
]

Méthode pour obtenir le stock du produit

Exemple d’appel :

1var axios = require('axios');
2    
3var config = {
4  method: 'get',
5  url: 'https://api.naturalsystems.es/api/producto/getStock',
6  headers: { 
7    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
8  }
9};
10
11axios(config)
12.then(function (response) {
13  console.log(JSON.stringify(response.data));
14})
15.catch(function (error) {
16  console.log(error);
17});

Get Unités de mesure

Renvoie le format de vente de chacun des produits (carton, palette, unité), avec la quantité unitaire de produit, son poids en kg et ses dimensions en cm.


Endpoint :

GET /producto/getUnidadMedida

Réponse correcte d’obtention des unités de mesure

Voici un exemple de réponse correcte obtenue :

[
    {
        "itemCode": "ABRA0004",
        "uomCode": "Unidad",
        "quantity": 1,
        "weight": 0.04,
        "width": 12,
        "height": 12,
        "length": 1,
        "volume": 144
    },
    {
        "itemCode": "ABRA0004",
        "uomCode": "Caja",
        "quantity": 50,
        "weight": 2,
        "width": 14,
        "height": 15,
        "length": 40,
        "volume": 8400
    },
    {
        "itemCode": "ABRA0004",
        "uomCode": "Palet",
        "quantity": 11200,
        "weight": 0,
        "width": 0,
        "height": 0,
        "length": 0,
        "volume": 0
    }
]

Méthode pour obtenir le format de vente du produit

Exemple d’appel :

1var axios = require('axios');
2var data = '';
3 
4var config = {
5  method: 'get',
6  url: 'https://api.naturalsystems.es/api/producto/getUnidadMedida',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
9  },
10  data : data
11};
12 
13axios(config)
14.then(function (response) {
15  console.log(JSON.stringify(response.data));
16})
17.catch(function (error) {
18  console.log(error);
19});
20

Get Prix

Obtient le tarif complet des prix du client. Ces prix incluent la remise appliquée. Le prix de vente conseillé du produit est également envoyé.


Endpoint :

GET /producto/getPrecio

Réponse correcte d’obtention du prix du produit

Voici un exemple de réponse correcte obtenue :

[
    {
        "itemCode": "ABRA0004",
        "price": 0.5,
        "pvp": 1.07
    },
    {
        "itemCode": "ABRA0005",
        "price": 0.54,
        "pvp": 1.16
    },
    {
        "itemCode": "ABRA0006",
        "price": 0.58,
        "pvp": 1.24
    }
]

Méthode pour obtenir le prix du produit

Exemple d’appel :

1var axios = require('axios');
2 
3var config = {
4  method: 'get',
5  url: 'https://api.naturalsystems.es/api/producto/getPrecio',
6  headers: { 
7    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
8  }
9};
10 
11axios(config)
12.then(function (response) {
13  console.log(JSON.stringify(response.data));
14})
15.catch(function (error) {
16  console.log(error);
17});

Get Remise sur quantité

Renvoie les paliers de remise dont bénéficient les produits en fonction de la quantité achetée. On obtient la quantité en unités, la remise appliquée, le prix final remisé et la plage de dates pendant laquelle la promotion est active.


Endpoint :

GET /producto/getDescuentoCantidad

Réponse correcte d’obtention des remises

Voici un exemple de réponse correcte obtenue :

[
    {
        "itemCode": "ACFU0046",
        "discounts": [
            {
                "quantity": 600,
                "discount": 10,
                "specialPrice": 0.14,
                "fromDate": "2019-11-26T00:00:00.000Z",
                "toDate": "2021-03-09T10:10:11.873Z"
            },
            {
                "quantity": 3000,
                "discount": 20,
                "specialPrice": 0.12,
                "fromDate": "2019-11-26T00:00:00.000Z",
                "toDate": "2021-03-09T10:10:11.873Z"
            },
            {
                "quantity": 12000,
                "discount": 30,
                "specialPrice": 0.11,
                "fromDate": "2019-11-26T00:00:00.000Z",
                "toDate": "2021-03-09T10:10:11.873Z"
            },
            {
                "quantity": 60000,
                "discount": 25,
                "specialPrice": 0.11,
                "fromDate": "2019-11-26T00:00:00.000Z",
                "toDate": "2021-03-09T10:10:11.873Z"
            }
        ]
    }
]

Méthode pour obtenir les remises sur quantité

Exemple d’appel :

1var axios = require('axios');
2 
3var config = {
4  method: 'get',
5  url: 'https://api.naturalsystems.es/api/producto/getDescuentoCantidad',
6  headers: { 
7    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
8  }
9};
10 
11axios(config)
12.then(function (response) {
13  console.log(JSON.stringify(response.data));
14})
15.catch(function (error) {
16  console.log(error);
17});

Get Catalogue CSV

Renvoie la liste complète des articles préparés pour l’importation au format CSV.


Endpoint :

GET /producto/getCsv

Le paramètre lang accepte 1 (espagnol), 2 (anglais), 3 (français) et 4 (allemand). Avec toute autre valeur, les textes sont renvoyés en espagnol.


Réponse d’obtention du catalogue

Voici un exemple de réponse correcte obtenue :

REFERENCE;PRODUCT;BRAND;TAX;STOCK;SHORT_DESCRIPTION;DESCRIPTION;IMAGES;CATEGORY_PATH;ID_CATEGORY_PATH;BASE_PRICE;PVP;WEIGHT;WIDTH;HEIGHT;DEPTH;ID_CATEGORY_DEFAULT;REFERENCE_PARENT;ATTR;ATTR2
ABRA0004;"Abrazadera Metálica Sin Fin";;21;99999;"";"";https://newapi.naturalsystems.es/p/ABRA0004/ABRA0004-00.png;Control de Clima > Conductos de ventilación;3772 > 3866;0.75;0.94;0.04;12;12;1;3866;;465
ABRA0005;"Abrazadera Metálica Sin Fin";;21;99999;"";"";https://newapi.naturalsystems.es/p/ABRA0005/ABRA0005-00.png;Control de Clima > Conductos de ventilación;3772 > 3866;0.8;1;0.01;14;14;1;3866;ABRA0004;466

Méthode pour obtenir le catalogue au format CSV

Voici un exemple d’appel pour obtenir le catalogue :

1var axios = require('axios');
2var data = JSON.stringify({"lang":1});
3 
4var config = {
5  method: 'get',
6  url: 'https://api.naturalsystems.es/api/producto/getCsv',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
9  },
10  data : data
11};
12 
13axios(config)
14.then(function (response) {
15  console.log(JSON.stringify(response.data));
16})
17.catch(function (error) {
18  console.log(error);
19});

Get Catalogue Prestashop

Renvoie la liste complète des articles préparés pour l’importation de données dans les plateformes Prestashop.


Endpoint :

GET /producto/getCsvPrestashop

Le paramètre lang accepte 1 (espagnol), 2 (anglais), 3 (français) et 4 (allemand). Avec toute autre valeur, les textes sont renvoyés en espagnol.


Réponse d’obtention du catalogue

Voici un exemple de réponse correcte obtenue :

REFERENCE;PRODUCT;BRAND;TAX;WEIGHT;STOCK;SHORT_DESCRIPTION;DESCRIPTION;IMAGES;CATEGORY_PATH;ID_CATEGORY_PATH;PRICE_CLIENTE;PVP;WIDTH;HEIGHT;DEPTH;ID_CATEGORY_DEFAULT;REFERENCE_PARENT;ATTR;ATTR2
ABRA0004;"Abrazadera Metálica Sin Fin";;21;0.04;99999;"";"";https://newapi.naturalsystems.es/p/ABRA0004/ABRA0004-00.png;Control de Clima > Conductos de ventilación;3772 > 3866;0.75;0.94;12;12;1;3866;;465
ABRA0005;"Abrazadera Metálica Sin Fin";;21;0.01;99999;"";"";https://newapi.naturalsystems.es/p/ABRA0005/ABRA0005-00.png;Control de Clima > Conductos de ventilación;3772 > 3866;0.8;1;14;14;1;3866;ABRA0004;466

Méthode pour obtenir le catalogue adapté à Prestashop

Voici un exemple d’appel pour obtenir le catalogue :

1var axios = require('axios');
2var data = JSON.stringify({"lang":1});
3 
4var config = {
5  method: 'get',
6  url: 'https://api.naturalsystems.es/api/producto/getCsvPrestashop',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
9  },
10  data : data
11};
12 
13axios(config)
14.then(function (response) {
15  console.log(JSON.stringify(response.data));
16})
17.catch(function (error) {
18  console.log(error);
19});

Get Catalogue Woocommerce

Renvoie la liste complète des articles préparés pour l’importation de données dans les plateformes Woocommerce.


Endpoint :

GET /producto/getCsvWoocommerce

Le paramètre lang accepte 1 (espagnol), 2 (anglais), 3 (français) et 4 (allemand). Avec toute autre valeur, les textes sont renvoyés en espagnol.


Réponse d’obtention du catalogue

Voici un exemple de réponse correcte obtenue :

Tipo;SKU;Nombre;Publicado;"¿Está destacado?";"Visibilidad en el catálogo";"Descripción corta";Descripción;"Día en que empieza el precio rebajado";"Día en que termina el precio rebajado";"Estado del impuesto";"Clase de impuesto";"¿En inventario?";Inventario;"Cantidad de bajo inventario";"¿Permitir reservas de productos agotados?";"¿Vendido individualmente?";"Peso (kg)";"Longitud (cm)";"Anchura (cm)";"Altura (cm)";"¿Permitir valoraciones de clientes?";"Nota de compra";"Precio rebajado";"Precio normal";Categorías;Etiquetas;"Clase de envío";Imágenes;"Límite de descargas";"Días de caducidad de la descarga";Superior;"Productos agrupados";"Ventas dirigidas";"Ventas cruzadas";URL externa";"Texto del botón";Posición;meta:Brand;"Nombre del atributo 1";"Valor(es) del atributo 1";"Atributo visible 1";"Atributo global 1";"Nombre del atributo 2";"Valor(es) del atributo 2";"Atributo visible 2";"Atributo global 2";"Nombre del atributo 3";"Valor(es) del atributo 3";"Atributo visible 3";"Atributo global 3";"Nombre del atributo 4";"Valor(es) del atributo 4";"Atributo visible 4";"Atributo global 4";"Nombre del atributo 5";"Valor(es) del atributo 5";"Atributo visible 5"
simple;ABRA0004;"Abrazadera Metálica Sin Fin";1;0;visible;"";"";0;0;taxable;;1;99999;;0;0;0.04;1;12;12;1;;;0.75;Control de Clima > Conductos de ventilación;;;https://newapi.naturalsystems.es/p/ABRA0004/ABRA0004-00.png;;;;;;;;;;;100 95mm-105mm;465;1;
simple;ABRA0005;"Abrazadera Metálica Sin Fin";1;0;visible;"";"";0;0;taxable;;1;99999;;0;0;0.01;1;14;14;1;;;0.8;Control de Clima > Conductos de ventilación;;;https://newapi.naturalsystems.es/p/ABRA0005/ABRA0005-00.png;;;;;;;;;;;125 119mm-131mm;466;1;

Méthode pour obtenir le catalogue adapté à Woocommerce

Voici un exemple d’appel pour obtenir le catalogue :

1var axios = require('axios');
2var data = JSON.stringify({"lang":1});
3 
4var config = {
5  method: 'get',
6  url: 'https://api.naturalsystems.es/api/producto/getCsvWoocommerce',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
9  },
10  data : data
11};
12 
13axios(config)
14.then(function (response) {
15  console.log(JSON.stringify(response.data));
16})
17.catch(function (error) {
18  console.log(error);
19});

Get Combinaisons

Renvoie la liste complète des combinaisons d’articles préparées pour l’importation au format CSV.


Endpoint :

GET /producto/getCsvCombinaciones

Le paramètre lang accepte 1 (espagnol), 2 (anglais), 3 (français) et 4 (allemand). Avec toute autre valeur, les textes sont renvoyés en espagnol.


Réponse d’obtention des combinaisons

Voici un exemple de réponse correcte obtenue :

ID_COMB;ITEMCODE
2707;ADNU0003
2707;ADNU0026
2707;ADNU0102
2707;ADNU0101
2708;ADNU0177
2708;ADNU0250

Méthode pour obtenir les combinaisons d’article

Voici un exemple d’appel pour obtenir les combinaisons :

1var axios = require('axios');
2var data = JSON.stringify({"lang":1});
3 
4var config = {
5  method: 'get',
6  url: 'https://api.naturalsystems.es/api/producto/getCsvCombinaciones',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
9  },
10  data : data
11};
12 
13axios(config)
14.then(function (response) {
15  console.log(JSON.stringify(response.data));
16})
17.catch(function (error) {
18  console.log(error);
19});

Get Attributs

Renvoie la liste complète des attributs d’articles préparés pour l’importation au format CSV.


Endpoint :

GET /producto/getCsvAtributos

Le paramètre lang accepte 1 (espagnol), 2 (anglais), 3 (français) et 4 (allemand). Avec toute autre valeur, les textes sont renvoyés en espagnol.


Réponse d’obtention des attributs

Voici un exemple de réponse correcte obtenue :

ID_ATTRIBUTE_GROUP;NAME_ATTRIBUTE_GROUP;ID_ATTRIBUTE;NAME_ATTRIBUTE
4;Liquidos;44;30 ml
15;Macetas;1580;24.7x24.7x26.1cm (11L)
6;Extractores;1605;3250m3/h (2 Boca Entrada 250mm - 1 Boca Salida 315mm)

Méthode pour obtenir les attributs d’article

Voici un exemple d’appel pour obtenir les attributs :

1var axios = require('axios');
2var data = JSON.stringify({"lang":1});
3 
4var config = {
5  method: 'get',
6  url: 'https://api.naturalsystems.es/api/producto/getCsvAtributos',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
9  },
10  data : data
11};
12 
13axios(config)
14.then(function (response) {
15  console.log(JSON.stringify(response.data));
16})
17.catch(function (error) {
18  console.log(error);
19});

Create Nouvelle commande

Envoie une nouvelle commande ou un devis. Les commandes directes et en dropshipping sont autorisées.


Endpoint :

POST /pedido/nuevoPedido

Objet d’exemple

{
    "isQuote": "Y",
    "isDropship": "Y",
    "shipInstructions": "C/ Ejemplo 1, 00000 Ciudad de ejemplo, España",
    "shipAddress": "Almacén de ejemplo",
    "billAddress": "Almacén de ejemplo",
    "orderIntructions": "No enviar documentación",
    "remarks": "Comentarios del pedido",
    "items": [
        {
            "itemCode": "TONE0011",
            "quantity": 80
        },
        {
            "itemCode": "LUMI0017",
            "quantity": 5
        },
        {
            "itemCode": "SUST0110",
            "quantity": 2
        }
    ]
}

Réponse correcte obtenue

Order successfully grabbed

Méthode pour créer une nouvelle commande

Exemple d’appel :

1var axios = require('axios');
2var data = JSON.stringify({"isQuote":"Y","isDropship":"Y","shipInstructions":"C/ Ejemplo 1, 00000 Ciudad de ejemplo, España","shipAddress":"Almacén de ejemplo","billAddress":"Almacén de ejemplo","orderIntructions":"No enviar documentación","remarks":"Comentarios del pedido","items":[{"itemCode":"TONE0011","quantity":80},{"itemCode":"LUMI0017","quantity":5},{"itemCode":"SUST0110","quantity":2}]});
3 
4var config = {
5  method: 'post',
6  url: 'https://api.naturalsystems.es/api/pedido/nuevoPedido',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk', 
9    'Content-Type': 'application/json'
10  },
11  data : data
12};
13 
14axios(config)
15.then(function (response) {
16  console.log(JSON.stringify(response.data));
17})
18.catch(function (error) {
19  console.log(error);
20});

Get Adresse de livraison

Obtient les adresses de livraison enregistrées dans le compte de l’utilisateur.


Endpoint :

GET /cuenta/getDireccionEnvio

Réponse correcte obtenue

[
{
        "address": "Almacén de ejemplo",
        "street": "C/ Ejemplo 1",
        "city": "Ciudad de ejemplo",
        "zipCode": "00000",
        "state": "Provincia de ejemplo",
        "country": "Provincia de ejemplo",
        "contactPerson": "Juan Ejemplo",
        "phone": "+34 6xx xx xx xx",
        "schedule": "De 9 a 14",
        "remark": "Observaciones de transporte"
    }
]

Méthode pour obtenir la ou les adresses de livraison

Exemple d’appel :

1var axios = require('axios');
2 
3var config = {
4  method: 'get',
5  url: 'https://api.naturalsystems.es/api/cuenta/getDireccionEnvio',
6  headers: { 
7    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
8  }
9};
10 
11axios(config)
12.then(function (response) {
13  console.log(JSON.stringify(response.data));
14})
15.catch(function (error) {
16  console.log(error);
17});

Create Adresse de livraison

Crée une nouvelle adresse de livraison à partir des données de l’appel.


Endpoint :

POST /cuenta/createDireccionEnvio

Objet d’exemple

1{
2    "name": "Almacén de ejemplo 2",
3    "street": "C/ Ejemplo 1",
4    "zipCode": "00000",
5    "city": "Ciudad de ejemplo",
6    "state": "Provincia de ejemplo",
7    "country": "ES",
8    "contactPerson": "Juan Ejemplo",
9    "phone": "+34 6xx xx xx xx",
10    "phoneShipping": "+34 6xx xx xx xx",
11    "shippingRemarks": "Observaciones de transporte"
12}

Réponse correcte obtenue

Address 'Almacén de ejemplo 2' created successfully.

Méthode pour créer une nouvelle adresse de livraison

Exemple d’appel :

1var axios = require('axios');
2var data = JSON.stringify({
3    "name": "Almacén de ejemplo 2",
4    "street": "C/ Ejemplo 1",
5    "zipCode": "00000",
6    "city": "Ciudad de ejemplo",
7    "state": "Provincia de ejemplo",
8    "country": "ES",
9    "contactPerson": "Juan Ejemplo",
10    "phone": "+34 6xx xx xx xx",
11    "phoneShipping": "+34 6xx xx xx xx",
12    "shippingRemarks": "Observaciones de transporte"
13});
14 
15var config = {
16  method: 'post',
17  url: 'https://api.naturalsystems.es/api/cuenta/updateDireccionEnvio',
18  headers: { 
19    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk', 
20    'Content-Type': 'application/json'
21  },
22  data : data
23  };
24 
25axios(config)
26.then(function (response) {
27  console.log(JSON.stringify(response.data));
28})
29.catch(function (error) {
30  console.log(error);
31});
32

Update Adresse de livraison

Met à jour les données d’une adresse de livraison existante. Seuls le champ « address » et les champs à mettre à jour sont obligatoires.


Endpoint :

PATCH /cuenta/updateDireccionEnvio

Réponse correcte obtenue

Address 'Almacén de ejemplo 2' updated successfully.

Méthode pour mettre à jour les données de vos adresses de livraison

Exemple d’appel :

1var axios = require('axios');
2var data = JSON.stringify({"address":"Almacén de ejemplo","country":"ES","zipCode":"","phone":"+34 6xx xx xx xx","phoneShipping":"+34 6xx xx xx xx xx "});
3 
4var config = {
5  method: 'patch',
6  url: 'https://api.naturalsystems.es/api/cuenta/updateDireccionEnvio',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk', 
9    'Content-Type': 'application/json'
10  },
11  data : data
12};
13 
14axios(config)
15.then(function (response) {
16  console.log(JSON.stringify(response.data));
17})
18.catch(function (error) {
19  console.log(error);
20});

Delete Adresse de livraison

Supprime l’adresse de livraison indiquée dans l’appel. L’adresse doit être exacte.


Endpoint :

DELETE /cuenta/deleteDireccionEnvio

Objet d’exemple

1{
2    "address": "Almacén de ejemplo"
3}

Réponse correcte obtenue

Address 'Almacén de ejemplo 2' deleted successfully.

Méthode pour supprimer une adresse de livraison

Exemple d’appel :

1var axios = require('axios');
2var data = JSON.stringify({  "address": "Almacén de ejemplo" });
3 
4var config = {
5  method: 'delete',
6  url: 'https://api.naturalsystems.es/api/cuenta/deleteDireccionEnvio',
7  headers: { 
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk', 
9    'Content-Type': 'application/json'
10  },
11  data : data
12};
13 
14axios(config)
15.then(function (response) {
16  console.log(JSON.stringify(response.data));
17})
18.catch(function (error) {
19  console.log(error);
20});

Get Adresse de facturation

Obtient les adresses de facturation enregistrées dans le compte de l’utilisateur.


Endpoint :

GET /cuenta/getDireccionFacturacion

Réponse correcte obtenue

[
    {
        "address": "Oficina de ejemplo",
        "street": "C/ Ejemplo 1",
        "city": "Ciudad de ejemplo",
        "zipCode": "00000",
        "state": "Provincia de ejemplo",
        "country": "Provincia de ejemplo"
    }
]

Méthode pour obtenir la ou les adresses de facturation

Exemple d’appel :

1var axios = require('axios');
2 
3var config = {
4  method: 'get',
5  url: 'https://api.naturalsystems.es/api/cuenta/getDireccionFacturacion',
6  headers: { 
7    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
8  }
9};
10 
11axios(config)
12.then(function (response) {
13  console.log(JSON.stringify(response.data));
14})
15.catch(function (error) {
16  console.log(error);
17});

Get Factures

Renvoie la liste des factures et des avoirs, de la plus récente à la plus ancienne.

Si vous travaillez avec les deux sociétés du groupe, la liste couvre les deux et chaque document indique laquelle dans empresa.


Endpoint :

GET /documento/getFacturas

Filtres et pagination

Tous les paramètres sont facultatifs et peuvent voyager dans la query string ou dans le corps de l’appel. Valeurs par défaut entre parenthèses.

GET /documento/getFacturas?type=invoice&dateFrom=2026-01-01&dateTo=2026-01-31&status=open&limit=50&offset=0

type            invoice | creditNote | all      (all)
empresa         1 (Natural Systems) | 2         (todas las del cliente)
dateFrom        YYYY-MM-DD
dateTo          YYYY-MM-DD
status          open | paid | all               (all)
includeCanceled true | false                    (false)
limit           1 - 200                         (50)
offset          >= 0                            (0)

Réponse correcte de la liste de documents

Voici un exemple de réponse correcte obtenue :

Le champ status vaut paid (réglée), partiallyPaid (réglée en partie), open (en attente de règlement) ou canceled (annulée). total est le nombre de documents qui répondent au filtre, pas celui de la page.

La condition de paiement arrive avec son nom et avec days, les jours ajoutés à la date de la facture ; les échéances concrètes sont dans dueDates.

{
    "error": false,
    "total": 143,
    "limit": 50,
    "offset": 0,
    "documents": [
        {
            "empresa": 1,
            "company": "NATURALSL",
            "type": "invoice",
            "docEntry": 1001,
            "docNum": 2001,
            "series": "Facturas",
            "seriesPrefix": "F",
            "docDate": "2026-01-15",
            "dueDate": "2026-02-15",
            "taxDate": "2026-01-15",
            "customerReference": "PED-0001",
            "status": "open",
            "canceled": false,
            "currency": "EUR",
            "exchangeRate": 1,
            "netAmount": 100,
            "discountPercent": 0,
            "discountAmount": 0,
            "shippingAmount": 5,
            "taxAmount": 21,
            "equivalenceSurcharge": 0,
            "withholdingTax": 0,
            "rounding": 0,
            "total": 121,
            "totalForeignCurrency": 0,
            "paidAmount": 0,
            "dueAmount": 121,
            "paymentTerms": {
                "name": "30 dias fecha factura",
                "days": 30
            },
            "paymentMethod": {
                "name": "Recibo domiciliado"
            },
            "comments": ""
        }
    ]
}

Méthode pour obtenir la liste des documents

Exemple d’appel :

1var axios = require('axios');
2
3var config = {
4  method: 'get',
5  url: 'https://api.naturalsystems.es/api/documento/getFacturas?type=invoice&limit=50',
6  headers: {
7    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
8  }
9};
10
11axios(config)
12.then(function (response) {
13  console.log(JSON.stringify(response.data));
14})
15.catch(function (error) {
16  console.log(error);
17});

Get Facture

Renvoie le détail complet d’une facture ou d’un avoir.

Le document est identifié par docEntry, l’identifiant interne renvoyé par la liste, ou par docNum, le numéro visible du document, accompagné de type (invoice par défaut, ou creditNote) et de empresa.

En plus de ce que renvoie déjà la liste, le détail ajoute les lignes, le détail des taxes et les échéances avec le montant déjà réglé de chacune.


Endpoint :

GET /documento/getFactura

Réponse correcte du détail du document

Voici un exemple de réponse correcte obtenue :

{
    "error": false,
    "document": {
        "empresa": 1,
        "company": "NATURALSL",
        "type": "invoice",
        "docEntry": 1001,
        "docNum": 2001,
        "docDate": "2026-01-15",
        "dueDate": "2026-02-15",
        "customerReference": "PED-0001",
        "status": "open",
        "currency": "EUR",
        "netAmount": 100,
        "taxAmount": 21,
        "total": 121,
        "paidAmount": 0,
        "dueAmount": 121,
        "paymentTerms": { "name": "30 dias fecha factura", "days": 30 },
        "paymentMethod": { "name": "Recibo domiciliado" },
        "documentType": "items",
        "billingAddress": "C/ Ejemplo 1\n00000 Ciudad de ejemplo\nProvincia de ejemplo",
        "billingAddressCode": "FACTURACION",
        "shippingAddress": "C/ Ejemplo 2\n00000 Ciudad de ejemplo",
        "shippingAddressCode": "ALMACEN",
        "lines": [
            {
                "lineNum": 0,
                "itemCode": "ABRA0004",
                "description": "Sustrato profesional 50 L",
                "quantity": 10,
                "unitOfMeasure": "Ud",
                "itemsPerUnit": 1,
                "listPrice": 12,
                "discountPercent": 16.67,
                "unitPrice": 10,
                "netTotal": 100,
                "netTotalForeignCurrency": 0,
                "taxCode": "S1",
                "taxPercent": 21,
                "taxAmount": 21,
                "equivalenceSurchargePercent": 0,
                "equivalenceSurcharge": 0,
                "grossTotal": 121
            }
        ],
        "taxes": [
            {
                "code": "S1",
                "rate": 21,
                "base": 100,
                "amount": 21,
                "equivalenceSurchargePercent": 0,
                "equivalenceSurcharge": 0
            }
        ],
        "dueDates": [
            {
                "installment": 1,
                "dueDate": "2026-02-15",
                "percent": 100,
                "amount": 121,
                "paidAmount": 0
            }
        ]
    }
}

Méthode pour obtenir le détail d’un document

Exemple d’appel :

1var axios = require('axios');
2
3var config = {
4  method: 'get',
5  url: 'https://api.naturalsystems.es/api/documento/getFactura?docEntry=1001&type=invoice',
6  headers: {
7    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
8  }
9};
10
11axios(config)
12.then(function (response) {
13  console.log(JSON.stringify(response.data));
14})
15.catch(function (error) {
16  console.log(error);
17});

Get PDF Facture

Télécharge le PDF de la facture ou de l’avoir.

Le document s’identifie comme dans Get Facture. La réponse est un JSON avec le PDF en base64, tel que notre ERP l’imprime : décodez-le pour l’enregistrer comme fichier.


Endpoint :

GET /documento/getFacturaPdf

Réponse correcte du PDF

{
    "error": false,
    "fileName": "invoice-2001.pdf",
    "base64": "JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ..."
}
Chaque PDF est généré à la demande, cette méthode a donc sa propre limite de 60 téléchargements par heure.

Méthode pour télécharger le PDF d’un document

Exemple d’appel :

1var axios = require('axios');
2var fs = require('fs');
3
4var config = {
5  method: 'get',
6  url: 'https://api.naturalsystems.es/api/documento/getFacturaPdf?docEntry=1001',
7  headers: {
8    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYXJkQ29kZSI6IkMwMDAwMCIsImdyb3VwQ29kZSI6MTAwLCJsaXN0TnVtIjoxLCJub0Rpc2NvdW50IjoiTiIsImRpc2NSZWwiOiJIIiwibXVlc3RyYU9jdWx0YXMiOjEsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MzEyMDAwfQ.EJEMPLOdeFIRMAnoVALIDA0123456789abcdefghijk'
9  }
10};
11
12axios(config)
13.then(function (response) {
14  // El PDF llega en base64 tal y como lo genera el ERP
15  fs.writeFileSync(response.data.fileName, Buffer.from(response.data.base64, 'base64'));
16})
17.catch(function (error) {
18  console.log(error);
19});

Collection de méthodes

Pour faciliter l’utilisation de toutes ces méthodes, nous avons créé une collection pour Postman.

Il vous suffit d’importer ce fichier, de suivre les méthodes d’authentification et de connexion et vous disposerez de toutes les données nécessaires pour effectuer les requêtes vers notre API. Ce logiciel permet également d’exporter le code nécessaire dans de nombreuses technologies.