Logseq
Provide commands for interacting with a local Logseq instance through its Plugin API. Use for creating pages, inserting blocks, querying the graph database, managing tasks, retrieving content, or auto
Provide commands for interacting with a local Logseq instance through its Plugin API. Use for creating pages, inserting blocks, querying the graph database, managing tasks, retrieving content, or auto
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Interact with your local Logseq instance through its JavaScript Plugin API. This skill enables reading, writing, querying, and automating workflows in your Logseq graph.
Logseq must be running locally with a plugin that exposes the API. The standard way is:
logseq API via HTTP (e.g., via a custom plugin or localhost endpoint)@logseq/libs package to script against the running Logseq instanceThe API is primarily designed for in-browser plugins, so accessing it from external scripts requires a bridge/proxy.
The Logseq Plugin API is organized into these main proxies:
logseq.AppApplication-level operations: getting app info, user configs, current graph, commands, UI state, external links.
Key methods:
getInfo() - Get app version and infogetUserConfigs() - Get user preferences (theme, format, language, etc.)getCurrentGraph() - Get current graph info (name, path, URL)registerCommand(type, opts, action) - Register custom commandspushState(route, params, query) - Navigate to routeslogseq.EditorBlock and page editing operations: creating, updating, moving, querying content.
Key methods:
getBlock(uuid) - Get block by UUIDgetCurrentPage() - Get current page entitygetCurrentPageBlocksTree() - Get all blocks on current pagegetPageBlocksTree(page) - Get all blocks for a specific pageinsertBlock(target, content, opts) - Insert a new blockupdateBlock(uuid, content) - Update block contentcreatePage(pageName, properties, opts) - Create a new pagedeletePage(pageName) - Delete a pagegetPageLinkedReferences(page) - Get backlinks to a pageregisterSlashCommand(tag, action) - Add custom slash commandslogseq.DBDatabase queries using Datalog.
Key methods:
q(query, ...inputs) - Run Datalog querydatascriptQuery(query, ...inputs) - Direct Datascript querylogseq.UIUI operations: messages, dialogs, main UI visibility.
Key methods:
showMsg(content, status) - Show toast notificationqueryElementById(id) - Query DOM elementslogseq.GitGit operations for the current graph.
Key methods:
execCommand(args) - Execute git commandlogseq.AssetsAsset management.
Key methods:
listFilesOfCurrentGraph(path) - List files in graph// Get current page const page = await logseq.Editor.getCurrentPage();// Get all blocks on a page const blocks = await logseq.Editor.getPageBlocksTree('Daily Notes');
// Get a specific block const block = await logseq.Editor.getBlock('block-uuid-here');
// Query with Datalog const results = await logseq.DB.q();[:find (pull ?b [*]) :where [?b :block/marker "TODO"]]
// Create a new page await logseq.Editor.createPage('Project Notes', { tags: 'project', status: 'active' }, { redirect: false });// Insert a block const block = await logseq.Editor.insertBlock( 'target-block-uuid', '- New task item', { before: false, sibling: true } );
// Update a block await logseq.Editor.updateBlock('block-uuid', 'Updated content');
// Batch insert multiple blocks const blocks = [ { content: 'First item' }, { content: 'Second item', children: [ { content: 'Nested item' } ]} ]; await logseq.Editor.insertBatchBlock('parent-uuid', blocks, { sibling: false });
// Find all TODO items const todos = await logseq.DB.q(` [:find (pull ?b [*]) :where [?b :block/marker ?marker] [(contains? #{"TODO" "DOING"} ?marker)]] `);// Mark task as DONE await logseq.Editor.updateBlock('task-uuid', 'DONE Task content');
// Get tasks on current page const page = await logseq.Editor.getCurrentPage(); const blocks = await logseq.Editor.getPageBlocksTree(page.name); const tasks = blocks.filter(b => b.marker === 'TODO' || b.marker === 'DOING');
// Navigate to a page logseq.App.pushState('page', { name: 'Project Notes' });// Show notification logseq.UI.showMsg('✅ Task completed!', 'success');
// Get app config const configs = await logseq.App.getUserConfigs(); console.log('Theme:', configs.preferredThemeMode); console.log('Format:', configs.preferredFormat);
Since Logseq's Plugin API is browser-based, you have several options:
Create a minimal Logseq plugin that exposes API calls via HTTP:
// In Logseq plugin (index.js) logseq.ready(() => { // Expose API endpoints logseq.provideModel({ async handleAPICall({ method, args }) { return await logseq.Editor[method](...args); } }); });// Then call from external script via HTTP POST
For automation scripts, use the
@logseq/libs package:
npm install @logseq/libs
Note: This requires a running Logseq instance and proper connection setup.
Develop a full Logseq plugin following the plugin samples at: https://github.com/logseq/logseq-plugin-samples
For complete API documentation, see:
references/api-types.md (extracted from @logseq/libs){ id: number, // Entity ID uuid: string, // Block UUID content: string, // Block content format: 'markdown' | 'org', page: { id: number }, // Parent page parent: { id: number }, // Parent block left: { id: number }, // Previous sibling properties: {}, // Block properties marker?: string, // TODO/DOING/DONE children?: [] // Child blocks }
{ id: number, uuid: string, name: string, // Page name (lowercase) originalName: string, // Original case 'journal?': boolean, properties: {}, journalDay?: number, // YYYYMMDD for journals }
null if entity doesn't existinsertBatchBlock for multiple insertsblock.properties.propertyNamejournalDay format (YYYYMMDD) not date strings- for bullets, Org uses *prop::) and org (:PROPERTIES:)No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.