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:
- 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.
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
/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
}
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);
});
}