Documentation de l'API externe
Intégrez vos systèmes avec l'API EasySolar
L'intégration basée sur une clé API vous donne accès au calendrier, aux projets, aux clients et aux composants.
Cela vous offre la flexibilité nécessaire pour intégrer vos systèmes et automatiser les processus.
Documentation de l'API externe
L'intégration basée sur une clé API vous donne accès au calendrier, aux projets, aux clients et aux composants. Cela vous offre la flexibilité nécessaire pour intégrer vos systèmes et automatiser les processus.
Table des matières
- Authentification
- Pagination
- API du calendrier
- API des projets
- API des clients
- API des composants
- Conventions de données
- Comportement des filtres
- Modèle d'autorisations
- Gestion des erreurs
- Schémas d'intégration
- Stabilité et versionnement
1. Authentification
Toutes les requêtes doivent inclure une clé API dans l'en-tête de la requête.
Authorization: Api-Key <raw_api_key>
Notes : - Les clés API sont créées et gérées par les propriétaires et les administrateurs de l'entreprise. - Chaque clé est limitée à des autorisations de ressources spécifiques. - Toutes les requêtes sont automatiquement limitées à l'entreprise associée à la clé API.
Erreurs d'authentification
| Statut | Raison |
|---|---|
401 | Clé API manquante ou invalide |
401 | En-tête d'autorisation mal formé |
401 | Clé API inactive |
403 | Autorisation de ressource manquante |
402 | Entreprise inactive |
2. Pagination
Les endpoints de liste (Calendrier, Projets, Clients) utilisent une pagination limit/offset.
Paramètres
| Paramètre | Description | Par défaut | Max |
|---|---|---|---|
limit | Nombre de résultats à renvoyer | 100 | 500 |
offset | Décalage de pagination | 0 | — |
Enveloppe de réponse
{
"count": 123,
"next": null,
"previous": null,
"results": []
}
Lorsque next vaut null, vous avez atteint la dernière page.
3. API du calendrier
Représente les événements planifiés tels que les réunions, les appels et les rendez-vous d'installation. Lecture seule.
Endpoints
GET https://api-production.easysolar-app.com/integrations/calendar/
GET https://api-production.easysolar-app.com/integrations/calendar/{id}/
Autorisation requise : calendar_read
Exemple de réponse
{
"id": "7d0f4d55-3b66-4c71-a86d-2b0ef2fca6d5",
"category": "meeting",
"subject": "Visite initiale du site",
"description": "Discuter des besoins d'installation et de l'inspection de la toiture.",
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "Rue Principale 10, Varsovie",
"phone": "+48123456789",
"is_open": true
},
"participants": [
{
"first_name": "John",
"last_name": "Smith",
"email": "john.smith@example.com"
}
],
"start_at": "2026-06-15T09:00:00Z",
"end_at": "2026-06-15T10:00:00Z",
"full_day": false,
"created_at": "2026-06-01T12:30:45Z"
}
Référence des champs
| Champ | Type | Description |
|---|---|---|
id | UUID | Identifiant de l'événement |
category | string | Catégorie de l'événement (voir les valeurs ci-dessous) |
subject | string | Titre de l'événement |
description | string | Notes supplémentaires sur l'événement |
client | object | null | Client associé |
participants | array | Employés affectés à l'événement |
start_at | datetime | Heure de début de l'événement (UTC) |
end_at | datetime | Heure de fin de l'événement (UTC) |
full_day | boolean | Indique si l'événement couvre toute la journée |
created_at | datetime | Horodatage de création de l'événement |
Valeurs de catégorie
| Valeur | Description |
|---|---|
meeting | Réunion |
call | Appel téléphonique |
installation | Rendez-vous d'installation |
contract | Signature du contrat |
quotation | Présentation du devis |
Objets imbriqués
Objet client :
| Champ | Type | Description |
|---|---|---|
id | UUID | Identifiant du client |
name | string | Nom du client |
address | string | Adresse du client |
phone | string | Numéro de téléphone du client |
is_open | boolean | Statut actif du client |
Objet participant :
| Champ | Type | Description |
|---|---|---|
first_name | string | Prénom de l'employé |
last_name | string | Nom de famille de l'employé |
email | string | Adresse e-mail de l'employé |
Filtres
| Paramètre | Type | Description |
|---|---|---|
start_at_after | datetime | Filtrer les événements commençant après cette date/heure |
start_at_before | datetime | Filtrer les événements commençant avant cette date/heure |
end_at_after | datetime | Filtrer les événements se terminant après cette date/heure |
end_at_before | datetime | Filtrer les événements se terminant avant cette date/heure |
category | string (multi) | Filtrer par catégorie ; répétez pour plusieurs valeurs |
client | UUID | Filtrer par l'ID du client |
Exemple :
GET https://api-production.easysolar-app.com/integrations/calendar/?start_at_after=2026-01-01T00:00:00Z&category=meeting&category=call
Authorization: Api-Key <key>
4. API des projets
Représente les enregistrements de projets liés aux clients (p. ex. des installations photovoltaïques). Lecture seule.
Endpoints
GET https://api-production.easysolar-app.com/integrations/projects/
GET https://api-production.easysolar-app.com/integrations/projects/{id}/
Autorisation requise : projects_read
Exemple de réponse
{
"id": "d8e22cb9-1d88-4a3d-a3fd-f954d1f23d59",
"name": "Installation photovoltaïque - bureau de Varsovie",
"address": "Aleje Jerozolimskie 120, Varsovie",
"latitude": 52.2297,
"longitude": 21.0122,
"client": {
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"address": "Rue Principale 10, Varsovie",
"phone": "+48123456789",
"is_open": true
},
"status": {
"name": "En cours",
"order": 2
},
"currency": {
"code": "PLN",
"name": "złoty polonais"
},
"total_price": "42500.00",
"payback_period": 8,
"created": "2026-05-01T09:00:00Z",
"updated": "2026-06-01T15:30:00Z"
}
Référence des champs
| Champ | Type | Description |
|---|---|---|
id | UUID | Identifiant du projet |
name | string | Nom du projet |
address | string | Adresse du projet |
latitude | decimal | null | Latitude du projet |
longitude | decimal | null | Longitude du projet |
client | object | Client associé (voir Objet client) |
status | object | Statut du projet |
currency | object | Devise utilisée pour les valeurs financières |
total_price | decimal string | Prix total actuel du projet |
payback_period | integer | null | Période de retour sur investissement estimée en années |
created | datetime | Horodatage de création |
updated | datetime | Horodatage de la dernière mise à jour |
total_priceest renvoyé sous forme de chaîne décimale afin de préserver la précision.payback_periodvautnulls'il n'a pas encore été calculé.latitude/longitudevalentnullsi aucun emplacement n'est défini.
Objets imbriqués
Objet de statut :
| Champ | Type | Description |
|---|---|---|
name | string | Nom d'affichage du statut |
order | integer | Valeur d'ordre du statut |
Objet devise :
| Champ | Type | Description |
|---|---|---|
code | string | Code devise ISO |
name | string | Nom de la devise |
Filtres
| Paramètre | Type | Description |
|---|---|---|
created_after | datetime | Filtrer par date de création (borne inférieure) |
created_before | datetime | Filtrer par date de création (borne supérieure) |
updated_after | datetime | Filtrer par date de mise à jour (borne inférieure) |
updated_before | datetime | Filtrer par date de mise à jour (borne supérieure) |
client | UUID | Filtrer par l'ID du client |
status | UUID | Filtrer par l'ID du statut |
name | string | Correspondance partielle du nom, insensible à la casse |
Exemple :
GET https://api-production.easysolar-app.com/integrations/projects/?client=<id>&name=solar
Authorization: Api-Key <key>
5. API des clients
Représente des entités clientes. Prend en charge les opérations de lecture et d'écriture.
Endpoints
GET https://api-production.easysolar-app.com/integrations/clients/
POST https://api-production.easysolar-app.com/integrations/clients/
GET https://api-production.easysolar-app.com/integrations/clients/{id}/
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/
Autorisations requises : clients_read (lecture), clients_write (écriture)
Exemple de réponse
{
"id": "4ab8e7cb-0a27-48f1-a0f6-6d6ecf5d8c6a",
"name": "Solar Corp",
"description": "Client commercial intéressé par une installation photovoltaïque en toiture.",
"address": "Rue Principale 10, Varsovie",
"latitude": 52.2297,
"longitude": 21.0122,
"phone": "+48123456789",
"is_open": true,
"created": "2026-05-01T10:15:00Z",
"updated": "2026-06-01T08:45:30Z"
}
Référence des champs
| Champ | Type | Description |
|---|---|---|
id | UUID | Identifiant du client |
name | string | Nom du client |
description | string | Notes supplémentaires |
address | string | Adresse du client |
latitude | decimal | null | Latitude du client |
longitude | decimal | null | Longitude du client |
phone | string | null | Numéro de téléphone du client |
is_open | boolean | Indique si le client est actuellement actif |
created | datetime | Horodatage de création |
updated | datetime | Horodatage de la dernière mise à jour |
Créer un client
POST https://api-production.easysolar-app.com/integrations/clients/
{
"name": "Nom du client",
"description": "Client commercial",
"address": "Adresse",
"phone": "+48123456789",
"latitude": 52.2297,
"longitude": 21.0122
}
Mettre à jour le client
PATCH https://api-production.easysolar-app.com/integrations/clients/{id}/
N'incluez que les champs que vous souhaitez mettre à jour :
{
"address": "Nouvelle adresse 15, Varsovie",
"phone": "+48987654321"
}
Règles relatives aux coordonnées
latitudeetlongitudedoivent toujours être fournies ensemble.- Le fait de fournir une seule coordonnée entraîne une erreur de validation.
- Si aucun emplacement n'est défini, les deux champs sont renvoyés à
null.
Filtres
| Paramètre | Type | Description |
|---|---|---|
created_after | datetime | Filtrer par date de création (borne inférieure) |
created_before | datetime | Filtrer par date de création (borne supérieure) |
updated_after | datetime | Filtrer par date de mise à jour (borne inférieure) |
updated_before | datetime | Filtrer par date de mise à jour (borne supérieure) |
is_open | boolean | Filtrer par statut actif (true ou false) |
name | string | Correspondance partielle du nom, insensible à la casse |
phone | string | Correspondance partielle du numéro de téléphone, insensible à la casse |
6. API des composants
Crée des composants à utiliser dans les projets. Écriture seule.
Endpoint
POST https://api-production.easysolar-app.com/integrations/components/
Autorisation requise : components_write
Types de composants
Trois types de composants sont pris en charge : panel, inverter et other.
Panneau
{
"type": "panel",
"manufacturer_name": "Longi",
"name": "LR5-54HPH",
"net_unit_price": "120.00",
"nominal_power": "430.000",
"length": "1.7220",
"width": "1.1340",
"weight": "21.500",
"efficiency": "0.2100000",
"short_circuit_current": "13.52000",
"open_circuit_voltage": "37.85000",
"current_temperature_coefficient": "0.045000",
"voltage_temperature_coefficient": "-0.280000",
"power_temperature_coefficient": "-0.350000"
}
| Champ | Type | Requis | Description |
|---|---|---|---|
type | string | Oui | Doit être "panel" |
manufacturer_name | string | Oui | Nom du fabricant |
name | string | Oui | Nom du modèle du panneau |
net_unit_price | decimal | Non | Prix unitaire net |
nominal_power | decimal | Oui | Puissance nominale (W) |
length | decimal | Oui | Longueur du panneau (m) |
width | decimal | Oui | Largeur du panneau (m) |
weight | decimal | null | Non | Poids (kg) |
efficiency | decimal | Oui | Rendement de conversion |
short_circuit_current | decimal | Oui | Courant de court-circuit (A) |
open_circuit_voltage | decimal | Oui | Tension à vide (V) |
current_temperature_coefficient | decimal | null | Non | Coefficient de température du courant |
voltage_temperature_coefficient | decimal | null | Non | Coefficient de température de la tension |
power_temperature_coefficient | decimal | null | Non | Coefficient de température de la puissance |
Onduleur
{
"type": "inverter",
"manufacturer_name": "SMA",
"name": "Sunny Tripower 5.0",
"net_unit_price": "900.00",
"nominal_power": "5000.000",
"number_of_dc_inputs": 2
}
| Champ | Type | Requis | Description |
|---|---|---|---|
type | string | Oui | Doit être "inverter" |
manufacturer_name | string | Oui | Nom du fabricant |
name | string | Oui | Nom du modèle de l'onduleur |
net_unit_price | decimal | Non | Prix unitaire net |
nominal_power | decimal | Oui | Puissance nominale (W) |
number_of_dc_inputs | integer | Oui | Nombre d'entrées DC |
Autre
{
"type": "other",
"name": "Système de montage",
"unit": "pcs",
"net_unit_price": "50.00"
}
| Champ | Type | Requis | Description |
|---|---|---|---|
type | string | Oui | Doit être "other" |
name | string | Oui | Nom du composant |
unit | string | Non | Unité de mesure |
net_unit_price | decimal | Non | Prix unitaire net |
Réponse
{
"id": "uuid",
"type": "panel | inverter | other",
"name": "string"
}
Notes
- Les fabricants sont créés automatiquement s'ils n'existent pas.
- L'unicité des fabricants est limitée à chaque entreprise.
- Tous les champs spécifiques aux panneaux sont validés avant la création.
7. Conventions de données
Identifiants
Tous les identifiants de ressources sont des chaînes UUID, stables et globalement uniques au sein d'une entreprise :
"id": "550e8400-e29b-41d4-a716-446655440000"
Horodatages
Tous les champs datetime sont renvoyés au format ISO 8601, toujours en UTC :
"created": "2026-06-09T12:34:56Z"
Géolocalisation
Les coordonnées s'appliquent aux clients et aux projets. Elles sont stockées sous forme de point géographique et renvoyées sous forme de champs séparés :
"latitude": 52.2297,
"longitude": 21.0122
Gestion des valeurs nulles
Les champs qui ne sont pas définis sont renvoyés comme null — ils ne sont jamais omis de la réponse.
8. Comportement des filtres
Règles générales
- Tous les filtres sont facultatifs sauf indication contraire.
- Plusieurs filtres sont combinés avec une logique ET.
- Les valeurs de filtre multi-sélection (p. ex.
category) utilisent une logique OU en interne. - Les valeurs de filtre invalides renvoient des résultats vides ou une erreur de validation selon le type de champ.
Filtres de plage de dates
Disponibles sur l'ensemble des endpoints :
| Champs de filtre | Comportement |
|---|---|
created_after / created_before | Filtre de plage sur l'horodatage de création |
updated_after / updated_before | Filtre de plage sur l'horodatage de dernière mise à jour |
start_at_after / start_at_before | Filtre de plage sur l'heure de début de l'événement |
end_at_after / end_at_before | Filtre de plage sur l'heure de fin de l'événement |
Filtres de recherche textuelle
Correspondance partielle, insensible à la casse, sur name et phone :
?name=solar
Correspond à : "Solar Corp", "Mon projet photovoltaïque", etc.
9. Modèle d'autorisations
Les autorisations des clés API sont configurées indépendamment pour chaque ressource :
| Ressource | Autorisation de lecture | Autorisation d'écriture |
|---|---|---|
| Calendrier | calendar_read | (non pris en charge) |
| Projets | projects_read | (non pris en charge) |
| Clients | clients_read | clients_write |
| Composants | (non pris en charge) | components_write |
10. Gestion des erreurs
Format des erreurs
Erreur générale :
{
"detail": "Message d'erreur"
}
Erreur de validation au niveau du champ :
{
"field_name": ["Message d'erreur"]
}
Référence des erreurs
| Statut | Catégorie | Signification |
|---|---|---|
401 | Authentification | Clé API invalide, manquante ou inactive ; en-tête mal formé |
402 | Entreprise | L'entreprise est inactive |
403 | Autorisation | La clé API ne dispose pas de l'autorisation requise pour la ressource |
4xx | Validation | Les erreurs au niveau du champ sont renvoyées sous forme d'objet |
Liste de vérification d'intégration
Si vous rencontrez des erreurs, vérifiez :
- La clé API dispose des autorisations correctes pour la ressource.
- Le compte de l'entreprise est actif.
- Toutes les valeurs de filtre (ID, etc.) appartiennent au même périmètre d'entreprise.
11. Schémas d'intégration
Stratégie de synchronisation
L'approche recommandée pour synchroniser les données :
- Récupérez l'endpoint de liste (avec pagination).
- Stockez
idcomme référence externe. - Utilisez le champ
updatedpour les synchronisations incrémentales.
Gestion de la pagination
Parcourez les pages en incrémentant le décalage jusqu'à ce que next soit null :
GET https://api-production.easysolar-app.com/integrations/clients/?limit=100&offset=0
GET https://api-production.easysolar-app.com/integrations/clients/?limit=100&offset=100
Synchronisation incrémentale
Utilisez des filtres de date pour récupérer uniquement les enregistrements modifiés depuis votre dernière synchronisation :
GET https://api-production.easysolar-app.com/integrations/projects/?updated_after=2026-01-01T00:00:00Z
Bonnes pratiques de filtrage
- Privilégiez les filtres basés sur l'ID (
client,status) plutôt que les recherches textuelles pour les synchronisations à fort volume. - Combinez plusieurs filtres pour réduire la taille du jeu de résultats.
- Évitez les recherches textuelles trop larges sur les grands ensembles de données.
12. Stabilité et versionnement
Garanties stables
Les éléments suivants ne changeront pas sans migration versionnée :
- URLs des endpoints
- Noms des champs
- Format UUID
- Structure de pagination
- Schéma d'authentification
Susceptible de changer (sans rupture)
- Filtres facultatifs (de nouveaux filtres peuvent être ajoutés)
- Enrichissement des réponses (de nouveaux champs peuvent être ajoutés)
Politique de versionnement
Aucune version explicite n'est actuellement exposée dans l'URL. Les modifications incompatibles introduiront un nouvel espace de noms d'endpoint :
https://api-production.easysolar-app.com/integrations/v2/...
Les changements additifs sont considérés comme sans rupture et peuvent être déployés sans changement de version.
Fin de la documentation
Contactez-nous
Besoin d'aide ?
N'hésitez pas à nous contacter et notre équipe dédiée répondra rapidement à vos demandes.
Vendez automatiquement avec l'IA
Créez un commercial IA automatisé en 2 minutes
Ajoutez le générateur de devis photovoltaïques par IA à votre site web actuel. Définissez vos prix, choisissez vos produits et personnalisez l'image de marque de votre entreprise. Vos clients recevront un devis instantané, et vous recevrez une notification e-mail immédiate pour chaque devis et chaque client intéressé.



