# API Documentation Contract version: 1.6.0 This reference documents all Python runtime API calls available through `bds_api` in embedded Pyodide. `bds_api` is available in both **macro scripts** (executed during preview and page generation) and **transform scripts** (executed during blogmark import). In macro entrypoints, API calls run in the same runtime context as the macro and can be used to fetch posts, media, tags, or other application data. ## Usage ```python from bds_api import bds # inside an async Python function in bDS runtime: project = await bds.meta.get_project_metadata() ``` ## Table of contents - [projects](#projects) - [posts](#posts) - [media](#media) - [scripts](#scripts) - [tasks](#tasks) - [app](#app) - [meta](#meta) - [tags](#tags) - [chat](#chat) - [sync](#sync) - [Data Structures](#data-structures) ## projects **Module APIs** - [projects.create](#projectscreate) - [projects.update](#projectsupdate) - [projects.delete](#projectsdelete) - [projects.deleteWithData](#projectsdeletewithdata) - [projects.get](#projectsget) - [projects.getAll](#projectsgetall) - [projects.getActive](#projectsgetactive) - [projects.setActive](#projectssetactive) ### projects.create Create a project. **Parameters** - data (dict, required) **Response specification** - Return type: `ProjectData` - Data structures: `ProjectData` **Example call** ```python from bds_api import bds result = await bds.projects.create(data={}) ``` **Example response** ```python { 'id': 'value', 'name': 'value', 'slug': 'value', 'description': 'value', 'dataPath': 'value', 'isActive': False, 'createdAt': 'value', 'updatedAt': 'value' } ``` ### projects.update Update a project by id. **Parameters** - id (str, required) - data (dict, required) **Response specification** - Return type: `ProjectData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ProjectData` **Example call** ```python from bds_api import bds result = await bds.projects.update(id='id-1', data={}) ``` **Example response** ```python None # or { 'id': 'value', 'name': 'value', 'slug': 'value', 'description': 'value', 'dataPath': 'value', 'isActive': False, 'createdAt': 'value', 'updatedAt': 'value' } ``` ### projects.delete Delete a project by id. **Parameters** - id (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.projects.delete(id='id-1') ``` **Example response** ```python True ``` ### projects.deleteWithData Delete a project and data by id. **Parameters** - id (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.projects.delete_with_data(id='id-1') ``` **Example response** ```python True ``` ### projects.get Fetch one project by id. **Parameters** - id (str, required) **Response specification** - Return type: `ProjectData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ProjectData` **Example call** ```python from bds_api import bds result = await bds.projects.get(id='id-1') ``` **Example response** ```python None # or { 'id': 'value', 'name': 'value', 'slug': 'value', 'description': 'value', 'dataPath': 'value', 'isActive': False, 'createdAt': 'value', 'updatedAt': 'value' } ``` ### projects.getAll Fetch all projects. **Parameters** - None **Response specification** - Return type: `ProjectData[]` - Data structures: `ProjectData` **Example call** ```python from bds_api import bds result = await bds.projects.get_all() ``` **Example response** ```python [ { 'id': 'value', 'name': 'value', 'slug': 'value', 'description': 'value', 'dataPath': 'value', 'isActive': False, 'createdAt': 'value', 'updatedAt': 'value' } ] ``` ### projects.getActive Fetch active project. **Parameters** - None **Response specification** - Return type: `ProjectData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ProjectData` **Example call** ```python from bds_api import bds result = await bds.projects.get_active() ``` **Example response** ```python None # or { 'id': 'value', 'name': 'value', 'slug': 'value', 'description': 'value', 'dataPath': 'value', 'isActive': False, 'createdAt': 'value', 'updatedAt': 'value' } ``` ### projects.setActive Set active project by id. **Parameters** - id (str, required) **Response specification** - Return type: `ProjectData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ProjectData` **Example call** ```python from bds_api import bds result = await bds.projects.set_active(id='id-1') ``` **Example response** ```python None # or { 'id': 'value', 'name': 'value', 'slug': 'value', 'description': 'value', 'dataPath': 'value', 'isActive': False, 'createdAt': 'value', 'updatedAt': 'value' } ``` [↑ Back to Table of contents](#table-of-contents) ## posts **Module APIs** - [posts.create](#postscreate) - [posts.update](#postsupdate) - [posts.delete](#postsdelete) - [posts.get](#postsget) - [posts.getPreviewUrl](#postsgetpreviewurl) - [posts.getAll](#postsgetall) - [posts.getByStatus](#postsgetbystatus) - [posts.publish](#postspublish) - [posts.discard](#postsdiscard) - [posts.hasPublishedVersion](#postshaspublishedversion) - [posts.rebuildFromFiles](#postsrebuildfromfiles) - [posts.reindexText](#postsreindextext) - [posts.search](#postssearch) - [posts.filter](#postsfilter) - [posts.getTags](#postsgettags) - [posts.getCategories](#postsgetcategories) - [posts.getByYearMonth](#postsgetbyyearmonth) - [posts.getDashboardStats](#postsgetdashboardstats) - [posts.getTagsWithCounts](#postsgettagswithcounts) - [posts.getCategoriesWithCounts](#postsgetcategorieswithcounts) - [posts.getLinksTo](#postsgetlinksto) - [posts.getLinkedBy](#postsgetlinkedby) - [posts.rebuildLinks](#postsrebuildlinks) - [posts.isSlugAvailable](#postsisslugavailable) - [posts.generateUniqueSlug](#postsgenerateuniqueslug) ### posts.create Create a post. **Parameters** - data (dict, required) **Response specification** - Return type: `PostData` - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.create(data={}) ``` **Example response** ```python { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ``` ### posts.update Update a post by id. **Parameters** - id (str, required) - data (dict, required) **Response specification** - Return type: `PostData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.update(id='id-1', data={}) ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ``` ### posts.delete Delete a post by id. **Parameters** - id (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.posts.delete(id='id-1') ``` **Example response** ```python True ``` ### posts.get Fetch one post by id. **Parameters** - postId (str, required) **Response specification** - Return type: `PostData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.get(post_id='post-1') ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ``` ### posts.getPreviewUrl Get preview URL for post. **Parameters** - id (str, required) - options (dict, optional) **Response specification** - Return type: `string | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.posts.get_preview_url(id='id-1') ``` **Example response** ```python None # or dict-like object when found ``` ### posts.getAll Fetch posts with pagination. **Parameters** - options (dict, optional) **Response specification** - Return type: `PaginatedPostsResult` **Example call** ```python from bds_api import bds result = await bds.posts.get_all() ``` **Example response** ```python {} ``` ### posts.getByStatus Fetch posts by status. **Parameters** - status (str, required) **Response specification** - Return type: `PostData[]` - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.get_by_status(status='status') ``` **Example response** ```python [ { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ] ``` ### posts.publish Publish a post by id. **Parameters** - id (str, required) **Response specification** - Return type: `PostData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.publish(id='id-1') ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ``` ### posts.discard Discard draft changes for post. **Parameters** - id (str, required) **Response specification** - Return type: `PostData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.discard(id='id-1') ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ``` ### posts.hasPublishedVersion Check if post has published version. **Parameters** - id (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.posts.has_published_version(id='id-1') ``` **Example response** ```python True ``` ### posts.rebuildFromFiles Rebuild posts database from files. **Parameters** - None **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.posts.rebuild_from_files() ``` **Example response** ```python None ``` ### posts.reindexText Reindex post search text. **Parameters** - None **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.posts.reindex_text() ``` **Example response** ```python None ``` ### posts.search Search posts by free-text query. **Parameters** - query (str, required) **Response specification** - Return type: `SearchResult[]` **Example call** ```python from bds_api import bds result = await bds.posts.search(query='search phrase') ``` **Example response** ```python [] ``` ### posts.filter Filter posts by criteria. **Parameters** - filter (dict, required) **Response specification** - Return type: `PostData[]` - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.filter(filter={}) ``` **Example response** ```python [ { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ] ``` ### posts.getTags Get all post tags. **Parameters** - None **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.posts.get_tags() ``` **Example response** ```python [] ``` ### posts.getCategories Get all post categories. **Parameters** - None **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.posts.get_categories() ``` **Example response** ```python [] ``` ### posts.getByYearMonth Get post counts grouped by year/month. **Parameters** - None **Response specification** - Return type: `Array<{ year: number; month: number; count: number } >` **Example call** ```python from bds_api import bds result = await bds.posts.get_by_year_month() ``` **Example response** ```python [] ``` ### posts.getDashboardStats Get post dashboard stats. **Parameters** - None **Response specification** - Return type: `DashboardStats` **Example call** ```python from bds_api import bds result = await bds.posts.get_dashboard_stats() ``` **Example response** ```python {} ``` ### posts.getTagsWithCounts Get post tags with counts. **Parameters** - None **Response specification** - Return type: `TagCount[]` **Example call** ```python from bds_api import bds result = await bds.posts.get_tags_with_counts() ``` **Example response** ```python [] ``` ### posts.getCategoriesWithCounts Get post categories with counts. **Parameters** - None **Response specification** - Return type: `CategoryCount[]` **Example call** ```python from bds_api import bds result = await bds.posts.get_categories_with_counts() ``` **Example response** ```python [] ``` ### posts.getLinksTo Get posts linked to given post. **Parameters** - id (str, required) **Response specification** - Return type: `PostData[]` - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.get_links_to(id='id-1') ``` **Example response** ```python [ { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ] ``` ### posts.getLinkedBy Get posts linking to given post. **Parameters** - id (str, required) **Response specification** - Return type: `PostData[]` - Data structures: `PostData` **Example call** ```python from bds_api import bds result = await bds.posts.get_linked_by(id='id-1') ``` **Example response** ```python [ { 'id': 'value', 'projectId': 'value', 'title': 'value', 'slug': 'value', 'excerpt': 'value', 'content': 'value', 'status': None, 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'publishedAt': 'value', 'tags': 'value', 'categories': 'value' } ] ``` ### posts.rebuildLinks Rebuild post link graph. **Parameters** - None **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.posts.rebuild_links() ``` **Example response** ```python None ``` ### posts.isSlugAvailable Check if post slug is available. **Parameters** - slug (str, required) - excludePostId (str, optional) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.posts.is_slug_available(slug='slug') ``` **Example response** ```python True ``` ### posts.generateUniqueSlug Generate unique slug from title. **Parameters** - title (str, required) - excludePostId (str, optional) **Response specification** - Return type: `string` **Example call** ```python from bds_api import bds result = await bds.posts.generate_unique_slug(title='title') ``` **Example response** ```python 'value' ``` [↑ Back to Table of contents](#table-of-contents) ## media **Module APIs** - [media.import](#mediaimport) - [media.update](#mediaupdate) - [media.replaceFile](#mediareplacefile) - [media.delete](#mediadelete) - [media.get](#mediaget) - [media.getUrl](#mediageturl) - [media.getFilePath](#mediagetfilepath) - [media.getAll](#mediagetall) - [media.rebuildFromFiles](#mediarebuildfromfiles) - [media.reindexText](#mediareindextext) - [media.getThumbnail](#mediagetthumbnail) - [media.regenerateThumbnails](#mediaregeneratethumbnails) - [media.regenerateMissingThumbnails](#mediaregeneratemissingthumbnails) - [media.filter](#mediafilter) - [media.search](#mediasearch) - [media.getByYearMonth](#mediagetbyyearmonth) - [media.getTags](#mediagettags) - [media.getTagsWithCounts](#mediagettagswithcounts) ### media.import Import media file. **Parameters** - sourcePath (str, required) - metadata (dict, optional) **Response specification** - Return type: `MediaData` - Data structures: `MediaData` **Example call** ```python from bds_api import bds result = await bds.media.import(source_path='source_path') ``` **Example response** ```python { 'id': 'value', 'projectId': 'value', 'filename': 'value', 'originalName': 'value', 'mimeType': 'value', 'size': 0, 'width': 0, 'height': 0, 'title': 'value', 'alt': 'value', 'caption': 'value', 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'tags': 'value' } ``` ### media.update Update media metadata by id. **Parameters** - id (str, required) - data (dict, required) **Response specification** - Return type: `MediaData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `MediaData` **Example call** ```python from bds_api import bds result = await bds.media.update(id='id-1', data={}) ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'filename': 'value', 'originalName': 'value', 'mimeType': 'value', 'size': 0, 'width': 0, 'height': 0, 'title': 'value', 'alt': 'value', 'caption': 'value', 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'tags': 'value' } ``` ### media.replaceFile Replace media file by id. **Parameters** - id (str, required) - newSourcePath (str, required) **Response specification** - Return type: `MediaData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `MediaData` **Example call** ```python from bds_api import bds result = await bds.media.replace_file(id='id-1', new_source_path='new_source_path') ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'filename': 'value', 'originalName': 'value', 'mimeType': 'value', 'size': 0, 'width': 0, 'height': 0, 'title': 'value', 'alt': 'value', 'caption': 'value', 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'tags': 'value' } ``` ### media.delete Delete media by id. **Parameters** - id (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.media.delete(id='id-1') ``` **Example response** ```python True ``` ### media.get Fetch one media by id. **Parameters** - id (str, required) **Response specification** - Return type: `MediaData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `MediaData` **Example call** ```python from bds_api import bds result = await bds.media.get(id='id-1') ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'filename': 'value', 'originalName': 'value', 'mimeType': 'value', 'size': 0, 'width': 0, 'height': 0, 'title': 'value', 'alt': 'value', 'caption': 'value', 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'tags': 'value' } ``` ### media.getUrl Get media URL by id. **Parameters** - id (str, required) **Response specification** - Return type: `string | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.media.get_url(id='id-1') ``` **Example response** ```python None # or dict-like object when found ``` ### media.getFilePath Get media file path by id. **Parameters** - id (str, required) **Response specification** - Return type: `string | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.media.get_file_path(id='id-1') ``` **Example response** ```python None # or dict-like object when found ``` ### media.getAll Fetch all media. **Parameters** - None **Response specification** - Return type: `MediaData[]` - Data structures: `MediaData` **Example call** ```python from bds_api import bds result = await bds.media.get_all() ``` **Example response** ```python [ { 'id': 'value', 'projectId': 'value', 'filename': 'value', 'originalName': 'value', 'mimeType': 'value', 'size': 0, 'width': 0, 'height': 0, 'title': 'value', 'alt': 'value', 'caption': 'value', 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'tags': 'value' } ] ``` ### media.rebuildFromFiles Rebuild media database from files. **Parameters** - None **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.media.rebuild_from_files() ``` **Example response** ```python None ``` ### media.reindexText Reindex media search text. **Parameters** - None **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.media.reindex_text() ``` **Example response** ```python None ``` ### media.getThumbnail Get media thumbnail URL. **Parameters** - id (str, required) - size (str, optional) **Response specification** - Return type: `string | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.media.get_thumbnail(id='id-1') ``` **Example response** ```python None # or dict-like object when found ``` ### media.regenerateThumbnails Regenerate thumbnails for media. **Parameters** - id (str, required) **Response specification** - Return type: `Record | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.media.regenerate_thumbnails(id='id-1') ``` **Example response** ```python None # or dict-like object when found ``` ### media.regenerateMissingThumbnails Regenerate all missing thumbnails. **Parameters** - None **Response specification** - Return type: `{ processed: number; generated: number; failed: number }` **Example call** ```python from bds_api import bds result = await bds.media.regenerate_missing_thumbnails() ``` **Example response** ```python {} ``` ### media.filter Filter media by criteria. **Parameters** - filter (dict, required) **Response specification** - Return type: `MediaData[]` - Data structures: `MediaData` **Example call** ```python from bds_api import bds result = await bds.media.filter(filter={}) ``` **Example response** ```python [ { 'id': 'value', 'projectId': 'value', 'filename': 'value', 'originalName': 'value', 'mimeType': 'value', 'size': 0, 'width': 0, 'height': 0, 'title': 'value', 'alt': 'value', 'caption': 'value', 'author': 'value', 'createdAt': 'value', 'updatedAt': 'value', 'tags': 'value' } ] ``` ### media.search Search media by free-text query. **Parameters** - query (str, required) **Response specification** - Return type: `MediaSearchResult[]` **Example call** ```python from bds_api import bds result = await bds.media.search(query='search phrase') ``` **Example response** ```python [] ``` ### media.getByYearMonth Get media counts grouped by year/month. **Parameters** - None **Response specification** - Return type: `Array<{ year: number; month: number; count: number } >` **Example call** ```python from bds_api import bds result = await bds.media.get_by_year_month() ``` **Example response** ```python [] ``` ### media.getTags Get all media tags. **Parameters** - None **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.media.get_tags() ``` **Example response** ```python [] ``` ### media.getTagsWithCounts Get media tags with counts. **Parameters** - None **Response specification** - Return type: `TagCount[]` **Example call** ```python from bds_api import bds result = await bds.media.get_tags_with_counts() ``` **Example response** ```python [] ``` [↑ Back to Table of contents](#table-of-contents) ## scripts **Module APIs** - [scripts.create](#scriptscreate) - [scripts.update](#scriptsupdate) - [scripts.delete](#scriptsdelete) - [scripts.get](#scriptsget) - [scripts.getAll](#scriptsgetall) - [scripts.rebuildFromFiles](#scriptsrebuildfromfiles) ### scripts.create Create script. **Parameters** - data (dict, required) **Response specification** - Return type: `ScriptData` - Data structures: `ScriptData` **Example call** ```python from bds_api import bds result = await bds.scripts.create(data={}) ``` **Example response** ```python { 'id': 'value', 'projectId': 'value', 'slug': 'value', 'title': 'value', 'kind': None, 'entrypoint': 'value', 'enabled': False, 'version': 0, 'filePath': 'value', 'content': 'value', 'createdAt': 'value', 'updatedAt': 'value' } ``` ### scripts.update Update script by id. **Parameters** - id (str, required) - data (dict, required) **Response specification** - Return type: `ScriptData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ScriptData` **Example call** ```python from bds_api import bds result = await bds.scripts.update(id='id-1', data={}) ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'slug': 'value', 'title': 'value', 'kind': None, 'entrypoint': 'value', 'enabled': False, 'version': 0, 'filePath': 'value', 'content': 'value', 'createdAt': 'value', 'updatedAt': 'value' } ``` ### scripts.delete Delete script by id. **Parameters** - id (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.scripts.delete(id='id-1') ``` **Example response** ```python True ``` ### scripts.get Fetch script by id. **Parameters** - id (str, required) **Response specification** - Return type: `ScriptData | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ScriptData` **Example call** ```python from bds_api import bds result = await bds.scripts.get(id='id-1') ``` **Example response** ```python None # or { 'id': 'value', 'projectId': 'value', 'slug': 'value', 'title': 'value', 'kind': None, 'entrypoint': 'value', 'enabled': False, 'version': 0, 'filePath': 'value', 'content': 'value', 'createdAt': 'value', 'updatedAt': 'value' } ``` ### scripts.getAll Fetch all scripts. **Parameters** - None **Response specification** - Return type: `ScriptData[]` - Data structures: `ScriptData` **Example call** ```python from bds_api import bds result = await bds.scripts.get_all() ``` **Example response** ```python [ { 'id': 'value', 'projectId': 'value', 'slug': 'value', 'title': 'value', 'kind': None, 'entrypoint': 'value', 'enabled': False, 'version': 0, 'filePath': 'value', 'content': 'value', 'createdAt': 'value', 'updatedAt': 'value' } ] ``` ### scripts.rebuildFromFiles Rebuild scripts from files. **Parameters** - None **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.scripts.rebuild_from_files() ``` **Example response** ```python None ``` [↑ Back to Table of contents](#table-of-contents) ## tasks **Module APIs** - [tasks.getAll](#tasksgetall) - [tasks.getRunning](#tasksgetrunning) - [tasks.cancel](#taskscancel) - [tasks.clearCompleted](#tasksclearcompleted) ### tasks.getAll Fetch all tasks. **Parameters** - None **Response specification** - Return type: `TaskProgress[]` - Data structures: `TaskProgress` **Example call** ```python from bds_api import bds result = await bds.tasks.get_all() ``` **Example response** ```python [ { 'taskId': 'value', 'name': 'value', 'status': None, 'progress': 0, 'message': 'value', 'startTime': 'value', 'endTime': 'value', 'error': 'value', 'groupId': 'value', 'groupName': 'value' } ] ``` ### tasks.getRunning Fetch running tasks. **Parameters** - None **Response specification** - Return type: `TaskProgress[]` - Data structures: `TaskProgress` **Example call** ```python from bds_api import bds result = await bds.tasks.get_running() ``` **Example response** ```python [ { 'taskId': 'value', 'name': 'value', 'status': None, 'progress': 0, 'message': 'value', 'startTime': 'value', 'endTime': 'value', 'error': 'value', 'groupId': 'value', 'groupName': 'value' } ] ``` ### tasks.cancel Cancel task by id. **Parameters** - taskId (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.tasks.cancel(task_id='task-1') ``` **Example response** ```python True ``` ### tasks.clearCompleted Clear completed tasks. **Parameters** - None **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.tasks.clear_completed() ``` **Example response** ```python None ``` [↑ Back to Table of contents](#table-of-contents) ## app **Module APIs** - [app.getDataPaths](#appgetdatapaths) - [app.getSystemLanguage](#appgetsystemlanguage) - [app.getTitleBarMetrics](#appgettitlebarmetrics) - [app.openFolder](#appopenfolder) - [app.showItemInFolder](#appshowiteminfolder) - [app.selectFolder](#appselectfolder) - [app.getDefaultProjectPath](#appgetdefaultprojectpath) - [app.readProjectMetadata](#appreadprojectmetadata) - [app.getBlogmarkBookmarklet](#appgetblogmarkbookmarklet) - [app.copyToClipboard](#appcopytoclipboard) - [app.notifyRendererReady](#appnotifyrendererready) - [app.setPreviewPostTarget](#appsetpreviewposttarget) - [app.triggerMenuAction](#apptriggermenuaction) ### app.getDataPaths Get app data paths. **Parameters** - None **Response specification** - Return type: `{ database: string; posts: string; media: string }` **Example call** ```python from bds_api import bds result = await bds.app.get_data_paths() ``` **Example response** ```python {} ``` ### app.getSystemLanguage Get system language. **Parameters** - None **Response specification** - Return type: `string` **Example call** ```python from bds_api import bds result = await bds.app.get_system_language() ``` **Example response** ```python 'value' ``` ### app.getTitleBarMetrics Get title bar metrics. **Parameters** - None **Response specification** - Return type: `{ macosLeftInset: number } | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.app.get_title_bar_metrics() ``` **Example response** ```python None # or dict-like object when found ``` ### app.openFolder Open folder in system file manager. **Parameters** - folderPath (str, required) **Response specification** - Return type: `string` **Example call** ```python from bds_api import bds result = await bds.app.open_folder(folder_path='folder_path') ``` **Example response** ```python 'value' ``` ### app.showItemInFolder Reveal item in system file manager. **Parameters** - itemPath (str, required) **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.app.show_item_in_folder(item_path='item_path') ``` **Example response** ```python None ``` ### app.selectFolder Show folder picker dialog. **Parameters** - title (str, optional) **Response specification** - Return type: `string | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.app.select_folder() ``` **Example response** ```python None # or dict-like object when found ``` ### app.getDefaultProjectPath Get default project path. **Parameters** - projectId (str, required) **Response specification** - Return type: `string` **Example call** ```python from bds_api import bds result = await bds.app.get_default_project_path(project_id='project-1') ``` **Example response** ```python 'value' ``` ### app.readProjectMetadata Read project metadata from path. **Parameters** - folderPath (str, required) **Response specification** - Return type: `{ name?: string; description?: string; publicUrl?: string; mainLanguage?: string } | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.app.read_project_metadata(folder_path='folder_path') ``` **Example response** ```python None # or dict-like object when found ``` ### app.getBlogmarkBookmarklet Get blogmark bookmarklet script. **Parameters** - None **Response specification** - Return type: `string` **Example call** ```python from bds_api import bds result = await bds.app.get_blogmark_bookmarklet() ``` **Example response** ```python 'value' ``` ### app.copyToClipboard Copy text to clipboard. **Parameters** - text (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.app.copy_to_clipboard(text='text') ``` **Example response** ```python True ``` ### app.notifyRendererReady Notify main process renderer is ready. **Parameters** - None **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.app.notify_renderer_ready() ``` **Example response** ```python True ``` ### app.setPreviewPostTarget Set preview post target. **Parameters** - postId (str | None, required) **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.app.set_preview_post_target(post_id=None) ``` **Example response** ```python None ``` ### app.triggerMenuAction Trigger menu action. **Parameters** - action (str, required) **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.app.trigger_menu_action(action='action') ``` **Example response** ```python None ``` [↑ Back to Table of contents](#table-of-contents) ## meta **Module APIs** - [meta.getTags](#metagettags) - [meta.getCategories](#metagetcategories) - [meta.addTag](#metaaddtag) - [meta.removeTag](#metaremovetag) - [meta.addCategory](#metaaddcategory) - [meta.removeCategory](#metaremovecategory) - [meta.syncOnStartup](#metasynconstartup) - [meta.getProjectMetadata](#metagetprojectmetadata) - [meta.setProjectMetadata](#metasetprojectmetadata) - [meta.updateProjectMetadata](#metaupdateprojectmetadata) ### meta.getTags Get project tags. **Parameters** - None **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.meta.get_tags() ``` **Example response** ```python [] ``` ### meta.getCategories Get project categories. **Parameters** - None **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.meta.get_categories() ``` **Example response** ```python [] ``` ### meta.addTag Add project tag. **Parameters** - tag (str, required) **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.meta.add_tag(tag='tag') ``` **Example response** ```python [] ``` ### meta.removeTag Remove project tag. **Parameters** - tag (str, required) **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.meta.remove_tag(tag='tag') ``` **Example response** ```python [] ``` ### meta.addCategory Add project category. **Parameters** - category (str, required) **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.meta.add_category(category='category') ``` **Example response** ```python [] ``` ### meta.removeCategory Remove project category. **Parameters** - category (str, required) **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.meta.remove_category(category='category') ``` **Example response** ```python [] ``` ### meta.syncOnStartup Sync meta values on startup. **Parameters** - None **Response specification** - Return type: `{ tags: string[]; categories: string[]; projectMetadata: ProjectMetadata | null }` - Nullability: Returns `None` when no matching value exists. - Data structures: `ProjectMetadata` **Example call** ```python from bds_api import bds result = await bds.meta.sync_on_startup() ``` **Example response** ```python [ { 'name': 'value', 'description': 'value', 'dataPath': 'value', 'publicUrl': 'value', 'mainLanguage': 'value', 'defaultAuthor': 'value', 'maxPostsPerPage': 0, 'blogmarkCategory': 'value', 'pythonRuntimeMode': None, 'picoTheme': 'value', 'categoryMetadata': {}, 'categorySettings': {} } ] ``` ### meta.getProjectMetadata Read active project metadata. **Parameters** - None **Response specification** - Return type: `ProjectMetadata | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ProjectMetadata` **Example call** ```python from bds_api import bds result = await bds.meta.get_project_metadata() ``` **Example response** ```python None # or { 'name': 'value', 'description': 'value', 'dataPath': 'value', 'publicUrl': 'value', 'mainLanguage': 'value', 'defaultAuthor': 'value', 'maxPostsPerPage': 0, 'blogmarkCategory': 'value', 'pythonRuntimeMode': None, 'picoTheme': 'value', 'categoryMetadata': {}, 'categorySettings': {} } ``` ### meta.setProjectMetadata Set project metadata. **Parameters** - metadata (dict, required) **Response specification** - Return type: `ProjectMetadata | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ProjectMetadata` **Example call** ```python from bds_api import bds result = await bds.meta.set_project_metadata(metadata={}) ``` **Example response** ```python None # or { 'name': 'value', 'description': 'value', 'dataPath': 'value', 'publicUrl': 'value', 'mainLanguage': 'value', 'defaultAuthor': 'value', 'maxPostsPerPage': 0, 'blogmarkCategory': 'value', 'pythonRuntimeMode': None, 'picoTheme': 'value', 'categoryMetadata': {}, 'categorySettings': {} } ``` ### meta.updateProjectMetadata Update project metadata. **Parameters** - updates (dict, required) **Response specification** - Return type: `ProjectMetadata | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ProjectMetadata` **Example call** ```python from bds_api import bds result = await bds.meta.update_project_metadata(updates={}) ``` **Example response** ```python None # or { 'name': 'value', 'description': 'value', 'dataPath': 'value', 'publicUrl': 'value', 'mainLanguage': 'value', 'defaultAuthor': 'value', 'maxPostsPerPage': 0, 'blogmarkCategory': 'value', 'pythonRuntimeMode': None, 'picoTheme': 'value', 'categoryMetadata': {}, 'categorySettings': {} } ``` [↑ Back to Table of contents](#table-of-contents) ## tags **Module APIs** - [tags.getAll](#tagsgetall) - [tags.getWithCounts](#tagsgetwithcounts) - [tags.get](#tagsget) - [tags.getByName](#tagsgetbyname) - [tags.create](#tagscreate) - [tags.update](#tagsupdate) - [tags.delete](#tagsdelete) - [tags.merge](#tagsmerge) - [tags.rename](#tagsrename) - [tags.getPostsWithTag](#tagsgetpostswithtag) - [tags.syncFromPosts](#tagssyncfromposts) ### tags.getAll Fetch all tags. **Parameters** - None **Response specification** - Return type: `TagData[]` **Example call** ```python from bds_api import bds result = await bds.tags.get_all() ``` **Example response** ```python [] ``` ### tags.getWithCounts Fetch tags with counts. **Parameters** - None **Response specification** - Return type: `TagWithCount[]` **Example call** ```python from bds_api import bds result = await bds.tags.get_with_counts() ``` **Example response** ```python [] ``` ### tags.get Fetch tag by id. **Parameters** - id (str, required) **Response specification** - Return type: `TagData | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.tags.get(id='id-1') ``` **Example response** ```python None # or dict-like object when found ``` ### tags.getByName Fetch tag by name. **Parameters** - name (str, required) **Response specification** - Return type: `TagData | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.tags.get_by_name(name='name') ``` **Example response** ```python None # or dict-like object when found ``` ### tags.create Create tag. **Parameters** - data (dict, required) **Response specification** - Return type: `TagData` **Example call** ```python from bds_api import bds result = await bds.tags.create(data={}) ``` **Example response** ```python {} ``` ### tags.update Update tag by id. **Parameters** - id (str, required) - data (dict, required) **Response specification** - Return type: `TagData | null` - Nullability: Returns `None` when no matching value exists. **Example call** ```python from bds_api import bds result = await bds.tags.update(id='id-1', data={}) ``` **Example response** ```python None # or dict-like object when found ``` ### tags.delete Delete tag by id. **Parameters** - id (str, required) **Response specification** - Return type: `DeleteTagResult` **Example call** ```python from bds_api import bds result = await bds.tags.delete(id='id-1') ``` **Example response** ```python {} ``` ### tags.merge Merge tags into target tag. **Parameters** - sourceTagIds (list, required) - targetTagId (str, required) **Response specification** - Return type: `MergeTagsResult` **Example call** ```python from bds_api import bds result = await bds.tags.merge(source_tag_ids=[], target_tag_id='target_tag-1') ``` **Example response** ```python {} ``` ### tags.rename Rename tag by id. **Parameters** - id (str, required) - newName (str, required) **Response specification** - Return type: `RenameTagResult` **Example call** ```python from bds_api import bds result = await bds.tags.rename(id='id-1', new_name='new_name') ``` **Example response** ```python {} ``` ### tags.getPostsWithTag Get posts using a tag. **Parameters** - tagId (str, required) **Response specification** - Return type: `string[]` **Example call** ```python from bds_api import bds result = await bds.tags.get_posts_with_tag(tag_id='tag-1') ``` **Example response** ```python [] ``` ### tags.syncFromPosts Sync tag index from posts. **Parameters** - None **Response specification** - Return type: `SyncTagsResult` **Example call** ```python from bds_api import bds result = await bds.tags.sync_from_posts() ``` **Example response** ```python {} ``` [↑ Back to Table of contents](#table-of-contents) ## chat **Module APIs** - [chat.checkReady](#chatcheckready) - [chat.validateApiKey](#chatvalidateapikey) - [chat.setApiKey](#chatsetapikey) - [chat.getApiKey](#chatgetapikey) - [chat.getAvailableModels](#chatgetavailablemodels) - [chat.setDefaultModel](#chatsetdefaultmodel) - [chat.getSystemPrompt](#chatgetsystemprompt) - [chat.setSystemPrompt](#chatsetsystemprompt) - [chat.getConversations](#chatgetconversations) - [chat.createConversation](#chatcreateconversation) - [chat.getConversation](#chatgetconversation) - [chat.updateConversation](#chatupdateconversation) - [chat.deleteConversation](#chatdeleteconversation) - [chat.sendMessage](#chatsendmessage) - [chat.abortMessage](#chatabortmessage) - [chat.getHistory](#chatgethistory) - [chat.clearMessages](#chatclearmessages) - [chat.setConversationModel](#chatsetconversationmodel) - [chat.analyzeTaxonomy](#chatanalyzetaxonomy) - [chat.analyzeMediaImage](#chatanalyzemediaimage) ### chat.checkReady Check chat backend readiness. **Parameters** - None **Response specification** - Return type: `ChatReadyStatus` - Data structures: `ChatReadyStatus` **Example call** ```python from bds_api import bds result = await bds.chat.check_ready() ``` **Example response** ```python { 'ready': False, 'error': 'value', 'backend': 'value' } ``` ### chat.validateApiKey Validate chat API key and list available models. **Parameters** - apiKey (str, required) **Response specification** - Return type: `{ isValid: boolean; models: ChatModel[] }` - Data structures: `ChatModel` **Example call** ```python from bds_api import bds result = await bds.chat.validate_api_key(api_key='api_key') ``` **Example response** ```python [ { 'id': 'value', 'name': 'value', 'provider': 'value' } ] ``` ### chat.setApiKey Store chat API key. **Parameters** - apiKey (str, required) **Response specification** - Return type: `{ success: boolean; error?: string }` **Example call** ```python from bds_api import bds result = await bds.chat.set_api_key(api_key='api_key') ``` **Example response** ```python {} ``` ### chat.getApiKey Get stored chat API key status. **Parameters** - None **Response specification** - Return type: `ChatApiKeyStatus` - Data structures: `ChatApiKeyStatus` **Example call** ```python from bds_api import bds result = await bds.chat.get_api_key() ``` **Example response** ```python { 'hasKey': False, 'maskedKey': 'value' } ``` ### chat.getAvailableModels Get available chat models and selected default. **Parameters** - None **Response specification** - Return type: `{ success: boolean; models?: ChatModel[]; selectedModel?: string; error?: string }` - Data structures: `ChatModel` **Example call** ```python from bds_api import bds result = await bds.chat.get_available_models() ``` **Example response** ```python [ { 'id': 'value', 'name': 'value', 'provider': 'value' } ] ``` ### chat.setDefaultModel Set default chat model. **Parameters** - modelId (str, required) **Response specification** - Return type: `{ success: boolean; error?: string }` **Example call** ```python from bds_api import bds result = await bds.chat.set_default_model(model_id='model-1') ``` **Example response** ```python {} ``` ### chat.getSystemPrompt Get configured system prompt. **Parameters** - None **Response specification** - Return type: `{ success: boolean; prompt?: string; error?: string }` **Example call** ```python from bds_api import bds result = await bds.chat.get_system_prompt() ``` **Example response** ```python {} ``` ### chat.setSystemPrompt Set system prompt. **Parameters** - prompt (str, required) **Response specification** - Return type: `{ success: boolean; error?: string }` **Example call** ```python from bds_api import bds result = await bds.chat.set_system_prompt(prompt='prompt') ``` **Example response** ```python {} ``` ### chat.getConversations Fetch all chat conversations. **Parameters** - None **Response specification** - Return type: `ChatConversation[]` - Data structures: `ChatConversation` **Example call** ```python from bds_api import bds result = await bds.chat.get_conversations() ``` **Example response** ```python [ { 'id': 'value', 'title': 'value', 'model': 'value', 'createdAt': 'value', 'updatedAt': 'value' } ] ``` ### chat.createConversation Create a chat conversation. **Parameters** - title (str, optional) - model (str, optional) **Response specification** - Return type: `ChatConversation` - Data structures: `ChatConversation` **Example call** ```python from bds_api import bds result = await bds.chat.create_conversation() ``` **Example response** ```python { 'id': 'value', 'title': 'value', 'model': 'value', 'createdAt': 'value', 'updatedAt': 'value' } ``` ### chat.getConversation Fetch one chat conversation by id. **Parameters** - id (str, required) **Response specification** - Return type: `ChatConversation | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ChatConversation` **Example call** ```python from bds_api import bds result = await bds.chat.get_conversation(id='id-1') ``` **Example response** ```python None # or { 'id': 'value', 'title': 'value', 'model': 'value', 'createdAt': 'value', 'updatedAt': 'value' } ``` ### chat.updateConversation Update chat conversation metadata. **Parameters** - id (str, required) - updates (dict, required) **Response specification** - Return type: `ChatConversation | null` - Nullability: Returns `None` when no matching value exists. - Data structures: `ChatConversation` **Example call** ```python from bds_api import bds result = await bds.chat.update_conversation(id='id-1', updates={}) ``` **Example response** ```python None # or { 'id': 'value', 'title': 'value', 'model': 'value', 'createdAt': 'value', 'updatedAt': 'value' } ``` ### chat.deleteConversation Delete chat conversation by id. **Parameters** - id (str, required) **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.chat.delete_conversation(id='id-1') ``` **Example response** ```python True ``` ### chat.sendMessage Send message to chat conversation. **Parameters** - conversationId (str, required) - message (str, required) - metadata (dict, optional) **Response specification** - Return type: `{ success: boolean; message?: string; error?: string }` **Example call** ```python from bds_api import bds result = await bds.chat.send_message(conversation_id='conversation-1', message='message') ``` **Example response** ```python {} ``` ### chat.abortMessage Abort active streaming chat response. **Parameters** - conversationId (str, required) **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.chat.abort_message(conversation_id='conversation-1') ``` **Example response** ```python None ``` ### chat.getHistory Get message history for conversation. **Parameters** - conversationId (str, required) **Response specification** - Return type: `ChatMessage[]` - Data structures: `ChatMessage` **Example call** ```python from bds_api import bds result = await bds.chat.get_history(conversation_id='conversation-1') ``` **Example response** ```python [ { 'id': 'value', 'conversationId': 'value', 'role': None, 'content': 'value', 'toolCallId': 'value', 'toolCalls': 'value', 'createdAt': 'value' } ] ``` ### chat.clearMessages Clear messages for conversation. **Parameters** - conversationId (str, required) **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.chat.clear_messages(conversation_id='conversation-1') ``` **Example response** ```python None ``` ### chat.setConversationModel Set model for a conversation. **Parameters** - conversationId (str, required) - modelId (str, required) **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.chat.set_conversation_model(conversation_id='conversation-1', model_id='model-1') ``` **Example response** ```python None ``` ### chat.analyzeTaxonomy Analyze categories and tags using AI. **Parameters** - categories (list, required) - tags (list, required) - modelId (str, required) **Response specification** - Return type: `{ success: boolean; categoryMappings?: Record; tagMappings?: Record; error?: string }` **Example call** ```python from bds_api import bds result = await bds.chat.analyze_taxonomy(categories=[], tags=[], model_id='model-1') ``` **Example response** ```python {} ``` ### chat.analyzeMediaImage Analyze media image and propose metadata. **Parameters** - mediaId (str, required) - language (str, optional) **Response specification** - Return type: `{ success: boolean; title?: string; alt?: string; caption?: string; error?: string }` **Example call** ```python from bds_api import bds result = await bds.chat.analyze_media_image(media_id='media-1') ``` **Example response** ```python {} ``` [↑ Back to Table of contents](#table-of-contents) ## sync **Module APIs** - [sync.configure](#syncconfigure) - [sync.start](#syncstart) - [sync.getStatus](#syncgetstatus) - [sync.isConfigured](#syncisconfigured) - [sync.getPendingCount](#syncgetpendingcount) - [sync.getLog](#syncgetlog) - [sync.stopAutoSync](#syncstopautosync) ### sync.configure Configure sync. **Parameters** - config (dict, required) **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.sync.configure(config={}) ``` **Example response** ```python None ``` ### sync.start Start sync operation. **Parameters** - direction (str, optional) **Response specification** - Return type: `SyncResult` **Example call** ```python from bds_api import bds result = await bds.sync.start() ``` **Example response** ```python {} ``` ### sync.getStatus Get sync status. **Parameters** - None **Response specification** - Return type: `'idle' | 'syncing' | 'error'` **Example call** ```python from bds_api import bds result = await bds.sync.get_status() ``` **Example response** ```python {} ``` ### sync.isConfigured Check if sync is configured. **Parameters** - None **Response specification** - Return type: `boolean` **Example call** ```python from bds_api import bds result = await bds.sync.is_configured() ``` **Example response** ```python True ``` ### sync.getPendingCount Get pending sync item count. **Parameters** - None **Response specification** - Return type: `{ posts: number; media: number }` **Example call** ```python from bds_api import bds result = await bds.sync.get_pending_count() ``` **Example response** ```python {} ``` ### sync.getLog Get sync log. **Parameters** - limit (int | float, optional) **Response specification** - Return type: `unknown[]` **Example call** ```python from bds_api import bds result = await bds.sync.get_log() ``` **Example response** ```python [] ``` ### sync.stopAutoSync Stop automatic sync. **Parameters** - None **Response specification** - Return type: `void` **Example call** ```python from bds_api import bds result = await bds.sync.stop_auto_sync() ``` **Example response** ```python None ``` [↑ Back to Table of contents](#table-of-contents) ## Data Structures Shared structures referenced by response types are defined once here. ### ProjectData Project metadata stored in the app database. **Fields** - id (`string`, required): Unique project identifier. - name (`string`, required): Human-readable project name. - slug (`string`, required): URL-friendly project slug. - description (`string`, optional): Optional project description. - dataPath (`string`, optional): Filesystem path for project data. - isActive (`boolean`, required): Whether this project is currently active. - createdAt (`string`, required): Creation timestamp (ISO string). - updatedAt (`string`, required): Last update timestamp (ISO string). [↑ Back to Table of contents](#table-of-contents) ### PostData Canonical post object used across editor and generation flows. **Fields** - id (`string`, required): Unique post identifier. - projectId (`string`, required): Owning project id. - title (`string`, required): Post title. - slug (`string`, required): URL slug used for generated routes. - excerpt (`string`, optional): Optional short summary. - content (`string`, required): Markdown body content. - status (`'draft' | 'published' | 'archived'`, required): Publication lifecycle state. - author (`string`, optional): Optional author name. - createdAt (`string`, required): Creation timestamp (ISO string). - updatedAt (`string`, required): Last update timestamp (ISO string). - publishedAt (`string`, optional): Publication timestamp for published posts. - tags (`string[]`, required): List of tag names. - categories (`string[]`, required): List of category names. [↑ Back to Table of contents](#table-of-contents) ### MediaData Canonical media object representing imported files and metadata. **Fields** - id (`string`, required): Unique media identifier. - projectId (`string`, required): Owning project id. - filename (`string`, required): Stored filename in project media folder. - originalName (`string`, required): Original imported filename. - mimeType (`string`, required): Detected MIME type. - size (`number`, required): File size in bytes. - width (`number`, optional): Image width in pixels when available. - height (`number`, optional): Image height in pixels when available. - title (`string`, optional): Optional display title. - alt (`string`, optional): Optional alternative text. - caption (`string`, optional): Optional caption text. - author (`string`, optional): Optional author credit. - createdAt (`string`, required): Creation timestamp (ISO string). - updatedAt (`string`, required): Last update timestamp (ISO string). - tags (`string[]`, required): List of media tags. [↑ Back to Table of contents](#table-of-contents) ### ScriptData Script definition for Python macros, utilities, and transforms. **Fields** - id (`string`, required): Unique script identifier. - projectId (`string`, required): Owning project id. - slug (`string`, required): Stable script slug. - title (`string`, required): Human-readable script title. - kind (`'macro' | 'utility' | 'transform'`, required): Script category. - entrypoint (`string`, required): Python entrypoint function name. - enabled (`boolean`, required): Whether script is enabled. - version (`number`, required): Incrementing script version. - filePath (`string`, required): Filesystem path to script file. - content (`string`, required): Script source code. - createdAt (`string`, required): Creation timestamp (ISO string). - updatedAt (`string`, required): Last update timestamp (ISO string). [↑ Back to Table of contents](#table-of-contents) ### TaskProgress Task queue status object for long-running operations. **Fields** - taskId (`string`, required): Unique task identifier. - name (`string`, required): Task display name. - status (`'pending' | 'running' | 'completed' | 'failed' | 'cancelled'`, required): Current task status. - progress (`number`, required): Progress percentage from 0-100. - message (`string`, required): Current progress message. - startTime (`string`, required): Task start time (ISO string). - endTime (`string`, optional): Task completion time (ISO string). - error (`string`, optional): Error message when failed. - groupId (`string`, optional): Optional grouping id. - groupName (`string`, optional): Optional grouping label. [↑ Back to Table of contents](#table-of-contents) ### ProjectMetadata Extended project metadata from project settings. **Fields** - name (`string`, required): Project display name. - description (`string`, optional): Optional project description. - dataPath (`string`, optional): Optional custom data path. - publicUrl (`string`, optional): Optional public site URL. - mainLanguage (`string`, optional): Main render language code. - defaultAuthor (`string`, optional): Default author for new posts. - maxPostsPerPage (`number`, optional): Pagination size for generated lists. - blogmarkCategory (`string`, optional): Default category for blogmark imports. - pythonRuntimeMode (`'webworker' | 'main-thread'`, optional): Python runtime execution mode. - picoTheme (`string`, optional): Preferred Pico theme token. - categoryMetadata (`object`, optional): Category metadata keyed by category slug. - categorySettings (`object`, optional): Category render settings keyed by category slug. [↑ Back to Table of contents](#table-of-contents) ### ChatConversation Chat conversation container. **Fields** - id (`string`, required): Unique conversation identifier. - title (`string`, required): Conversation title. - model (`string`, optional): Optional model id used by this conversation. - createdAt (`string`, required): Creation timestamp (ISO string). - updatedAt (`string`, required): Last update timestamp (ISO string). [↑ Back to Table of contents](#table-of-contents) ### ChatMessage Single message entry in a conversation history. **Fields** - id (`string`, required): Unique message identifier. - conversationId (`string`, required): Owning conversation id. - role (`'user' | 'assistant' | 'system' | 'tool'`, required): Message author role. - content (`string`, required): Message text content. - toolCallId (`string`, optional): Tool call id when associated with tool output. - toolCalls (`string`, optional): Serialized tool call payload when present. - createdAt (`string`, required): Creation timestamp (ISO string). [↑ Back to Table of contents](#table-of-contents) ### ChatModel Available chat model descriptor. **Fields** - id (`string`, required): Model identifier. - name (`string`, required): Human-readable model name. - provider (`string`, optional): Model provider name. [↑ Back to Table of contents](#table-of-contents) ### ChatReadyStatus Chat backend readiness status. **Fields** - ready (`boolean`, required): Whether chat backend is ready. - error (`string`, optional): Error description when not ready. - backend (`string`, optional): Selected backend identifier. [↑ Back to Table of contents](#table-of-contents) ### ChatApiKeyStatus Stored API key state for chat provider. **Fields** - hasKey (`boolean`, required): Whether a key is configured. - maskedKey (`string`, required): Masked key representation for UI display. [↑ Back to Table of contents](#table-of-contents) --- Generated from contract at 2026-02-25T00:00:00.000Z.