Getting started
The API lets you automate releases, check who bought your products and look up your customers.
All endpoints live under https://www.sourcexchange.net/api.
Create a token on the API tokens page
and send it with every request, together with an Accept header so errors come back as JSON:
curl https://www.sourcexchange.net/api/users/me \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Accept: application/json"
A product's numeric ID is shown on your dashboard when you edit the product.
Permissions
Each token has its own permissions, which you choose when creating it.
readis enabled by default and covers everyGETendpoint that returns users or payments.createis needed to publish releases.
A token can never do more than its owner: you only see payments and customers of teams you belong to.
Errors and limits
401the token is missing or invalid.403the token lacks the required permission, or you may not access this resource.404the resource does not exist or is not visible to you.422the request did not pass validation. The body lists the problem per field inerrors.429you sent more than 60 requests in a minute. Wait for the time given in theRetry-Afterheader.
Products
GET /team-products
Any token
Lists every product of the teams you belong to, including drafts.
Returns a list of product objects in data.
GET /products/{id}
Any token, for published products or products you can access
Returns one product object in data.
GET /products/blueprint
Any token
Lists all published products in the Blueprint category.
Product object
{
"id": 42,
"name": "My product",
"short_description": "One line about the product",
"description": "The full description, in Markdown",
"price": 9.99,
"currency": "EUR",
"review_count": 12,
"rating_avg": 4.5,
"url": "https://www.sourcexchange.net/products/my-product",
"cover_url": "https://...",
"media": [],
"team": { "id": 7, "name": "My team", ... }
}
Releases
GET /products/{id}/releases
Any token, for published products or products you can access
Lists the product's releases, newest first.
[
{
"id": 128,
"product_id": 42,
"name": "1.2.0",
"created_at": "2026-01-31T12:00:00.000000Z",
"downloads_count": 311
}
]
POST /products/{id}/releases
create permission, member of the product's team
Publishes a new release. Send the fields as multipart/form-data:
nameup to 30 characters, only letters, digits and_ + . -, for example1.2.0changelogbetween 10 and 4096 charactersstageone ofalpha,betaorstablefilea.zip,.raror.7zarchive of at most 10 MB
curl https://www.sourcexchange.net/api/products/42/releases \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Accept: application/json" \ -F name=1.2.0 \ -F stage=stable \ -F "changelog=Fixed the settings page" \ -F file=@release.zip
Responds with 201 Created:
{
"message": "Release created!",
"release": { "id": 129, "product_id": 42, "name": "1.2.0", "stage": "stable", ... }
}
Users
GET /users/me
read permission
Returns the owner of the token.
{
"data": {
"id": 1,
"name": "Jane Doe",
"email": "jane@example.com",
"profile_photo_url": "https://..."
}
}
GET /users/email?email={email}
read permission
Returns the ID of the user with this email address as a plain number, for example 1.
GET /users/discord?id={discord_id}
read permission
Returns the ID of the user who linked this Discord account as a plain number.
GET /users/{id}/accesses
read permission
Lists which of your teams' products this user has access to. Use it to verify a licence.
payment_remote_id is null when access was granted by hand.
{
"data": [
{ "product_id": 42, "payment_remote_id": "PAYID-ABC123" }
]
}
Payments
GET /payments
read permission
Lists the payments for products of your teams, as a list of
payment objects.
Add ?status=completed to filter by status.
GET /payments/{remote_id}
read permission, owner of the product's team
Returns one payment object by its PayPal or Stripe ID.
GET /products/{id}/payments
read permission, owner of the product's team
Lists all payments for one product.
Payment object
status is one of pending, completed, expired,
error, refund or chargeback.
{
"id": 900,
"user_id": 1,
"product_id": 42,
"remote_id": "PAYID-ABC123",
"price": 9.99,
"fee": null,
"currency": "EUR",
"gateway": "paypal",
"status": "completed",
"payment_gateway_id": 3,
"created_at": "2026-01-31T12:00:00.000000Z",
"updated_at": "2026-01-31T12:00:05.000000Z"
}