Sinkly Support·Guides, references and AI help bots
Developers

Sinkly API & app sign-in

Other products — like Sinkly Recruitment — can add a Sign in with Sinkly button and then read and update the same data the person can see in their console.

How it works

  1. 1Your app sends the person to Sinkly to sign in.
  2. 2Sinkly shows an approval screen naming your app and the account they're signed in as.
  3. 3Once approved, your app receives an access token for that person.
  4. 4Every API call carries the token, and Sinkly answers with exactly what that person is allowed to see or change.

Sinkly uses standard OAuth 2.1 with PKCE, so any normal OAuth client library works. Discovery lives at /.well-known/oauth-protected-resource on sinkly.cc, which points at the authorisation server, and clients can register themselves.

Getting a token

# 1. Discover the endpoints
curl https://sinkly.cc/.well-known/oauth-protected-resource

# 2. Send the person to the authorisation endpoint
#    response_type=code, PKCE (S256), scope=openid email profile
#    They approve on sinkly.cc, then land back on your redirect_uri with ?code=

# 3. Exchange the code for tokens at the token endpoint
#    You get an access_token (and refresh_token) for that person.

Redirect URIs must match exactly

Scheme, host, port, path and trailing slash all have to be identical to what your client registered.

Calling the API

curl https://sinkly.cc/api/public/v1/communities \
  -H "Authorization: Bearer <access_token>"

curl https://sinkly.cc/api/public/v1/communities/the-bl-x-depot/staff?status=active \
  -H "Authorization: Bearer <access_token>"

curl -X POST https://sinkly.cc/api/public/v1/communities/<id>/staff \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{"displayName":"Nova","robloxUserId":"12345","roleId":"<role-uuid>"}'

Endpoints

MethodPathWhat it returns
GET/api/public/v1/meThe signed-in person, their linked Roblox and Discord accounts and their community ids.
GET/api/public/v1/communitiesEvery community that person belongs to.
GET/api/public/v1/communities/{id}One community, its branding and staff count. Accepts an id or a slug.
GET/api/public/v1/communities/{id}/rolesRanks and roles with their permissions and Roblox/Discord mappings.
GET/api/public/v1/communities/{id}/structureDepartments, divisions and teams.
GET/api/public/v1/communities/{id}/staffStaff directory. Filter with status, departmentId, robloxUserId, discordUserId, limit.
GET/api/public/v1/communities/{id}/staff/{staffId}One staff member plus their record history.
POST/api/public/v1/communities/{id}/staffAdd a staff member (needs Manage staff).
PATCH/api/public/v1/communities/{id}/staff/{staffId}Update role, title, unit or status (needs Manage staff).
POST/api/public/v1/communities/{id}/staff/{staffId}/rankApply a Roblox group rank (needs Change Roblox ranks).
GET/api/public/v1/communities/{id}/recordsBehavioural records across the community.
POST/api/public/v1/communities/{id}/recordsWrite a warning, promotion, award or note (needs Manage records).
GET/api/public/v1/communities/{id}/applicationsApplication forms (needs Manage recruitment).
GET/api/public/v1/communities/{id}/submissionsApplication submissions (needs Manage recruitment).
GET/api/public/v1/communities/{id}/activityRecent activity sessions (needs View analytics).

Permissions and errors

The token never grants more than the person already has. Each endpoint checks the same console permission you set on their role, so a recruiter can read the directory and hire, while someone without Manage staff simply gets a refusal.

  • 401 — the token is missing, expired or invalid.
  • 403 — signed in, but not allowed to do that in this community.
  • 404 — unknown community, staff member or endpoint.
  • 409 — something isn't set up, e.g. no Roblox bot for ranking.