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.
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']}")
Les agents AI (chatbots, assistants virtuels) peuvent créer des sessions pour rediriger les utilisateurs vers SunTrace3D avec des paramètres Solar Wizard préconfigurés et une détection automatique optionnelle du toit. Le modèle 3D est généré lorsque l'utilisateur ouvre le lien (~1-2 minutes).
/api/mcp-sessionsCreate agent session with wizard params/api/mcp-sessions/:idCheck session & model status/api/mcp-sessionsagentNamestringrequiredIdentifiant de l’agent (requis)latitudenumberrequiredLocation center latitudelongitudenumberrequiredLocation center longitudewizardGoalstringPréréglage de l’objectif du wizardwizardKwhnumberkWh mensuels pour cover_billroofLatnumberLatitude du toit pour le clic automatiqueroofLngnumberLongitude du toit pour le clic automatique{
"agentName": "ChatGPT",
"latitude": 44.8699,
"longitude": 13.8420,
"wizardGoal": "cover_bill",
"wizardKwh": 350,
"roofLat": 44.8701,
"roofLng": 13.8418
}{
"sessionId": "clxyz...",
"viewerUrl": "https://suntrace3d.com/viewer?session=clxyz...&lat=44.869900&lng=13.842000&wizard=cover_bill&wizardKwh=350&roofLat=44.8701000&roofLng=13.8418000",
"status": "created",
"modelStatus": "not_generated",
"agentName": "ChatGPT"
}No pre-generation: Agent sessions do not trigger model generation. The 3D model generates when the user opens the viewer link (~1-2 minutes, loading animation shown). Pro users automatically get HD quality; free users get SD.
wizardstringPrésélectionner l’objectif du wizardwizardKwhnumberkWh mensuels pour cover_billroofLatnumberLatitude du toit pour clic automatiqueroofLngnumberLongitude du toit pour clic automatiquesessionstringID de session MCP (inclus automatiquement par l’API)import requests
def create_solar_link(lat, lng, roof_lat=None, roof_lng=None, monthly_kwh=None):
"""Create an agent session and return the viewer URL."""
payload = {
"agentName": "MySolarBot",
"latitude": lat,
"longitude": lng,
"wizardGoal": "cover_bill" if monthly_kwh else "maximize_energy",
}
if monthly_kwh:
payload["wizardKwh"] = monthly_kwh
if roof_lat is not None and roof_lng is not None:
payload["roofLat"] = roof_lat
payload["roofLng"] = roof_lng
res = requests.post("https://suntrace3d.com/api/mcp-sessions", json=payload)
res.raise_for_status()
return res.json()["viewerUrl"]
# Usage — send this link to the user
url = create_solar_link(
lat=44.8699, lng=13.8420,
roof_lat=44.8701, roof_lng=13.8418,
monthly_kwh=350,
)
print(f"Send this to your user: {url}")
# User clicks -> model generates (~1-2 min) -> wizard auto-opens -> panels placedConsultez 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