v1STABIL

Documentație API

API-ul SunTrace3D pentru Parteneri îți permite să generezi modele 3D HD ale orașelor, să calculezi producția de energie solară și să integrezi vizualizatoare 3D interactive pe site-ul tău. Toate endpoint-urile folosesc JSON și metode HTTP standard.

1

Prezentare Generală

API-ul SunTrace3D este un serviciu RESTful pentru acces programatic la generarea modelelor 3D ale orașelor și calculele de energie solară. API-ul este conceput pentru parteneri care doresc să integreze analiza solară în propriile aplicații, site-uri web sau fluxuri de lucru.

URL de Bază

https://suntrace3d.com/api/v1
API REST
Cerere/răspuns JSON
Autentificare Bearer
Autentificare cu cheie API
Calitate HD
Toate modelele API sunt HD

Endpoint-uri Disponibile

POST/api/v1/modelsGenerează un nou model 3D HD
GET/api/v1/models/:idVerifică starea generării modelului
POST/api/solar/calculateCalculează producția de energie solară
GET/embedVizualizator 3D integrabil (iframe)
GET/api/healthVerificare funcționalitate (fără autentificare necesară)
Partner portal showing API keys and usage statistics
Portalul pentru Parteneri — gestionează cheile API, vizualizează statisticile de utilizare și obține codul de integrare
2

Autentificare

Toate cererile API necesită autentificare prin token Bearer în antetul Authorization. Cheile API sunt gestionate prin Portalul pentru Parteneri.

Obținerea unei chei API

  1. 1
    Creează un cont
    Înregistrează-te la /auth/signup dacă nu ai făcut-o deja.
  2. 2
    Upgrade la Business
    Un abonament Business (99 €/lună) este necesar pentru accesul API. Faceți upgrade din setările contului sau pagina de prețuri.
  3. 3
    Generează o cheie API
    Vizitează Portalul pentru Parteneri și dă clic pe „Creează Cheie”. Copiază cheia imediat — nu va mai fi afișată din nou.
  4. 4
    Folosește în cereri
    Include cheia în toate cererile API ca token Bearer.
Antet de Autentificarebash
curl -H "Authorization: Bearer st_live_abc123def456..." \
  https://suntrace3d.com/api/v1/models

Păstrează cheia API secretă

Nu expune niciodată cheia API în JavaScript client-side, depozite publice sau cod front-end. Dacă cheia ta este compromisă, revoc-o imediat din Portalul pentru Parteneri și creează una nouă.

3

Generarea unui Model 3D

Solicită generarea unui model 3D HD al orașului pentru o locație geografică specifică. Modelul este generat asincron — interoghează endpoint-ul de stare pentru a verifica când este gata.

POST/api/v1/models

Corpul Cererii

latitudenumberrequiredLatitudinea punctului central (-90 la 90)
longitudenumberrequiredLongitudinea punctului central (-180 la 180)
radiusKmnumberRaza zonei de modelat în km (implicit: 0.3)

Răspuns

idstringrequiredIdentificator unic al modelului pentru interogarea stării
statusstringrequired"pending" | "processing" | "ready" | "failed"
modelUrlstringURL-ul fișierului GLB al modelului (când este gata)
progressnumberProgresul generării 0-100 (în procesare)
stepstringDescrierea pasului curent de generare
Cererebash
curl -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
  }'
Răspuns (în așteptare)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "pending"
}
Răspuns (gata)json
{
  "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"
}

Cache-ul modelelor

Dacă un model pentru aceeași locație și rază a fost deja generat, API-ul returnează rezultatul din cache imediat cu status: "ready". Modelele sunt stocate în cache în S3 timp de 30 de zile. Nu ești taxat pentru rezultatele din cache.

API request generating a 3D model
API-ul generează modele 3D HD asincron — interoghează endpoint-ul de stare până este gata
4

Verificarea Stării Modelului

Interoghează acest endpoint pentru a verifica starea unei cereri de generare a modelului. Modelul parcurge mai multe etape: pending → processing → ready.

GET/api/v1/models/:id
Cererebash
curl https://suntrace3d.com/api/v1/models/hd_44.8699_13.8420_0.3 \
  -H "Authorization: Bearer YOUR_API_KEY"
Răspuns (în procesare)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "processing",
  "progress": 65,
  "step": "Generating textures..."
}
Răspuns (gata)json
{
  "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
}

Valori de Stare

pendingSarcina este în coadă și așteaptă să fie preluată de un worker
processingModelul este în curs de generare. Verifică câmpul progress pentru procentaj.
readyModelul este gata. Câmpul modelUrl conține URL-ul de descărcare.
failedGenerarea a eșuat. Poți reîncerca creând o nouă cerere.

Recomandare de interogare

Recomandăm interogarea la fiecare 5-10 secunde. Timpii tipici de generare sunt de 30-120 secunde în funcție de dimensiunea zonei și încărcarea serverului. Câmpul progress oferă un procentaj (0-100) pentru a afișa un indicator de progres în interfața ta.

5

Calculul Energiei Solare

Calculează producția anuală de energie solară pentru o configurație specifică a panoului și o locație. Acest endpoint folosește datele prin satelit PVGIS (Photovoltaic Geographical Information System) pentru valori precise de irradiere.

POST/api/solar/calculate

Corpul Cererii

latitudenumberrequiredLatitudinea locației
longitudenumberrequiredLongitudinea locației
tiltDegnumberrequiredUnghiul de înclinare al panoului în grade (0-90)
azimuthDegnumberrequiredAzimutul panoului în grade (0=Nord, 180=Sud)
panelAreaM2numberrequiredSuprafața totală a panoului în metri pătrați
panelEfficiencynumberrequiredEficiența panoului (0.0 - 1.0, de obicei 0.18-0.22)
shadingLossFractionnumberFactorul pierderilor de umbrire (0.0-1.0, implicit: 0)

Răspuns

annualYieldKwhnumberrequiredProducția anuală estimată de energie în kWh
peakPowerKwnumberrequiredPuterea de vârf în kW
specificYieldnumberrequiredProducția specifică în kWh/kWp
monthlyKwhnumber[]requiredVector cu 12 valori lunare în kWh
sourcestringrequiredIdentificatorul sursei de date ("pvgis")
Cererebash
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
  }'
Răspunsjson
{
  "annualYieldKwh": 4982,
  "peakPowerKw": 4.0,
  "specificYield": 1246,
  "monthlyKwh": [248, 305, 412, 465, 522, 548, 562, 530, 445, 368, 280, 232],
  "source": "pvgis"
}

Nu necesită autentificare

Endpoint-ul de calcul solar este disponibil public și nu necesită o cheie API. Folosește API-ul public PVGIS menținut de Centrul Comun de Cercetare al Comisiei Europene.

Solar energy calculation API response
API-ul de calcul solar returnează producția anuală, puterea de vârf și defalcarea lunară
6

Integrarea Vizualizatorului

Integrează un vizualizator 3D solar interactiv pe site-ul tău folosind un iframe. Vizualizatorul integrat include controale de timp pentru simularea umbrelor și funcționează atât pe desktop, cât și pe mobil.

Parametrii URL-ului de Integrare

latnumberrequiredLatitudinea locației de afișat
lngnumberrequiredLongitudinea locației de afișat
keystringrequiredCheia ta API pentru autentificare
Cod de Integrare de Bazăhtml
<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>
Integrare Responsivă (recomandat)html
<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>

Funcționalitățile integrării

Orbitare, panoramare și zoom 3D interactiv
Cursor de timp pentru simularea umbrelor
Responsiv — funcționează pe mobil
Modele fotorealiste Google 3D Tiles
Nu necesită JavaScript suplimentar
Suport pentru ecran complet
Embedded 3D viewer in an iframe
Vizualizatorul integrabil include controale de timp și funcționează atât pe desktop, cât și pe mobil
7

Limite de Rată

API-ul impune limite de rată pentru a asigura utilizarea echitabilă și stabilitatea sistemului.

Generarea Modelelor
POST /api/v1/models
10 cereri
pe oră, per cheie API
Interogarea Stării
GET /api/v1/models/:id
Fără limită
Interoghează după necesitate
Calculul Solar
POST /api/solar/calculate
Fără limită
Endpoint public
Vizualizări Integrate
GET /embed
Fără limită
Vizualizări nelimitate
Răspuns Limită de Rată Depășită (429)json
{
  "error": "Rate limit exceeded. Maximum 10 generations per hour."
}
8

Gestionarea Erorilor

API-ul folosește coduri de stare HTTP standard. Toate răspunsurile de eroare includ un corp JSON cu un câmp error care descrie problema.

Coduri de Stare HTTP

200Succes — cererea s-a finalizat cu succes
400Cerere Invalidă — parametri lipsă sau invalizi
401Neautorizat — cheie API lipsă sau invalidă
404Negăsit — ID-ul modelului nu există
429Prea Multe Cereri — limita de rată depășită
503Serviciu Indisponibil — serviciul extern (PVGIS) este nefuncțional
Exemplu Răspuns Eroarejson
{
  "error": "latitude and longitude are required"
}
Eroare de Autentificarejson
{
  "error": "Invalid or revoked API key"
}
9

Webhook-uri

Suportul webhook pentru notificări la finalizarea modelului este planificat pentru o versiune viitoare. În prezent, folosește interogarea endpoint-ului de stare pentru a verifica când modelele sunt gata.

În Curând

Callback-urile webhook vor trimite o cerere POST la URL-ul tău specificat când generarea modelului se finalizează, eliminând necesitatea interogării. Această funcționalitate este pe lista noastră de dezvoltare.

10

Exemple Complete

Exemple complete, gata de copiat, pentru scenarii comune de integrare.

Generează un model și așteaptă finalizarea

Bash — flux complet de lucrubash
#!/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"
fi

Integrare JavaScript/Node.js

Node.js — generare și interogarejavascript
const 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));

Integrare Python

Python — generare și calcul solarpython
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']}")
API integration code examples in multiple languages
Exemple complete de cod în Bash, JavaScript și Python pentru integrarea API
11

Integrare agenți AI

Agenții AI (chatboți, asistenți virtuali) pot crea sesiuni pentru a redirecționa utilizatorii către SunTrace3D cu setări Solar Wizard preconfigurate și detectare automată opțională a acoperișului. Modelul 3D este generat când utilizatorul deschide linkul (~1-2 minute).

Endpoints

POST/api/mcp-sessionsCreate agent session with wizard params
GET/api/mcp-sessions/:idCheck session & model status
POST/api/mcp-sessions

Request Parameters

agentNamestringrequiredIdentificator agent (obligatoriu)
latitudenumberrequiredLocation center latitude
longitudenumberrequiredLocation center longitude
wizardGoalstringPresetare obiectiv wizard
wizardKwhnumberkWh lunari pentru cover_bill
roofLatnumberLatitudine acoperiș pentru clic automat
roofLngnumberLongitudine acoperiș pentru clic automat
POST /api/mcp-sessionsjson
{
  "agentName": "ChatGPT",
  "latitude": 44.8699,
  "longitude": 13.8420,
  "wizardGoal": "cover_bill",
  "wizardKwh": 350,
  "roofLat": 44.8701,
  "roofLng": 13.8418
}
Responsejson
{
  "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.

Recommended Workflows

Cu coordonate ale acoperișului
Furnizați coordonate precise ale acoperișului pentru plasarea automată a panourilor. Cea mai bună UX — utilizatorul dă clic pe link, modelul se încarcă, panourile sunt plasate automat.
Selectare manuală a acoperișului
Lăsați utilizatorul să aleagă locația exactă a acoperișului. Asistentul se deschide și așteaptă ca utilizatorul să facă clic pe acoperișul său.
URL direct
Construiți un URL al vizualizatorului direct fără apel API. Cea mai simplă integrare, fără urmărirea sesiunii.

URL Parameters (Viewer)

wizardstringPreselectare obiectiv wizard
wizardKwhnumberkWh lunari pentru cover_bill
roofLatnumberLatitudine acoperiș pentru clic automat
roofLngnumberLongitudine acoperiș pentru clic automat
sessionstringID sesiune MCP (inclus automat de API)

Python Example

Python — create session and send link to userpython
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 placed

Important Notes

  • Fiecare cerere API trebuie să includă un agentName care identifică agentul apelant. Aceasta este necesar pentru analize și urmărirea utilizării.
  • roofLat/roofLng trebuie să indice cât mai precis posibil centrul suprafeței de acoperiș dorite. Sistemul efectuează un raycast în jos la acel punct GPS.
  • Când sunt furnizate roofLat/roofLng, sistemul încearcă automat să detecteze suprafața acoperișului la acele coordonate. Dacă detectarea automată eșuează, utilizatorul poate face clic manual sau poate folosi "Începe Din Nou".
  • Utilizatorii pot oricând face clic pe "Începe Din Nou" pentru a elimina panourile plasate automat și a selecta un acoperiș diferit.
  • Solar Wizard necesită un abonament Pro. Utilizatorii gratuiți vor vedea o solicitare de actualizare.
  • Sesiunile agentului nu pre-generează modele. Modelul 3D este generat când utilizatorul deschide linkul (~1-2 minute). Utilizatorii Pro primesc HD, utilizatorii gratuiți primesc SD.

Ești nou pe SunTrace3D?

Consultă Ghidul Utilizatorului pentru un tur complet al vizualizatorului 3D, simularea umbrelor și funcționalitățile de analiză a panourilor solare.

Ghidul Utilizatorului