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:
- Open your project on Startnext
- Go to Project Interface → Administration → API Keys
- Click Create New API Key
- Select the required permissions (scopes)
- 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:
- Log in to Startnext
- Go to Settings → API & Integrations
- Click Create New API Key
- Enter a name — the
identity:readscope is always included automatically - 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
Authorizationheader), you can alternatively pass the key viax-access-token:x-access-token: snx_proj_xxxxxxxxxxxxxxxxThis 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
/ordersendpoint with theorders:readscope 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);
});
}