API Documentation

Integrate with StackLinker using GraphQL. Authenticate with your API key and manage workspaces, bookmarks, and folders programmatically.

#Try It

Run queries and mutations directly in your browser. Add your API key in the Headers panel (e.g. {"Authorization": "Bearer YOUR_API_KEY"}).

Download schema.graphql

Loading Playground…

#Authentication

Use your API key to authenticate. You can view and manage API keys in Profile → API Keys.

Profile → API KeysGenerate and manage your API keys

Provide your API key in the Authorization header:Authorization: Bearer YOUR_API_KEY

#Base URL

https://stacklinker.com

#GraphQL Endpoint

All API operations use GraphQL. Send POST requests to the endpoint with a query (or mutation) in the body.

POST https://stacklinker.com/api/graphql

#me

Returns the current authenticated user. The preferredLocale field is used for emails and similar defaults. On the website it updates when you switch language in the footer while signed in.

POST
https://stacklinker.com/api/graphql

Returns the current authenticated user.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query Me { me { id email nickname preferredLocale } }"}'

Response

{
  "data": {
    "me": {
      "id": "/api/users/...",
      "email": "user@example.com",
      "nickname": "John",
      "preferredLocale": "en"
    }
  }
}

#workspaces

Paginated list of workspaces. Use first/after for cursor pagination.

POST
https://stacklinker.com/api/graphql

Paginated list of workspaces. Use first/after for cursor pagination.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query Workspaces { workspaces(first: 10, after: null) { edges { node { id name isPersonal } cursor } pageInfo { hasNextPage endCursor } totalCount } }"}'

#workspace

Single workspace by ID. Use IRI format: /api/workspaces/{uuid}.

POST
https://stacklinker.com/api/graphql

Single workspace by ID. Use IRI format: /api/workspaces/{uuid}.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query Workspace($workspaceId: ID!) { workspace(id: $workspaceId) { id name members { userEmail role } } }"}'

#folders

Folder tree for a workspace. Supports cursor pagination.

POST
https://stacklinker.com/api/graphql

Folder tree for a workspace. Supports cursor pagination.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query Folders($workspaceId: ID!) { folders(workspaceId: $workspaceId) { edges { node { id name parentId } } totalCount } }"}'

#bookmarks

Bookmarks in a workspace. Supports cursor pagination.

POST
https://stacklinker.com/api/graphql

Bookmarks in a workspace. Supports cursor pagination.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query Bookmarks($workspaceId: ID!) { bookmarks(workspaceId: $workspaceId) { edges { node { id name url folderId labels { id name } } } totalCount } }"}'

#Create Bookmark

POST
https://stacklinker.com/api/graphql

Creates a new bookmark in a workspace or folder.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CreateBookmark($workspaceId: ID!, $folderId: ID!) { createBookmarkBookmark(input: { workspaceId: $workspaceId folderId: $folderId name: \"My Bookmark\" url: \"https://example.com\" }) { bookmark { id name url } } }"}'

Response

{
  "data": {
    "createBookmarkBookmark": {
      "bookmark": {
        "id": "/api/bookmarks/...",
        "name": "My Bookmark",
        "url": "https://example.com"
      }
    }
  }
}

#Create Folder

POST
https://stacklinker.com/api/graphql

Creates a new folder in a workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CreateFolder($workspaceId: ID!) { createFolderFolder(input: { workspaceId: $workspaceId name: \"New Folder\" parentId: null }) { folder { id name } } }"}'

#Workspace Actions

POST
https://stacklinker.com/api/graphql

Get paginated members of a workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetPaginatedWorkspaceMembers($workspaceId: ID!, $first: Int, $after: String) { paginatedWorkspaceMembers(workspaceId: $workspaceId, first: $first, after: $after) { edges { node { id userEmail role } cursor } pageInfo { hasNextPage endCursor } totalCount } }"}'
POST
https://stacklinker.com/api/graphql

Create a new workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CreateWorkspace($name: String!) { createWorkspaceWorkspace(input: { name: $name }) { workspace { id name success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Update workspace name and optional icon.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation UpdateWorkspace($id: ID!, $name: String!, $icon: String) { updateWorkspaceWorkspace(input: { id: $id, name: $name, icon: $icon }) { workspace { id name icon success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Delete a workspace (only when allowed).

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation DeleteWorkspace($id: ID!) { deleteWorkspaceWorkspace(input: { id: $id }) { workspace { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Leave a workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation LeaveWorkspace($workspaceId: ID!) { leaveWorkspaceWorkspace(input: { workspaceId: $workspaceId }) { workspace { id success errors } } }"}'

#Folder & Bookmark Actions

POST
https://stacklinker.com/api/graphql

Rename a folder.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation UpdateFolder($folderId: ID!, $name: String!) { updateFolderFolder(input: { folderId: $folderId, name: $name }) { folder { id name success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Delete a folder.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation DeleteFolder($folderId: ID!) { deleteFolderFolder(input: { folderId: $folderId }) { folder { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Move folder to another parent/position.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation MoveFolder($folderId: ID!, $parentId: ID, $position: Int!) { moveFolderFolder(input: { folderId: $folderId, parentId: $parentId, position: $position }) { folder { id parentId position success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Update bookmark name and URL.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation UpdateBookmark($bookmarkId: ID!, $name: String!, $url: String!) { updateBookmarkBookmark(input: { bookmarkId: $bookmarkId, name: $name, url: $url }) { bookmark { id name url success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Delete bookmark.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation DeleteBookmark($bookmarkId: ID!) { deleteBookmarkBookmark(input: { bookmarkId: $bookmarkId }) { bookmark { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Move bookmark to folder/position.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation MoveBookmark($id: ID!, $folderId: ID, $position: Int!) { moveBookmarkBookmark(input: { id: $id, folderId: $folderId, position: $position }) { bookmark { id folderId position success errors } } }"}'

#Invitations

POST
https://stacklinker.com/api/graphql

List invitations for current user.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetWorkspaceInvitations { workspaceInvitations { edges { node { id workspaceName role createdAt } } totalCount } }"}'
POST
https://stacklinker.com/api/graphql

Invite user to workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CreateWorkspaceInvitation($workspaceId: ID!, $email: String!, $role: String!, $groupIds: [ID!]) { createWorkspaceInvitationWorkspaceInvitation( input: { workspaceId: $workspaceId, email: $email, role: $role, groupIds: $groupIds } ) { workspaceInvitation { id email role success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Accept invitation.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation AcceptWorkspaceInvitation($invitationId: ID!) { acceptWorkspaceInvitationWorkspaceInvitation(input: { invitationId: $invitationId }) { workspaceInvitation { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Reject invitation.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation RejectWorkspaceInvitation($invitationId: ID!) { rejectWorkspaceInvitationWorkspaceInvitation(input: { invitationId: $invitationId }) { workspaceInvitation { id success errors } } }"}'

#Sessions & API Keys

POST
https://stacklinker.com/api/graphql

List active login sessions.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetActiveSessions { activeSessions { edges { node { id deviceInfo ipAddress createdAt expiresAt isCurrent } } } }"}'
POST
https://stacklinker.com/api/graphql

Revoke one session.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation RevokeSession($sessionId: ID!) { revokeSessionActiveSession(input: { sessionId: $sessionId }) { activeSession { id } } }"}'
POST
https://stacklinker.com/api/graphql

Revoke all sessions except current.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation RevokeAllSessions { revokeAllSessionsActiveSession(input: {}) { activeSession { id } } }"}'
POST
https://stacklinker.com/api/graphql

List your API keys.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetApiKeys { apiKeys { edges { node { id name keyPrefix scopes createdAt expiresAt isRevoked } } } }"}'
POST
https://stacklinker.com/api/graphql

Create API key.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CreateApiKey($name: String!, $expiresInDays: Int, $scopes: [String!]!) { createApiKeyApiKey(input: { name: $name, expiresInDays: $expiresInDays, scopes: $scopes }) { apiKey { id name token success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Revoke API key.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation RevokeApiKey($apiKeyId: ID!) { revokeApiKeyApiKey(input: { apiKeyId: $apiKeyId }) { apiKey { id isRevoked success errors } } }"}'

#Public Workspaces & Watching

POST
https://stacklinker.com/api/graphql

List public workspaces.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetPublicWorkspaces($search: String) { publicWorkspaces(search: $search) { edges { node { id name publicDescription } } totalCount } }"}'
POST
https://stacklinker.com/api/graphql

Get public workspace detail.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetPublicWorkspace($id: ID!) { publicWorkspace(id: $id) { id name publicDescription } }"}'
POST
https://stacklinker.com/api/graphql

List folders in public workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetPublicFolders($workspaceId: ID!) { publicFolders(workspaceId: $workspaceId) { edges { node { id name parentId position } } totalCount } }"}'
POST
https://stacklinker.com/api/graphql

List bookmarks in public workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetPublicBookmarks($workspaceId: ID!) { publicBookmarks(workspaceId: $workspaceId) { edges { node { id name url folderId position } } totalCount } }"}'
POST
https://stacklinker.com/api/graphql

Watch public workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation WatchWorkspace($watchedWorkspaceId: ID!, $workspaceId: ID) { watchWorkspaceWatchedWorkspace(input: { watchedWorkspaceId: $watchedWorkspaceId, workspaceId: $workspaceId }) { watchedWorkspace { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Stop watching public workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation UnwatchWorkspace($watchedWorkspaceId: ID!) { unwatchWorkspaceWatchedWorkspace(input: { watchedWorkspaceId: $watchedWorkspaceId }) { watchedWorkspace { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Copy public workspace into your own.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CopyFromPublicWorkspace($sourceWorkspaceId: ID!, $name: String!) { copyFromPublicWorkspaceWorkspace(input: { sourceWorkspaceId: $sourceWorkspaceId, name: $name }) { workspace { id name success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Publish/unpublish workspace and update public description.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation UpdateWorkspacePublic($workspaceId: ID!, $isPublic: Boolean!, $publicDescription: String) { updateWorkspacePublicWorkspace(input: { workspaceId: $workspaceId, isPublic: $isPublic, publicDescription: $publicDescription }) { workspace { id isPublic publicDescription success errors } } }"}'

#User Groups, Labels & Access

POST
https://stacklinker.com/api/graphql

List user groups in workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetUserGroups($workspaceId: ID!) { userGroups(workspaceId: $workspaceId) { edges { node { id name members { id userEmail } } } totalCount } }"}'
POST
https://stacklinker.com/api/graphql

Create user group.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CreateUserGroup($workspaceId: ID!, $name: String!) { createUserGroupUserGroup(input: { workspaceId: $workspaceId, name: $name }) { userGroup { id name success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Rename user group.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation UpdateUserGroup($groupId: ID!, $name: String!) { updateUserGroupUserGroup(input: { groupId: $groupId, name: $name }) { userGroup { id name success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Delete user group.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation DeleteUserGroup($groupId: ID!) { deleteUserGroupUserGroup(input: { groupId: $groupId }) { userGroup { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Add member to group.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation AddUserGroupMember($groupId: ID!, $userId: ID!) { addUserGroupMemberUserGroup(input: { groupId: $groupId, userId: $userId }) { userGroup { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Remove member from group.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation RemoveUserGroupMember($groupId: ID!, $userId: ID!) { removeUserGroupMemberUserGroup(input: { groupId: $groupId, userId: $userId }) { userGroup { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

List your personal bookmark labels in a workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"query GetBookmarkLabels($workspaceId: ID!) { bookmarkLabels(workspaceId: $workspaceId) { edges { node { id name workspaceId createdAt } } totalCount } }"}'
POST
https://stacklinker.com/api/graphql

Create a new personal bookmark label for a workspace.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CreateBookmarkLabel($workspaceId: ID!, $name: String!) { createBookmarkLabelBookmarkLabel(input: { workspaceId: $workspaceId, name: $name }) { bookmarkLabel { id name workspaceId createdAt success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Rename one of your personal bookmark labels.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation UpdateBookmarkLabel($labelId: ID!, $name: String!) { updateBookmarkLabelBookmarkLabel(input: { labelId: $labelId, name: $name }) { bookmarkLabel { id name success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Delete one of your personal bookmark labels.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation DeleteBookmarkLabel($labelId: ID!) { deleteBookmarkLabelBookmarkLabel(input: { labelId: $labelId }) { bookmarkLabel { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Assign groups to folder (optional public mode).

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation AssignGroupsToFolder($folderId: ID!, $groupIds: [ID!]!, $isPublic: Boolean) { assignGroupsToFolderFolder(input: { folderId: $folderId, groupIds: $groupIds, isPublic: $isPublic }) { folder { id isPublic success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Remove selected groups from folder.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation RemoveGroupsFromFolder($folderId: ID!, $groupIds: [ID!]!) { removeGroupsFromFolderFolder(input: { folderId: $folderId, groupIds: $groupIds }) { folder { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Apply groups/public mode to folder and all children.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation ApplyGroupsToFolderAndChildren($folderId: ID!, $groupIds: [ID!]!, $isPublic: Boolean) { applyGroupsToFolderAndChildrenFolder(input: { folderId: $folderId, groupIds: $groupIds, isPublic: $isPublic }) { folder { id isPublic success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Assign groups to bookmark.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation AssignGroupsToBookmark($bookmarkId: ID!, $groupIds: [ID!]!) { assignGroupsToBookmarkBookmark(input: { bookmarkId: $bookmarkId, groupIds: $groupIds }) { bookmark { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Remove groups from bookmark.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation RemoveGroupsFromBookmark($bookmarkId: ID!, $groupIds: [ID!]!) { removeGroupsFromBookmarkBookmark(input: { bookmarkId: $bookmarkId, groupIds: $groupIds }) { bookmark { id success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Replace your personal labels on a bookmark.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation SetBookmarkLabels($bookmarkId: ID!, $labelIds: [ID!]!) { setBookmarkLabelsBookmark(input: { bookmarkId: $bookmarkId, labelIds: $labelIds }) { bookmark { id name labels { id name } success errors } } }"}'

#Account Actions

POST
https://stacklinker.com/api/graphql

Update nickname and/or newsletter. You can omit any field to leave it unchanged. Optional preferredLocale (`en` or `cs`) is still accepted for API clients; on the web it is saved automatically when you change the site language in the footer. Admins can set locale for any user via updateUserSettingsByAdminUserSettings.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation UpdateUserSettings($nickname: String, $preferredLocale: String, $newsletter: Boolean) { updateSettingsUserSettings(input: { nickname: $nickname, preferredLocale: $preferredLocale, newsletter: $newsletter }) { userSettings { success errors user { id nickname preferredLocale newsletter } } } }"}'
POST
https://stacklinker.com/api/graphql

Change account password.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation ChangePassword($currentPassword: String!, $newPassword: String!) { changePasswordUserSettings(input: { currentPassword: $currentPassword, newPassword: $newPassword }) { userSettings { success errors } } }"}'
POST
https://stacklinker.com/api/graphql

Mark onboarding as completed.

API keys: Profile → API Keys

curl -X POST https://stacklinker.com/api/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation CompleteOnboarding { completeOnboardingMe(input: {}) { me { id onboardingCompleted } } }"}'

#REST Endpoints

These endpoints use standard HTTP (not GraphQL) and accept Authorization: Bearer YOUR_API_KEY. Bookmark import uses multipart/form-data for file upload. Reorganize uses a plain POST with no body.

POST
https://stacklinker.com/api/workspaces/{uuid}/import-bookmarks

Import bookmarks from a browser HTML export file (Netscape format). Supports Chrome, Firefox, Safari, Edge exports. Add reset=true to replace all existing bookmarks and folders first (requires admin role).

API keys: Profile → API Keys

Bearer
curl -X POST https://stacklinker.com/api/workspaces/WORKSPACE_UUID/import-bookmarks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@/path/to/bookmarks.html" 

Response

{
  "success": true,
  "importedFolders": 12,
  "importedBookmarks": 87,
  "errors": []
}
POST
https://stacklinker.com/api/workspaces/{uuid}/import-bookmarks-ai

Import bookmarks from a browser HTML export and let AI create an optimized folder hierarchy. Runs asynchronously — you receive an email when done. Add reset=true to replace existing structure first (requires admin role). Rate limited: 1 per minute, 30 per day.

API keys: Profile → API Keys

Bearer
curl -X POST https://stacklinker.com/api/workspaces/WORKSPACE_UUID/import-bookmarks-ai \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@/path/to/bookmarks.html" 

Response

{
  "success": true,
  "pending": true,
  "importedFolders": 0,
  "importedBookmarks": 0,
  "errors": []
}
POST
https://stacklinker.com/api/workspaces/{uuid}/reorganize-ai

Reorganize all existing workspace bookmarks using AI. All bookmarks are preserved but the folder structure is replaced with an AI-generated hierarchy. Requires admin role. Runs asynchronously — you receive an email when done. Rate limited: 1 per minute, 30 per day.

API keys: Profile → API Keys

Bearer
curl -X POST https://stacklinker.com/api/workspaces/WORKSPACE_UUID/reorganize-ai \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "pending": true,
  "errors": []
}

#ID Format

All IDs use IRI format: /api/workspaces/{uuid}, /api/folders/{uuid}, /api/bookmarks/{uuid}.

#Errors

GraphQL returns errors in the errors array. Validation errors use status 422. Unauthorized uses 401.

{
  "errors": [
    {
      "message": "Access denied.",
      "extensions": { "status": 401 }
    }
  ]
}

#Rate Limiting

Rate limits apply to prevent abuse. Check Retry-After header on 429.