Skip to main content

Overview

The OpenSource Together API is a REST API that powers projects, users, tech stacks and categories on opensource-together.com. Every endpoint on the following pages is generated from the live OpenAPI specification, so what you read here is what the API actually serves.
The API is a closed-source service. You don’t need access to it to contribute. The web app ships a complete local mock of this exact contract. See Run the app locally and the Mock API guide.

Base URL

Paths are mounted at the root. It’s /users/me, not /api/users/me. The interactive playground on each endpoint page targets production. The API’s own Swagger UI is available at api.opensource-together.com/api-docs, and the raw specification at /api-docs-json.

Authentication

Authentication is cookie-based, handled by better-auth mounted at /api/auth/*. There are no API keys and no Authorization header. Every request must send cookies:
The session cookie is named better-auth.session_token. Requests without a valid session against a protected endpoint return 401.
The /api/auth/* routes are not part of the OpenAPI specification below. Better-auth mounts its own handler, which the generator doesn’t see. They’re documented here instead.

Auth routes used by the app

Sign-in providers exposed by the app are GitHub and GitLab. Email/password sign-in is disabled.
In practice the web app treats GET /users/me as its source of truth for “who am I”. It returns the full profile, and null on a 401.

Response format

Success

Every successful response wraps its payload in data and carries a server timestamp:

Paginated collections

List endpoints add a pagination block alongside data:
Paginated endpoints accept page (from 1) and per_page (1100).

Errors

error is a string, not an object. details is optional and carries a machine-readable code:
Validation failures return a list of field errors instead:
Some write endpoints return 204 No Content with an empty body, such as deleting a project and removing a bookmark.

Resource IDs

Public identifiers are prefixed strings, so an ID is always self-describing: The /users/{id} routes also accept the literal me in place of an ID.

Endpoints

Projects

Discovery, creation, issues, bookmarks, claiming, and media

Users

Profiles, repositories, pull requests, and bookmarks

Tech Stacks

The technology and language taxonomy

Categories

The project category taxonomy

Health

Service health check

Keeping this reference up to date

The specification is a direct dump of the API’s Swagger output, never hand-edited. To refresh it, see Contribute to the docs.