API documentation

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.

  • read is enabled by default and covers every GET endpoint that returns users or payments.
  • create is 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

  • 401 the token is missing or invalid.
  • 403 the token lacks the required permission, or you may not access this resource.
  • 404 the resource does not exist or is not visible to you.
  • 422 the request did not pass validation. The body lists the problem per field in errors.
  • 429 you sent more than 60 requests in a minute. Wait for the time given in the Retry-After header.

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:

  • name up to 30 characters, only letters, digits and _ + . -, for example 1.2.0
  • changelog between 10 and 4096 characters
  • stage one of alpha, beta or stable
  • file a .zip, .rar or .7z archive 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"
}