Startnext API für Entwickler

Mit der Startnext API kannst du Projektdaten in deine Website, App oder andere Anwendungen integrieren. Diese Dokumentation zeigt dir, wie du die API nutzen kannst.

Schnellstart

1. API-Key erstellen

Um die API zu nutzen, benötigst du einen Project API-Key:

  1. Öffne dein Projekt auf Startnext
  2. Gehe zu ProjektinterfaceAdministrationAPI-Schlüssel
  3. Klicke auf Neuen API-Key erstellen
  4. Wähle die benötigten Berechtigungen (Scopes)
  5. Kopiere den angezeigten API-Key und speichere ihn sicher

Wichtig: Der vollständige API-Key wird nur einmal bei der Erstellung angezeigt. Er beginnt mit snx_proj_ gefolgt von einer zufälligen Zeichenkette.

2. Erste API-Anfrage

curl -H "Authorization: Bearer snx_proj_DEIN_API_KEY" \
     "https://www.startnext.com/myty/api/crowdfunding/project/dein-projekt"

Basis-URL

Alle API-Endpunkte beginnen mit:

https://www.startnext.com/myty/api/crowdfunding

Authentifizierung

Füge deinen API-Key als Bearer Token im Authorization-Header hinzu:

Authorization: Bearer snx_proj_xxxxxxxxxxxxxxxx

Verfügbare Berechtigungen (Scopes)

Beim Erstellen eines API-Keys wählst du, auf welche Daten zugegriffen werden darf:

Scope Beschreibung
project:read Basis-Projektdaten (Titel, Beschreibung, Finanzierungsstatus)
incentives:read Dankeschöns des Projekts
blog:read Blog-Einträge/Updates des Projekts
fundings:read Öffentliche Unterstützungen für Streams (Zeitpunkt und Name)
orders:read Bestellungen/Unterstützungen mit allen Details
subscribers:read Fans/Abonnenten des Projekts
wall:read Pinnwandeinträge des Projekts

API-Endpunkte

Projektdaten abrufen

GET /project/{link_caption}

Scope: project:read

Gibt die grundlegenden Projektinformationen zurück.

Beispiel:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/mein-tolles-projekt"

Antwort:

{
  "project": {
    "id": 12345,
    "title": "Mein tolles Projekt",
    "subtitle": "Ein Projekt für alle",
    "link_caption": "mein-tolles-projekt",
    "status": "active",
    "currency": "EUR",
    "current_funding": 7550.00,
    "total_funding": 7550.00,
    "funding_threshold": 10000.00,
    "project_type_all_or_nothing": true,
    "supporter_count": 150,
    "like_count": 89,
    "teaser_text": "Kurze Beschreibung...",
    "url": {
      "project": "https://www.startnext.com/mein-tolles-projekt",
      "support": "https://www.startnext.com/mein-tolles-projekt/unterstuetzen"
    }
  },
  "status": 0
}

Dankeschöns auflisten

GET /project/{link_caption}/incentives

Scope: incentives:read

Gibt alle Dankeschöns des Projekts zurück.

Parameter:

Parameter Typ Beschreibung
limit Integer Maximale Anzahl (Standard: 50, Max: 100)
offset Integer Startposition für Paginierung

Beispiel:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt/incentives?limit=10"

Antwort:

{
  "data": [
    {
      "id": 12345,
      "title": "Limitiertes T-Shirt",
      "description": "Ein exklusives T-Shirt für Unterstützer",
      "credit_value": 25.00,
      "quantity": 100,
      "remaining_quantity": 42,
      "sold_count": 58,
      "status": "enabled",
      "requires_address": true
    }
  ],
  "meta": {
    "total": 15,
    "limit": 10,
    "offset": 0
  }
}

Blog-Einträge auflisten

GET /project/{link_caption}/blog

Scope: blog:read

Gibt alle Blog-Einträge/Updates des Projekts zurück.

Beispiel:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt/blog"

Antwort:

{
  "data": [
    {
      "id": 5678,
      "title": "Wir haben es geschafft!",
      "text": "Danke an alle Unterstützer...",
      "type": "text",
      "status": "enabled",
      "release_timestamp": 1705315800
    }
  ],
  "meta": {
    "total": 5,
    "limit": 50,
    "offset": 0
  }
}

Bestellungen/Unterstützungen auflisten

GET /project/{link_caption}/orders

Scope: orders:read

Hinweis: Dieser Endpunkt ist nur verfügbar, wenn das Projekt erfolgreich finanziert wurde (≥100%).

Gibt alle erfolgreichen Unterstützungen mit vollständigen Details zurück.

Beispiel:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt/orders"

Antwort:

{
  "data": [
    {
      "support_timestamp": 1705315800,
      "total_amount": 50.00,
      "status_code": "collected",
      "is_public": true,
      "bill_address": {
        "firstname": "Max",
        "lastname": "Mustermann",
        "city": "Berlin",
        "country": "Deutschland"
      },
      "ordered_incentives": [
        {
          "id": 12345,
          "count": 2,
          "price_single": 25.00,
          "price_total": 50.00
        }
      ]
    }
  ],
  "meta": {
    "total": 150,
    "limit": 50,
    "offset": 0
  }
}

Fans/Abonnenten auflisten

GET /project/{link_caption}/subscribers

Scope: subscribers:read

Gibt alle Fans/Abonnenten des Projekts zurück.

Beispiel:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt/subscribers"

Antwort:

{
  "data": [
    {
      "subscribed_timestamp": 1705315800,
      "news_subscribed": true,
      "user": {
        "id": 789,
        "firstname": "Max",
        "lastname": "Mustermann",
        "display_name": "Max Mustermann"
      }
    }
  ],
  "meta": {
    "total": 89,
    "limit": 50,
    "offset": 0
  }
}

Pinnwandeinträge auflisten

GET /project/{link_caption}/wall

Scope: wall:read

Gibt alle Pinnwandeinträge des Projekts zurück.

Beispiel:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt/wall"

Antwort:

{
  "data": [
    {
      "id": 12345,
      "message": "Tolles Projekt! Viel Erfolg!",
      "status": "enabled",
      "created_timestamp": 1705315800,
      "user": {
        "id": 789,
        "firstname": "Max",
        "lastname": "Mustermann",
        "display_name": "Max Mustermann"
      }
    }
  ],
  "meta": {
    "total": 25,
    "limit": 50,
    "offset": 0
  }
}

Öffentliche Unterstützungen (Stream)

GET /project/{link_caption}/fundings

Scope: fundings:read

Dieser Endpunkt gibt öffentlich sichtbare Unterstützungen mit minimalen Daten zurück. Er ist für Live-Streams oder Feeds von aktuellen Unterstützern gedacht.

Hinweis: Für detaillierte Bestelldaten (Adressen, Dankeschöns, etc.) verwende stattdessen den /orders Endpunkt mit orders:read Scope.

Beispiel:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt/fundings"

Antwort:

{
  "data": [
    {
      "support_timestamp": 1705315800,
      "user": {
        "id": 789,
        "display_name": "Max Mustermann"
      }
    }
  ],
  "total": 150
}

Datenformate

Datumsangaben

Alle Datumsangaben werden als UNIX-Timestamps (Sekunden seit 1970-01-01) zurückgegeben:

{
  "created_timestamp": 1705315800,
  "support_timestamp": 1705402200
}

Umrechnung in JavaScript:

const date = new Date(timestamp * 1000);

Umrechnung in PHP:

$date = new DateTime('@' . $timestamp);

Paginierung

Paginierte Endpunkte unterstützen die Parameter limit und offset:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt/incentives?limit=10&offset=20"

Die Antwort enthält ein meta-Objekt mit Paginierungsinformationen:

{
  "data": [...],
  "meta": {
    "total": 150,
    "limit": 10,
    "offset": 20
  }
}

Rate Limiting

API-Anfragen sind limitiert, um die Systemstabilität zu gewährleisten.

Limits

Produktplan Pro Minute Pro Tag
Pro 120 10.000
Premium 300 50.000

Rate-Limit-Header

Jede API-Antwort enthält Header mit dem aktuellen Limit-Status:

X-RateLimit-Day-Limit: 10000
X-RateLimit-Day-Remaining: 9850
X-RateLimit-Day-Reset: 1705363200
X-RateLimit-Minute-Limit: 120
X-RateLimit-Minute-Remaining: 118
X-RateLimit-Minute-Reset: 1705320060

Bei Überschreitung

Wenn das Limit erreicht ist, erhältst du einen HTTP 429 Fehler:

{
  "error": "rate_limit_exceeded",
  "message": "Rate limit exceeded (minute). Please wait 45 seconds before retrying."
}

Der Retry-After-Header gibt an, wie lange du warten musst.

Fehlerbehandlung

HTTP-Statuscodes

Code Bedeutung
200 Erfolg
400 Ungültige Anfrage
401 Ungültiger oder fehlender API-Key
403 Fehlende Berechtigung (Scope)
404 Projekt nicht gefunden
429 Rate Limit überschritten
500 Serverfehler

Fehler-Response

{
  "error": "insufficient_scope",
  "message": "This endpoint requires the \"fundings:read\" scope"
}

Code-Beispiele

JavaScript (fetch)

const API_KEY = 'snx_proj_xxxxxxxx';
const PROJECT = 'mein-projekt';

async function getProjectData() {
  const response = await fetch(
    `https://www.startnext.com/myty/api/crowdfunding/project/${PROJECT}`,
    {
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Accept': 'application/json'
      }
    }
  );

  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.message || `HTTP ${response.status}`);
  }

  return response.json();
}

// Verwendung
getProjectData()
  .then(data => {
    console.log(`Finanzierung: ${data.project.current_funding} €`);
    console.log(`Unterstützer: ${data.project.supporter_count}`);
  })
  .catch(error => console.error('Fehler:', error));

PHP (cURL)

<?php
$apiKey = 'snx_proj_xxxxxxxx';
$project = 'mein-projekt';

function getProjectData($project, $apiKey) {
    $ch = curl_init();

    curl_setopt_array($ch, [
        CURLOPT_URL => "https://www.startnext.com/myty/api/crowdfunding/project/{$project}",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            "Authorization: Bearer {$apiKey}",
            "Accept: application/json"
        ]
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode !== 200) {
        throw new Exception("API-Fehler: HTTP {$httpCode}");
    }

    return json_decode($response, true);
}

// Verwendung
try {
    $data = getProjectData($project, $apiKey);
    echo "Finanzierung: " . $data['project']['current_funding'] . " €\n";
    echo "Unterstützer: " . $data['project']['supporter_count'] . "\n";
} catch (Exception $e) {
    echo "Fehler: " . $e->getMessage() . "\n";
}

Python (requests)

import requests

API_KEY = 'snx_proj_xxxxxxxx'
PROJECT = 'mein-projekt'

def get_project_data(project, api_key):
    url = f'https://www.startnext.com/myty/api/crowdfunding/project/{project}'
    headers = {
        'Authorization': f'Bearer {api_key}',
        'Accept': 'application/json'
    }

    response = requests.get(url, headers=headers)
    response.raise_for_status()

    return response.json()

# Verwendung
try:
    data = get_project_data(PROJECT, API_KEY)
    print(f"Finanzierung: {data['project']['current_funding']} €")
    print(f"Unterstützer: {data['project']['supporter_count']}")
except requests.exceptions.HTTPError as e:
    print(f"Fehler: {e}")

Anwendungsbeispiele

Finanzierungsfortschritt auf eigener Website

Zeige den aktuellen Finanzierungsstand deines Projekts auf deiner Website:

<div id="funding-widget">
  <div class="progress-bar">
    <div class="progress" id="progress"></div>
  </div>
  <p id="funding-status"></p>
  <p><span id="supporters">0</span> Unterstützer</p>
</div>

<script>
async function updateWidget() {
  const response = await fetch(
    'https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt',
    { headers: { 'Authorization': 'Bearer snx_proj_xxx' } }
  );
  const { project } = await response.json();

  // project_type_all_or_nothing: true = Finanzierungsziel muss erreicht werden
  // project_type_all_or_nothing: false = Ab erster Unterstützung erfolgreich
  if (project.project_type_all_or_nothing && project.funding_threshold) {
    const percentage = (project.current_funding / project.funding_threshold) * 100;
    document.getElementById('progress').style.width = `${Math.min(percentage, 100)}%`;
    document.getElementById('funding-status').innerHTML =
      `<span>${project.current_funding.toFixed(2)}</span> ${project.currency} von ` +
      `<span>${project.funding_threshold.toFixed(2)}</span> ${project.currency} finanziert`;
  } else {
    // Projekt ohne Finanzierungsziel
    document.getElementById('progress').style.width = '100%';
    document.getElementById('funding-status').innerHTML =
      `<span>${project.current_funding.toFixed(2)}</span> ${project.currency} gesammelt`;
  }
  document.getElementById('supporters').textContent = project.supporter_count;
}

updateWidget();
setInterval(updateWidget, 60000); // Alle 60 Sekunden aktualisieren
</script>

Dankeschöns in eigenem Shop anzeigen

async function loadIncentives() {
  const response = await fetch(
    'https://www.startnext.com/myty/api/crowdfunding/project/mein-projekt/incentives',
    { headers: { 'Authorization': 'Bearer snx_proj_xxx' } }
  );
  const { data } = await response.json();

  const container = document.getElementById('incentives');

  data.forEach(incentive => {
    const card = document.createElement('div');
    card.className = 'incentive-card';
    card.innerHTML = `
      <h3>${incentive.title}</h3>
      <p>${incentive.description}</p>
      <p class="price">${incentive.credit_value.toFixed(2)} €</p>
      <p class="stock">Noch ${incentive.remaining_quantity} verfügbar</p>
      <a href="https://www.startnext.com/mein-projekt/unterstuetzen" class="button">
        Jetzt unterstützen
      </a>
    `;
    container.appendChild(card);
  });
}