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:
- Öffne dein Projekt auf Startnext
- Gehe zu Projektinterface → Administration → API-Schlüssel
- Klicke auf Neuen API-Key erstellen
- Wähle die benötigten Berechtigungen (Scopes)
- 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
/ordersEndpunkt mitorders:readScope.
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);
});
}