Startnext API for Developers

The Startnext API allows you to integrate project data into your website, app, or other applications. This documentation shows you how to use the API.

Quick Start

1. Create an API Key

To use the API, you need a Project API Key:

  1. Open your project on Startnext
  2. Go to Project InterfaceAdministrationAPI Keys
  3. Click Create New API Key
  4. Select the required permissions (scopes)
  5. Copy the displayed API key and store it securely

Important: The full API key is only shown once at creation. It starts with snx_proj_ followed by a random string.

2. First API Request

curl -H "Authorization: Bearer snx_proj_YOUR_API_KEY" \
     "https://www.startnext.com/myty/api/crowdfunding/project/your-project"

Base URL

All API endpoints start with:

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

Authentication

Add your API key as a Bearer Token in the Authorization header:

Authorization: Bearer snx_proj_xxxxxxxxxxxxxxxx

Available Permissions (Scopes)

When creating an API key, you choose which data may be accessed:

Scope Description
project:read Basic project data (title, description, funding status)
incentives:read Project rewards
blog:read Blog entries/updates of the project
fundings:read Public contributions for streams (timestamp and name)
orders:read Orders/contributions with full details
subscribers:read Fans/subscribers of the project
wall:read Wall posts of the project

API Endpoints

Retrieve Project Data

GET /project/{link_caption}

Scope: project:read

Returns the basic project information.

Example:

curl -H "Authorization: Bearer snx_proj_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/project/my-awesome-project"

Response:

{
    "project": {
        "id": 12345,
        "title": "My Awesome Project",
        "subtitle": "A project for everyone",
        "link_caption": "my-awesome-project",
        "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": "Short description...",
        "url": {
            "project": "https://www.startnext.com/my-awesome-project",
            "support": "https://www.startnext.com/my-awesome-project/support"
        }
    },
    "status": 0
}

List Rewards

GET /project/{link_caption}/incentives

Scope: incentives:read

Returns all rewards of the project.

Parameters:

Parameter Type Description
limit Integer Maximum number of results (default: 50, max: 100)
offset Integer Starting position for pagination

Example:

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

Response:

{
    "data": [
        {
            "id": 12345,
            "title": "Limited T-Shirt",
            "description": "An exclusive T-shirt for supporters",
            "credit_value": 25.00,
            "quantity": 100,
            "remaining_quantity": 42,
            "sold_count": 58,
            "status": "enabled",
            "requires_address": true
        }
    ],
    "meta": {
        "total": 15,
        "limit": 10,
        "offset": 0
    }
}

List Blog Entries

GET /project/{link_caption}/blog

Scope: blog:read

Returns all blog entries/updates of the project.

Example:

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

Response:

{
    "data": [
        {
            "id": 5678,
            "title": "We made it!",
            "text": "Thanks to all supporters...",
            "type": "text",
            "status": "enabled",
            "release_timestamp": 1705315800
        }
    ],
    "meta": {
        "total": 5,
        "limit": 50,
        "offset": 0
    }
}

List Orders/Contributions

GET /project/{link_caption}/orders

Scope: orders:read

Note: This endpoint is only available once the project has been successfully funded (≥100%).

Returns all successful contributions with full details.

Example:

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

Response:

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

List Fans/Subscribers

GET /project/{link_caption}/subscribers

Scope: subscribers:read

Returns all fans/subscribers of the project.

Example:

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

Response:

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

List Wall Posts

GET /project/{link_caption}/wall

Scope: wall:read

Returns all wall posts of the project.

Example:

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

Response:

{
    "data": [
        {
            "id": 12345,
            "message": "Great project! Good luck!",
            "status": "enabled",
            "created_timestamp": 1705315800,
            "user": {
                "id": 789,
                "firstname": "Jane",
                "lastname": "Doe",
                "display_name": "Jane Doe"
            }
        }
    ],
    "meta": {
        "total": 25,
        "limit": 50,
        "offset": 0
    }
}

Public Contributions (Stream)

GET /project/{link_caption}/fundings

Scope: fundings:read

Returns publicly visible contributions with minimal data. Intended for live streams or feeds of recent supporters.

Note: For detailed order data (addresses, rewards, etc.), use the /orders endpoint with the orders:read scope instead.

Example:

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

Response:

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

Data Formats

Dates

All dates are returned as UNIX timestamps (seconds since 1970-01-01):

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

Convert in JavaScript:

const date = new Date(timestamp * 1000);

Convert in PHP:

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

Pagination

Paginated endpoints support the limit and offset parameters:

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

The response contains a meta object with pagination information:

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

Rate Limiting

API requests are limited to ensure system stability.

Limits

Plan Per Minute Per Day
Pro 120 10,000
Premium 300 50,000

Rate Limit Headers

Every API response includes headers with the current 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

When the Limit Is Exceeded

When the limit is reached, you receive an HTTP 429 error:

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

The Retry-After header indicates how long you need to wait.

Error Handling

HTTP Status Codes

Code Meaning
200 Success
400 Bad request
401 Invalid or missing API key
403 Missing permission (scope)
404 Project not found
429 Rate limit exceeded
500 Server error

Error Response

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

Code Examples

JavaScript (fetch)

const API_KEY = 'snx_proj_xxxxxxxx';
const PROJECT = 'my-project';

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();
}

// Usage
getProjectData()
    .then(data => {
        console.log(`Funding: ${data.project.current_funding} €`);
        console.log(`Supporters: ${data.project.supporter_count}`);
    })
    .catch(error => console.error('Error:', error));

PHP (cURL)

<?php
$apiKey = 'snx_proj_xxxxxxxx';
$project = 'my-project';

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 error: HTTP {$httpCode}");
    }

    return json_decode($response, true);
}

// Usage
try {
    $data = getProjectData($project, $apiKey);
    echo "Funding: " . $data['project']['current_funding'] . " €\n";
    echo "Supporters: " . $data['project']['supporter_count'] . "\n";
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "\n";
}

Python (requests)

import requests

API_KEY = 'snx_proj_xxxxxxxx'
PROJECT = 'my-project'

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()

# Usage
try:
    data = get_project_data(PROJECT, API_KEY)
    print(f"Funding: {data['project']['current_funding']} €")
    print(f"Supporters: {data['project']['supporter_count']}")
except requests.exceptions.HTTPError as e:
    print(f"Error: {e}")

Usage Examples

Display Funding Progress on Your Own Website

Show the current funding status of your project on your 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> supporters</p>
</div>

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

        // project_type_all_or_nothing: true  = funding goal must be reached
        // project_type_all_or_nothing: false = successful from first contribution
        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} of ` +
                `<span>${project.funding_threshold.toFixed(2)}</span> ${project.currency} funded`;
        } else {
            // Project without funding goal
            document.getElementById('progress').style.width = '100%';
            document.getElementById('funding-status').innerHTML =
                `<span>${project.current_funding.toFixed(2)}</span> ${project.currency} raised`;
        }
        document.getElementById('supporters').textContent = project.supporter_count;
    }

    updateWidget();
    setInterval(updateWidget, 60000); // Refresh every 60 seconds
</script>

Display Rewards in Your Own Shop

async function loadIncentives() {
    const response = await fetch(
        'https://www.startnext.com/myty/api/crowdfunding/project/my-project/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">${incentive.remaining_quantity} remaining</p>
            <a href="https://www.startnext.com/my-project/support" class="button">
                Support now
            </a>
        `;
        container.appendChild(card);
    });
}