v1STABLE

API 문서

SunTrace3D 파트너 API를 사용하여 HD 3D 도시 모델을 생성하고, 태양광 에너지 수확량을 계산하며, 웹사이트에 인터랙티브 3D 뷰어를 임베드할 수 있습니다. 모든 엔드포인트는 JSON과 표준 HTTP 메서드를 사용합니다.

Markdown으로 보기 (기계 판독 가능)
1

개요

SunTrace3D API는 3D 도시 모델 생성과 태양광 에너지 계산에 대한 프로그래밍 방식 접근을 제공하는 RESTful 서비스입니다. API는 태양광 분석을 자체 애플리케이션, 웹사이트, 워크플로우에 통합하려는 파트너를 위해 설계되었습니다.

기본 URL

https://suntrace3d.com/api/v1
REST API
JSON 요청/응답
Bearer 인증
API 키 인증
HD 품질
모든 API 모델은 HD

사용 가능한 엔드포인트

POST/api/v1/models새 HD 3D 모델 생성
GET/api/v1/models/:id모델 생성 상태 확인
POST/api/solar/calculate태양광 에너지 수확량 계산
GET/embed임베드 가능한 3D 뷰어 (iframe)
GET/api/health헬스 체크 (인증 불필요)
Partner portal showing API keys and usage statistics
파트너 포털 — API 키 관리, 사용 통계 확인, 임베드 코드 획득
2

인증

모든 API 요청은 Authorization 헤더의 Bearer 토큰을 통한 인증이 필요합니다. API 키는 파트너 포털에서 관리됩니다.

API 키 획득

  1. 1
    계정 생성
    아직 계정이 없다면 /auth/signup에서 가입하세요.
  2. 2
    Pro로 업그레이드
    API 접근을 위해 Pro 구독이 필요합니다. 계정 설정에서 업그레이드하세요.
  3. 3
    API 키 생성
    파트너 포털을 방문하여 "키 생성"을 클릭하세요. 키를 즉시 복사하세요 — 다시 표시되지 않습니다.
  4. 4
    요청에 사용
    모든 API 요청에 Bearer 토큰으로 키를 포함하세요.
인증 헤더bash
curl -H "Authorization: Bearer st_live_abc123def456..." \
  https://suntrace3d.com/api/v1/models

API 키를 비밀로 유지하세요

클라이언트 사이드 JavaScript, 공개 리포지토리, 프론트엔드 코드에 API 키를 노출하지 마세요. 키가 유출된 경우 파트너 포털에서 즉시 해지하고 새 키를 생성하세요.

3

3D 모델 생성

특정 지리적 위치의 HD 3D 도시 모델 생성을 요청합니다. 모델은 비동기적으로 생성됩니다 — 상태 엔드포인트를 폴링하여 준비 완료를 확인하세요.

POST/api/v1/models

요청 본문

latitudenumberrequired중심점의 위도 (-90 ~ 90)
longitudenumberrequired중심점의 경도 (-180 ~ 180)
radiusKmnumber모델링할 영역의 반경 (km) (기본값: 0.3)

응답

idstringrequired상태 폴링을 위한 고유 모델 식별자
statusstringrequired"pending" | "processing" | "ready" | "failed"
modelUrlstringGLB 모델 파일 URL (준비 완료 시)
progressnumber생성 진행률 0-100 (처리 중일 때)
stepstring현재 생성 단계 설명
요청bash
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
  }'
응답 (대기 중)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "pending"
}
응답 (준비 완료)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"
}

모델 캐싱

동일한 위치와 반경의 모델이 이미 생성된 경우, API는 캐시된 결과를 status: "ready"로 즉시 반환합니다. 모델은 S3에 30일간 캐시됩니다. 캐시된 결과에는 요금이 부과되지 않습니다.

API request generating a 3D model
API가 HD 3D 모델을 비동기적으로 생성 — 준비 완료까지 상태 엔드포인트를 폴링
4

모델 상태 확인

이 엔드포인트를 폴링하여 모델 생성 요청의 상태를 확인하세요. 모델은 pending → processing → ready 단계를 거칩니다.

GET/api/v1/models/:id
요청bash
curl https://suntrace3d.com/api/v1/models/hd_44.8699_13.8420_0.3 \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (처리 중)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "processing",
  "progress": 65,
  "step": "Generating textures..."
}
응답 (준비 완료)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
}

상태 값

pending작업이 대기열에 있으며 워커에 의해 처리되기를 기다리고 있습니다
processing모델이 생성 중입니다. progress 필드에서 진행률을 확인하세요.
ready모델이 준비되었습니다. modelUrl 필드에 다운로드 URL이 포함되어 있습니다.
failed생성에 실패했습니다. 새 요청을 생성하여 다시 시도할 수 있습니다.

폴링 권장사항

5-10초마다 폴링하는 것을 권장합니다. 일반적인 생성 시간은 영역 크기와 서버 부하에 따라 30-120초입니다. progress 필드는 UI에 진행률 표시기를 표시하기 위한 백분율(0-100)을 제공합니다.

5

태양광 에너지 계산

특정 패널 구성과 위치에 대한 연간 태양광 에너지 수확량을 계산합니다. 이 엔드포인트는 정확한 일사량 값을 위해 PVGIS(태양광발전 지리정보 시스템) 위성 데이터를 사용합니다.

POST/api/solar/calculate

요청 본문

latitudenumberrequired위치 위도
longitudenumberrequired위치 경도
tiltDegnumberrequired패널 경사각 (도) (0-90)
azimuthDegnumberrequired패널 방위각 (도) (0=북, 180=남)
panelAreaM2numberrequired패널 총 면적 (제곱미터)
panelEfficiencynumberrequired패널 효율 (0.0 - 1.0, 보통 0.18-0.22)
shadingLossFractionnumber차폐 손실 계수 (0.0-1.0, 기본값: 0)

응답

annualYieldKwhnumberrequired추정 연간 에너지 수확량 (kWh)
peakPowerKwnumberrequired피크 출력 (kW)
specificYieldnumberrequired비에너지 수확량 (kWh/kWp)
monthlyKwhnumber[]required12개월 월간 kWh 값 배열
sourcestringrequired데이터 소스 식별자 ("pvgis")
요청bash
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
  }'
응답json
{
  "annualYieldKwh": 4982,
  "peakPowerKw": 4.0,
  "specificYield": 1246,
  "monthlyKwh": [248, 305, 412, 465, 522, 548, 562, 530, 445, 368, 280, 232],
  "source": "pvgis"
}

인증 불필요

태양광 계산 엔드포인트는 공개적으로 사용 가능하며 API 키가 필요하지 않습니다. 유럽위원회의 공동연구센터가 관리하는 PVGIS 공개 API를 사용합니다.

Solar energy calculation API response
태양광 계산 API가 연간 수확량, 피크 출력, 월간 분석을 반환
6

뷰어 임베드

iframe을 사용하여 웹사이트에 인터랙티브 3D 태양광 뷰어를 임베드하세요. 임베드 뷰어에는 그림자 시뮬레이션용 시간 컨트롤이 포함되어 있으며 데스크톱과 모바일 모두에서 작동합니다.

임베드 URL 매개변수

latnumberrequired표시할 위치의 위도
lngnumberrequired표시할 위치의 경도
keystringrequired인증용 API 키
기본 임베드 코드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>
반응형 임베드 (권장)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>

임베드 기능

인터랙티브 3D 궤도, 패닝, 줌
그림자 시뮬레이션용 타임 슬라이더
반응형 — 모바일 지원
Google 3D Tiles 포토리얼리스틱 모델
추가 JavaScript 불필요
전체 화면 지원
Embedded 3D viewer in an iframe
임베드 뷰어에는 시간 컨트롤이 포함되어 있으며 데스크톱과 모바일 모두에서 작동
7

속도 제한

API는 공정한 사용과 시스템 안정성을 보장하기 위해 속도 제한을 적용합니다.

모델 생성
POST /api/v1/models
10건 요청
시간당, API 키당
상태 폴링
GET /api/v1/models/:id
제한 없음
필요에 따라 폴링
태양광 계산
POST /api/solar/calculate
제한 없음
공개 엔드포인트
임베드 조회
GET /embed
제한 없음
무제한 조회
속도 제한 초과 응답 (429)json
{
  "error": "Rate limit exceeded. Maximum 10 generations per hour."
}
8

오류 처리

API는 표준 HTTP 상태 코드를 사용합니다. 모든 오류 응답에는 문제를 설명하는 error 필드가 포함된 JSON 본문이 있습니다.

HTTP 상태 코드

200성공 — 요청이 성공적으로 완료됨
400Bad Request — 매개변수가 누락되었거나 유효하지 않음
401Unauthorized — API 키가 누락되었거나 유효하지 않음
404Not Found — 모델 ID가 존재하지 않음
429Too Many Requests — 속도 제한 초과
503Service Unavailable — 외부 서비스(PVGIS)가 다운됨
오류 응답 예시json
{
  "error": "latitude and longitude are required"
}
인증 오류json
{
  "error": "Invalid or revoked API key"
}
9

Webhook

모델 완료 알림을 위한 Webhook 지원은 향후 릴리스에 계획되어 있습니다. 현재는 상태 엔드포인트 폴링을 사용하여 모델 준비 완료를 확인하세요.

곧 출시 예정

Webhook 콜백은 모델 생성이 완료되면 지정된 URL로 POST 요청을 보내 폴링의 필요성을 제거합니다. 이 기능은 로드맵에 포함되어 있습니다.

10

전체 예제

일반적인 통합 시나리오를 위한 완전한 복사-붙여넣기 예제입니다.

모델을 생성하고 완료를 기다리기

Bash — 전체 워크플로우bash
#!/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

JavaScript/Node.js 통합

Node.js — 생성 및 폴링javascript
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));

Python 통합

Python — 생성 및 태양광 계산python
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
API 통합을 위한 Bash, JavaScript, Python의 전체 코드 예제

SunTrace3D가 처음이신가요?

3D 뷰어, 그림자 시뮬레이션, 태양광 패널 분석 기능의 전체 가이드는 사용자 가이드를 확인하세요.

사용자 가이드