v1ESTABLE

Documentación de la API

La Partner API de SunTrace3D te permite generar modelos 3D HD de ciudades, calcular el rendimiento de energía solar e incrustar visores 3D interactivos en tu sitio web. Todos los endpoints usan JSON y métodos HTTP estándar.

1

Descripción general

La API de SunTrace3D es un servicio RESTful para el acceso programático a la generación de modelos 3D urbanos y cálculos de energía solar. La API está diseñada para socios que desean integrar el análisis solar en sus propias aplicaciones, sitios web o flujos de trabajo.

URL base

https://suntrace3d.com/api/v1
API REST
Solicitud/respuesta JSON
Bearer Auth
Autenticación por clave API
Calidad HD
Todos los modelos de la API son HD

Endpoints disponibles

POST/api/v1/modelsGenerar un nuevo modelo 3D HD
GET/api/v1/models/:idConsultar el estado de generación del modelo
POST/api/solar/calculateCalcular rendimiento de energía solar
GET/embedVisor 3D incrustable (iframe)
GET/api/healthComprobación de estado (sin autenticación requerida)
Partner portal showing API keys and usage statistics
El Portal de socios — gestiona claves API, consulta estadísticas de uso y obtén código de incrustación
2

Autenticación

Todas las solicitudes API requieren autenticación mediante un token Bearer en el encabezado Authorization. Las claves API se gestionan a través del Portal de socios.

Obtener una clave API

  1. 1
    Crear una cuenta
    Regístrate en /auth/signup si aún no lo has hecho.
  2. 2
    Actualizar a Business
    Se requiere una suscripción Business (99 €/mes) para el acceso API. Actualiza desde la configuración de tu cuenta o la página de precios.
  3. 3
    Generar una clave API
    Visita el Portal de socios y haz clic en "Crear clave". Copia tu clave inmediatamente — no se mostrará de nuevo.
  4. 4
    Usar en solicitudes
    Incluye la clave en todas las solicitudes API como un token Bearer.
Encabezado de autenticaciónbash
curl -H "Authorization: Bearer st_live_abc123def456..." \
  https://suntrace3d.com/api/v1/models

Mantén tu clave API en secreto

Nunca expongas tu clave API en JavaScript del lado del cliente, repositorios públicos o código front-end. Si tu clave se ve comprometida, revócala inmediatamente desde el Portal de socios y crea una nueva.

3

Generar un modelo 3D

Solicita la generación de un modelo 3D HD urbano para una ubicación geográfica específica. El modelo se genera de forma asíncrona — consulta el endpoint de estado para saber cuándo está listo.

POST/api/v1/models

Cuerpo de la solicitud

latitudenumberrequiredLatitud del punto central (-90 a 90)
longitudenumberrequiredLongitud del punto central (-180 a 180)
radiusKmnumberRadio del área a modelar en km (predeterminado: 0,3)

Respuesta

idstringrequiredIdentificador único del modelo para consultar el estado
statusstringrequired"pending" | "processing" | "ready" | "failed"
modelUrlstringURL del archivo GLB del modelo (cuando está listo)
progressnumberProgreso de generación 0-100 (en procesamiento)
stepstringDescripción del paso de generación actual
Solicitudbash
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
  }'
Respuesta (pendiente)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "pending"
}
Respuesta (listo)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"
}

Caché de modelos

Si un modelo para la misma ubicación y radio ya ha sido generado, la API devuelve el resultado en caché inmediatamente con status: "ready". Los modelos se almacenan en caché en S3 durante 30 días. No se te cobra por los resultados en caché.

API request generating a 3D model
La API genera modelos 3D HD de forma asíncrona — consulta el endpoint de estado hasta que esté listo
4

Consultar estado del modelo

Consulta este endpoint para verificar el estado de una solicitud de generación de modelo. El modelo pasa por varias etapas: pending → processing → ready.

GET/api/v1/models/:id
Solicitudbash
curl https://suntrace3d.com/api/v1/models/hd_44.8699_13.8420_0.3 \
  -H "Authorization: Bearer YOUR_API_KEY"
Respuesta (procesando)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "processing",
  "progress": 65,
  "step": "Generating textures..."
}
Respuesta (listo)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
}

Valores de estado

pendingEl trabajo está en cola y esperando ser tomado por un worker
processingEl modelo se está generando. Consulta el campo progress para el porcentaje.
readyEl modelo está listo. El campo modelUrl contiene la URL de descarga.
failedLa generación falló. Puedes reintentar creando una nueva solicitud.

Recomendación de consulta

Recomendamos consultar cada 5-10 segundos. Los tiempos típicos de generación son de 30-120 segundos según el tamaño del área y la carga del servidor. El campo progress proporciona un porcentaje (0-100) para mostrar un indicador de progreso en tu interfaz.

5

Calcular energía solar

Calcula el rendimiento anual de energía solar para una configuración de panel y ubicación específicas. Este endpoint utiliza datos satelitales de PVGIS (Photovoltaic Geographical Information System) para valores de irradiancia precisos.

POST/api/solar/calculate

Cuerpo de la solicitud

latitudenumberrequiredLatitud de la ubicación
longitudenumberrequiredLongitud de la ubicación
tiltDegnumberrequiredÁngulo de inclinación del panel en grados (0-90)
azimuthDegnumberrequiredAzimut del panel en grados (0=Norte, 180=Sur)
panelAreaM2numberrequiredÁrea total del panel en metros cuadrados
panelEfficiencynumberrequiredEficiencia del panel (0,0 - 1,0, normalmente 0,18-0,22)
shadingLossFractionnumberFactor de pérdida por sombreado (0,0-1,0, predeterminado: 0)

Respuesta

annualYieldKwhnumberrequiredRendimiento anual estimado de energía en kWh
peakPowerKwnumberrequiredPotencia pico de salida en kW
specificYieldnumberrequiredRendimiento específico en kWh/kWp
monthlyKwhnumber[]requiredArray de 12 valores mensuales en kWh
sourcestringrequiredIdentificador de fuente de datos ("pvgis")
Solicitudbash
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
  }'
Respuestajson
{
  "annualYieldKwh": 4982,
  "peakPowerKw": 4.0,
  "specificYield": 1246,
  "monthlyKwh": [248, 305, 412, 465, 522, 548, 562, 530, 445, 368, 280, 232],
  "source": "pvgis"
}

Sin autenticación requerida

El endpoint de cálculo solar está disponible públicamente y no requiere clave API. Utiliza la API pública de PVGIS mantenida por el Centro Común de Investigación de la Comisión Europea.

Solar energy calculation API response
La API de cálculo solar devuelve rendimiento anual, potencia pico y desglose mensual
6

Visor incrustado

Incrusta un visor solar 3D interactivo en tu sitio web usando un iframe. El visor incrustado incluye controles de tiempo para simulación de sombras y funciona tanto en escritorio como en móvil.

Parámetros de URL de incrustación

latnumberrequiredLatitud de la ubicación a mostrar
lngnumberrequiredLongitud de la ubicación a mostrar
keystringrequiredTu clave API para autenticación
Código de incrustación básicohtml
<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>
Incrustación responsiva (recomendada)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>

Funciones del visor incrustado

Interacción 3D con órbita, panorámica y zoom
Control deslizante de tiempo para simulación de sombras
Responsivo — funciona en móvil
Modelos fotorrealistas de Google 3D Tiles
Sin JavaScript adicional requerido
Soporte de pantalla completa
Embedded 3D viewer in an iframe
El visor incrustable incluye controles de tiempo y funciona tanto en escritorio como en móvil
7

Límites de frecuencia

La API aplica límites de frecuencia para asegurar un uso justo y la estabilidad del sistema.

Generación de modelos
POST /api/v1/models
10 solicitudes
por hora, por clave API
Consulta de estado
GET /api/v1/models/:id
Sin límite
Consulta según necesidad
Cálculo solar
POST /api/solar/calculate
Sin límite
Endpoint público
Vistas incrustadas
GET /embed
Sin límite
Vistas ilimitadas
Respuesta de límite de frecuencia excedido (429)json
{
  "error": "Rate limit exceeded. Maximum 10 generations per hour."
}
8

Manejo de errores

La API utiliza códigos de estado HTTP estándar. Todas las respuestas de error incluyen un cuerpo JSON con un campo error que describe el problema.

Códigos de estado HTTP

200Éxito — la solicitud se completó correctamente
400Solicitud incorrecta — parámetros ausentes o inválidos
401No autorizado — clave API ausente o inválida
404No encontrado — el ID del modelo no existe
429Demasiadas solicitudes — límite de frecuencia excedido
503Servicio no disponible — servicio externo (PVGIS) caído
Ejemplo de respuesta de errorjson
{
  "error": "latitude and longitude are required"
}
Error de autenticaciónjson
{
  "error": "Invalid or revoked API key"
}
9

Webhooks

El soporte de webhooks para notificaciones de finalización de modelos está planificado para una versión futura. Actualmente, usa la consulta en el endpoint de estado para verificar cuándo los modelos están listos.

Próximamente

Los callbacks de webhooks enviarán una solicitud POST a tu URL especificada cuando la generación del modelo se complete, eliminando la necesidad de consultas periódicas. Esta función está en nuestra hoja de ruta.

10

Ejemplos completos

Ejemplos completos, listos para copiar y pegar, para escenarios de integración comunes.

Generar un modelo y esperar su finalización

Bash — flujo de trabajo completobash
#!/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

Integración JavaScript/Node.js

Node.js — generar y consultarjavascript
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));

Integración Python

Python — generar y calcular 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
Ejemplos de código completos en Bash, JavaScript y Python para integración con la API
11

Integración de agentes AI

Los agentes AI (chatbots, asistentes virtuales) pueden crear sesiones para redirigir usuarios a SunTrace3D con configuraciones preestablecidas del Solar Wizard y detección automática opcional del tejado. El modelo 3D se genera cuando el usuario abre el enlace (~1-2 minutos).

Endpoints

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

Request Parameters

agentNamestringrequiredIdentificador del agente (requerido)
latitudenumberrequiredLocation center latitude
longitudenumberrequiredLocation center longitude
wizardGoalstringPreselección del objetivo del wizard
wizardKwhnumberkWh mensuales para cover_bill
roofLatnumberLatitud del tejado para clic automático
roofLngnumberLongitud del tejado para clic automático
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

Con coordenadas del tejado
Proporcionar coordenadas precisas del tejado para la colocación automática de paneles. Mejor UX — el usuario hace clic en el enlace, el modelo se carga, los paneles se colocan automáticamente.
Selección manual del tejado
Dejar que el usuario elija la ubicación exacta del tejado. El asistente se abre y espera a que el usuario haga clic en su tejado.
URL directa
Construir una URL del visor directamente sin llamada API. La integración más sencilla, sin seguimiento de sesión.

URL Parameters (Viewer)

wizardstringPreseleccionar objetivo del wizard
wizardKwhnumberkWh mensuales para cover_bill
roofLatnumberLatitud del tejado para clic automático
roofLngnumberLongitud del tejado para clic automático
sessionstringID de sesión MCP (incluido automáticamente por la 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

  • Cada solicitud API debe incluir un agentName que identifique al agente que llama. Esto es necesario para analíticas y seguimiento de uso.
  • roofLat/roofLng deben apuntar lo más precisamente posible al centro de la superficie del tejado deseada. El sistema realiza un raycast hacia abajo en ese punto GPS.
  • Cuando se proporcionan roofLat/roofLng, el sistema intenta automáticamente detectar la superficie del tejado en esas coordenadas. Si la detección automática falla, el usuario puede hacer clic manualmente o usar "Empezar de nuevo".
  • Los usuarios siempre pueden hacer clic en "Empezar de nuevo" para eliminar los paneles colocados automáticamente y seleccionar un tejado diferente.
  • El Solar Wizard requiere una suscripción Pro. Los usuarios gratuitos verán una solicitud de actualización.
  • Las sesiones de agente no pre-generan modelos. El modelo 3D se genera cuando el usuario abre el enlace (~1-2 minutos). Los usuarios Pro obtienen HD, los usuarios gratuitos obtienen SD.

¿Nuevo en SunTrace3D?

Consulta la Guía del usuario para un recorrido completo por el visor 3D, simulación de sombras y funciones de análisis de paneles solares.

Guía del usuario