L’API Partenaire SunTrace3D vous permet de générer des modèles 3D HD de villes, de calculer le rendement énergétique solaire et d’intégrer des visualiseurs 3D interactifs sur votre site web. Tous les points de terminaison utilisent JSON et les méthodes HTTP standard.
Afficher en Markdown (lisible par machine)L’API SunTrace3D est un service RESTful pour l’accès programmatique à la génération de modèles 3D de villes et aux calculs d’énergie solaire. L’API est conçue pour les partenaires qui souhaitent intégrer l’analyse solaire dans leurs propres applications, sites web ou flux de travail.
https://suntrace3d.com/api/v1/api/v1/modelsGénérer un nouveau modèle 3D HD/api/v1/models/:idVérifier l’état de la génération du modèle/api/solar/calculateCalculer le rendement énergétique solaire/embedVisualiseur 3D intégrable (iframe)/api/healthVérification de santé (aucune authentification requise)
Toutes les requêtes API nécessitent une authentification via un token Bearer dans l’en-tête Authorization. Les clés API sont gérées via le Portail Partenaire.
curl -H "Authorization: Bearer st_live_abc123def456..." \
https://suntrace3d.com/api/v1/modelsN’exposez jamais votre clé API dans du JavaScript côté client, des dépôts publics ou du code front-end. Si votre clé est compromise, révoquez-la immédiatement depuis le Portail Partenaire et créez-en une nouvelle.
Demandez la génération d’un modèle 3D HD de ville pour un emplacement géographique spécifique. Le modèle est généré de manière asynchrone — interrogez le point de terminaison de statut pour vérifier quand il est prêt.
/api/v1/modelslatitudenumberrequiredLatitude du point central (-90 à 90)longitudenumberrequiredLongitude du point central (-180 à 180)radiusKmnumberRayon de la zone à modéliser en km (par défaut : 0,3)idstringrequiredIdentifiant unique du modèle pour l’interrogation de statutstatusstringrequired"pending" | "processing" | "ready" | "failed"modelUrlstringURL du fichier modèle GLB (quand prêt)progressnumberProgression de la génération 0–100 (en cours de traitement)stepstringDescription de l’étape de génération en courscurl -X POST https://suntrace3d.com/api/v1/models \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"latitude": 44.8699,
"longitude": 13.8420,
"radiusKm": 0.3
}'{
"id": "hd_44.8699_13.8420_0.3",
"status": "pending"
}{
"id": "hd_44.8699_13.8420_0.3",
"status": "ready",
"modelUrl": "https://s3.eu-central-1.amazonaws.com/suntrace-models/hd_44.8699_13.8420_0.3/scene.glb"
}Si un modèle pour le même emplacement et rayon a déjà été généré, l’API retourne immédiatement le résultat mis en cache avec status: "ready". Les modèles sont mis en cache dans S3 pendant 30 jours. Les résultats mis en cache ne sont pas facturés.

Interrogez ce point de terminaison pour vérifier l’état d’une demande de génération de modèle. Le modèle passe par plusieurs étapes : pending → processing → ready.
/api/v1/models/:idcurl https://suntrace3d.com/api/v1/models/hd_44.8699_13.8420_0.3 \
-H "Authorization: Bearer YOUR_API_KEY"{
"id": "hd_44.8699_13.8420_0.3",
"status": "processing",
"progress": 65,
"step": "Generating textures..."
}{
"id": "hd_44.8699_13.8420_0.3",
"status": "ready",
"modelUrl": "https://s3.eu-central-1.amazonaws.com/suntrace-models/hd_44.8699_13.8420_0.3/scene.glb",
"progress": 100,
"step": null
}Nous recommandons d’interroger toutes les 5 à 10 secondes. Les temps de génération typiques sont de 30 à 120 secondes selon la taille de la zone et la charge du serveur. Le champ progress fournit un pourcentage (0–100) pour afficher un indicateur de progression dans votre interface.
Calculez le rendement énergétique solaire annuel pour une configuration de panneau et un emplacement spécifiques. Ce point de terminaison utilise les données satellite PVGIS (Photovoltaic Geographical Information System) pour des valeurs d’irradiance précises.
/api/solar/calculatelatitudenumberrequiredLatitude de l’emplacementlongitudenumberrequiredLongitude de l’emplacementtiltDegnumberrequiredAngle d’inclinaison du panneau en degrés (0–90)azimuthDegnumberrequiredAzimut du panneau en degrés (0=Nord, 180=Sud)panelAreaM2numberrequiredSurface totale des panneaux en mètres carréspanelEfficiencynumberrequiredRendement du panneau (0,0–1,0, typiquement 0,18–0,22)shadingLossFractionnumberFacteur de perte d’ombrage (0,0–1,0, par défaut : 0)annualYieldKwhnumberrequiredRendement énergétique annuel estimé en kWhpeakPowerKwnumberrequiredPuissance de crête en kWspecificYieldnumberrequiredRendement spécifique en kWh/kWpmonthlyKwhnumber[]requiredTableau de 12 valeurs kWh mensuellessourcestringrequiredIdentifiant de la source de données ("pvgis")curl -X POST https://suntrace3d.com/api/solar/calculate \
-H "Content-Type: application/json" \
-d '{
"latitude": 44.8699,
"longitude": 13.8420,
"tiltDeg": 35,
"azimuthDeg": 180,
"panelAreaM2": 20,
"panelEfficiency": 0.20,
"shadingLossFraction": 0.05
}'{
"annualYieldKwh": 4982,
"peakPowerKw": 4.0,
"specificYield": 1246,
"monthlyKwh": [248, 305, 412, 465, 522, 548, 562, 530, 445, 368, 280, 232],
"source": "pvgis"
}Le point de terminaison de calcul solaire est accessible publiquement et ne nécessite pas de clé API. Il utilise l’API publique PVGIS maintenue par le Centre commun de recherche de la Commission européenne.

Intégrez un visualiseur solaire 3D interactif sur votre site web à l’aide d’un iframe. Le visualiseur intégré inclut des commandes temporelles pour la simulation d’ombres et fonctionne sur ordinateur et mobile.
latnumberrequiredLatitude de l’emplacement à afficherlngnumberrequiredLongitude de l’emplacement à afficherkeystringrequiredVotre clé API pour l’authentification<iframe
src="https://suntrace3d.com/embed?lat=44.8699&lng=13.8420&key=YOUR_API_KEY"
width="100%"
height="500"
frameborder="0"
allow="fullscreen"
style="border-radius: 12px; border: 1px solid #e5e7eb;">
</iframe><div style="position: relative; width: 100%; padding-bottom: 56.25%; overflow: hidden; border-radius: 12px;">
<iframe
src="https://suntrace3d.com/embed?lat=44.8699&lng=13.8420&key=YOUR_API_KEY"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none;"
allow="fullscreen">
</iframe>
</div>
L’API impose des limites de débit pour garantir une utilisation équitable et la stabilité du système.
{
"error": "Rate limit exceeded. Maximum 10 generations per hour."
}L’API utilise les codes de statut HTTP standard. Toutes les réponses d’erreur incluent un corps JSON avec un champ error décrivant le problème.
{
"error": "latitude and longitude are required"
}{
"error": "Invalid or revoked API key"
}Le support des webhooks pour les notifications de fin de génération de modèles est prévu pour une version future. Actuellement, utilisez l’interrogation sur le point de terminaison de statut pour vérifier quand les modèles sont prêts.
Les callbacks webhook enverront une requête POST à votre URL spécifiée lorsque la génération du modèle sera terminée, éliminant le besoin d’interrogation. Cette fonctionnalité est dans notre feuille de route.
Exemples complets, à copier-coller, pour les scénarios d’intégration courants.
#!/bin/bash
API_KEY="YOUR_API_KEY"
BASE_URL="https://suntrace3d.com"
# 1. Request model generation
echo "Requesting model generation..."
RESPONSE=$(curl -s -X POST "$BASE_URL/api/v1/models" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"latitude": 44.8699, "longitude": 13.8420, "radiusKm": 0.3}')
MODEL_ID=$(echo $RESPONSE | jq -r '.id')
STATUS=$(echo $RESPONSE | jq -r '.status')
echo "Model ID: $MODEL_ID (status: $STATUS)"
# 2. Poll until ready
while [ "$STATUS" != "ready" ] && [ "$STATUS" != "failed" ]; do
sleep 5
RESPONSE=$(curl -s "$BASE_URL/api/v1/models/$MODEL_ID" \
-H "Authorization: Bearer $API_KEY")
STATUS=$(echo $RESPONSE | jq -r '.status')
PROGRESS=$(echo $RESPONSE | jq -r '.progress // 0')
echo "Status: $STATUS ($PROGRESS%)"
done
# 3. Get the model URL
if [ "$STATUS" = "ready" ]; then
MODEL_URL=$(echo $RESPONSE | jq -r '.modelUrl')
echo "Model ready: $MODEL_URL"
else
echo "Generation failed"
ficonst API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://suntrace3d.com';
async function generateModel(lat, lng) {
// 1. Request generation
const res = await fetch(`${BASE_URL}/api/v1/models`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ latitude: lat, longitude: lng }),
});
const { id, status, modelUrl } = await res.json();
// If already cached, return immediately
if (status === 'ready') return { id, modelUrl };
// 2. Poll until ready
return pollStatus(id);
}
async function pollStatus(modelId) {
while (true) {
await new Promise(r => setTimeout(r, 5000)); // Wait 5s
const res = await fetch(`${BASE_URL}/api/v1/models/${modelId}`, {
headers: { 'Authorization': `Bearer ${API_KEY}` },
});
const data = await res.json();
console.log(`Status: ${data.status} (${data.progress || 0}%)`);
if (data.status === 'ready') return data;
if (data.status === 'failed') throw new Error('Generation failed');
}
}
// Usage
generateModel(44.8699, 13.8420)
.then(data => console.log('Model URL:', data.modelUrl))
.catch(err => console.error(err));import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://suntrace3d.com"
def generate_model(lat: float, lng: float) -> dict:
"""Generate an HD 3D model and wait for completion."""
# Request generation
res = requests.post(
f"{BASE_URL}/api/v1/models",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"latitude": lat, "longitude": lng, "radiusKm": 0.3},
)
data = res.json()
if data["status"] == "ready":
return data
# Poll until ready
model_id = data["id"]
while True:
time.sleep(5)
res = requests.get(
f"{BASE_URL}/api/v1/models/{model_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
)
data = res.json()
print(f"Status: {data['status']} ({data.get('progress', 0)}%)")
if data["status"] == "ready":
return data
if data["status"] == "failed":
raise Exception("Generation failed")
def calculate_solar(lat: float, lng: float, tilt: float = 35, azimuth: float = 180) -> dict:
"""Calculate solar energy yield for a panel configuration."""
res = requests.post(
f"{BASE_URL}/api/solar/calculate",
json={
"latitude": lat,
"longitude": lng,
"tiltDeg": tilt,
"azimuthDeg": azimuth,
"panelAreaM2": 20,
"panelEfficiency": 0.20,
},
)
return res.json()
# Usage
model = generate_model(44.8699, 13.8420)
print(f"Model URL: {model['modelUrl']}")
solar = calculate_solar(44.8699, 13.8420)
print(f"Annual yield: {solar['annualYieldKwh']} kWh")
print(f"Monthly: {solar['monthlyKwh']}")
Consultez le Guide utilisateur pour une présentation complète du visualiseur 3D, de la simulation d’ombres et des fonctionnalités d’analyse de panneaux solaires.
Guide utilisateur