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"}).
#Authentication
Use your API key to authenticate. You can view and manage API keys in Profile → API Keys.
Profile → API Keys — Generate 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.
https://stacklinker.com/api/graphqlReturns 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.
https://stacklinker.com/api/graphqlPaginated 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}.
https://stacklinker.com/api/graphqlSingle 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.
https://stacklinker.com/api/graphqlFolder 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.
https://stacklinker.com/api/graphqlBookmarks 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
https://stacklinker.com/api/graphqlCreates 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
https://stacklinker.com/api/graphqlCreates 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
https://stacklinker.com/api/graphqlGet 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 } }"}'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 } } }"}'https://stacklinker.com/api/graphqlUpdate 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 } } }"}'https://stacklinker.com/api/graphqlDelete 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 } } }"}'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
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 } } }"}'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 } } }"}'https://stacklinker.com/api/graphqlMove 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 } } }"}'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 } } }"}'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 } } }"}'https://stacklinker.com/api/graphqlMove 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
https://stacklinker.com/api/graphqlList 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 } }"}'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 } } }"}'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 } } }"}'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
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 } } } }"}'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 } } }"}'https://stacklinker.com/api/graphqlRevoke 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 } } }"}'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 } } } }"}'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 } } }"}'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
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 } }"}'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 } }"}'https://stacklinker.com/api/graphqlList 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 } }"}'https://stacklinker.com/api/graphqlList 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 } }"}'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 } } }"}'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 } } }"}'https://stacklinker.com/api/graphqlCopy 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 } } }"}'https://stacklinker.com/api/graphqlPublish/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
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 } }"}'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 } } }"}'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 } } }"}'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 } } }"}'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 } } }"}'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 } } }"}'https://stacklinker.com/api/graphqlList 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 } }"}'https://stacklinker.com/api/graphqlCreate 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 } } }"}'https://stacklinker.com/api/graphqlRename 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 } } }"}'https://stacklinker.com/api/graphqlDelete 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 } } }"}'https://stacklinker.com/api/graphqlAssign 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 } } }"}'https://stacklinker.com/api/graphqlRemove 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 } } }"}'https://stacklinker.com/api/graphqlApply 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 } } }"}'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 } } }"}'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 } } }"}'https://stacklinker.com/api/graphqlReplace 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
https://stacklinker.com/api/graphqlUpdate 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 } } } }"}'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 } } }"}'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.
https://stacklinker.com/api/workspaces/{uuid}/import-bookmarksImport 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
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": []
}https://stacklinker.com/api/workspaces/{uuid}/import-bookmarks-aiImport 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
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": []
}https://stacklinker.com/api/workspaces/{uuid}/reorganize-aiReorganize 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
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.