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

The Startnext API uses two types of API keys for external access:

Key type Prefix Use case
Project API Key snx_proj_* Access data of a specific project you manage
User API Key snx_user_* Access your own projects programmatically

1a. Create a Project API Key

To access data for a specific project, 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.

1b. Create a User API Key

To access your own projects programmatically, you need a User API Key:

  1. Log in to Startnext
  2. Go to SettingsAPI & Integrations
  3. Click Create New API Key
  4. Enter a name — the identity:read scope is always included automatically
  5. Copy the displayed API key — it starts with snx_user_

Important: The full API key is only shown once at creation.

2. First API Request

# Project-specific data (Project API Key)
curl -H "Authorization: Bearer snx_proj_YOUR_API_KEY" \
     "https://www.startnext.com/myty/api/crowdfunding/project/your-project"

# Your own and team projects (User API Key)
curl -H "Authorization: Bearer snx_user_YOUR_API_KEY" \
     "https://www.startnext.com/myty/api/crowdfunding/user/me/projects"

Terms of Use

By using the Startnext API, you agree to the Startnext API Terms of Use.

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

Dev mode only: If your development environment uses HTTP Basic Auth (which also uses the Authorization header), you can alternatively pass the key via x-access-token:

x-access-token: snx_proj_xxxxxxxxxxxxxxxx

This workaround is only available in dev mode.

Available Permissions (Scopes)

Project API Key Scopes

When creating a Project API Key, select which project data may be accessed:

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

Note: Project API Keys require your project to be on the Pro scope or higher. Basic/Legacy projects cannot create API keys.

User API Key Scopes

When creating a User API Key, select which data may be accessed:

Scope Always enabled Description
identity:read Verify API key identity and active scopes (/user/me/identity) — always included
incentives:read List active incentives from own and team projects (/user/me/incentives)
projects:read List all own and team projects (/user/me/projects)

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, including hidden ones (manually hidden via status=hidden or hidden due to an unmet funding goal). Use hidden_until_goal_reached and is_unlocked on each reward to determine its visibility state.

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
}

OpenAPI Specification

GET /crowdfunding/openapi.json

Auth: None (public endpoint)

Returns the complete OpenAPI specification for all public API endpoints (Project API Key and User API Key endpoints) as JSON. Useful for MCP clients, API explorers, and code generation.

Example:

curl "https://www.startnext.com/myty/api/crowdfunding/openapi.json"

Get API Key Identity

GET /user/me/identity

Key type: User API Key Scope: identity:read (always included in every User API Key)

Returns minimal identity data for the authenticated User API Key: the user ID, URL slug, and the list of active scopes. Contains no PII. Intended for verifying User API Keys — e.g. by MCP clients — and for discovering which permissions the key has.

Example:

curl -H "Authorization: Bearer snx_user_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/user/me/identity"

Response:

{
    "data": {
        "id": 42,
        "link_caption": "jane-doe",
        "scopes": [
            {
                "scope": "identity:read",
                "endpoints": [
                    "GET /myty/api/crowdfunding/user/me/identity"
                ]
            },
            {
                "scope": "projects:read",
                "endpoints": [
                    "GET /myty/api/crowdfunding/user/me/projects"
                ]
            }
        ]
    }
}

Get Incentives from Own and Team Projects

GET /user/me/incentives

Key type: User API Key Scope: incentives:read

Returns a paginated list of all active incentives (rewards) from projects where the authenticated user is the initiator or a team member.

Parameters:

Parameter Type Description
sort String Sort order: sold (default), new, price-a, price-d, name-a, name-d, rand
fundable Boolean Filter by fundable projects only
is_favorite Boolean Filter favorites only
limit Integer Maximum number of results (default: 50, max: 100)
offset Integer Starting position for pagination (default: 0)

Example:

curl -H "Authorization: Bearer snx_user_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/user/me/incentives"

Response:

{
    "data": [
        {
            "id": 12345,
            "title": "Limited T-Shirt",
            "price": 25.00,
            "is_available": true,
            "quantity_total": 100,
            "quantity_remaining": 42,
            "project": {
                "id": 678,
                "title": "My Awesome Project",
                "link_caption": "my-awesome-project"
            }
        }
    ],
    "meta": {
        "total": 5,
        "limit": 50,
        "offset": 0
    }
}

List Own and Team Projects

GET /user/me/projects

Key type: User API Key Scope: projects:read

Returns a paginated list of all public projects where the authenticated user is the initiator or a team member. Accepts either a User API Key with projects:read scope or a session cookie.

Parameters:

Parameter Type Description
sort String Sort order: project-end-date-d (default), project-end-date-a, project-activation-date-d, project-activation-date-a, project-title-d, project-title-a, project-funding-sum-d, project-funding-sum-a, project-support-count-d, project-support-count-a, project-fan-count-d, project-fan-count-a, rand
limit Integer Maximum number of results (default: 10, max: 100)
offset Integer Starting position for pagination (default: 0)

Example:

curl -H "Authorization: Bearer snx_user_xxx" \
     "https://www.startnext.com/myty/api/crowdfunding/user/me/projects?sort=project-activation-date-d&limit=20"

Response:

{
    "data": [
        {
            "id": 12345,
            "title": "My Awesome Project",
            "link_caption": "my-awesome-project",
            "status": "active",
            "currency": "EUR",
            "current_funding": 7550.00,
            "funding_threshold": 10000.00,
            "supporter_count": 150
        }
    ],
    "meta": {
        "total": 3,
        "limit": 10,
        "offset": 0
    }
}

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.

Project API Key Limits

Rate limits depend on your project scope:

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:

{
    "status": 429,
    "error": "rate_limit_exceeded",
    "retry_after": 45
}

The Retry-After header indicates how long you need to wait (in seconds).

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

{
    "status": 401,
    "error": "unauthorized"
}
{
    "status": 403,
    "error": "forbidden",
    "error_description": "Missing required scope: fundings:read"
}

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