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.

Ver como Markdown (legible por máquinas)
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
    Mejorar a Pro
    Se requiere una suscripción Pro para acceder a la API. Mejora desde los ajustes de tu cuenta.
  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

¿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