# The data hub for your company Docs for [Boost.space](https://docs.boost.space)[Boost.space AgentOS](https://agentos.docs.boost.space) **Your team, your AI tools and your code work on one shared, live layer of company data** — and every person and agent sees exactly what they were given. > **Connecting an agent?** Start at [Boost.space for AI agents](/ai/mcp/server/for-agents) — two minutes to a working connection. New to the product? [What is Boost.space?](/what-is-boostspace) ![Your team in the app, your AI tools over MCP and your code through the API, all working on the records of one shared data layer](/img/illustrations/data-hub.webp) ## Choose how you work One hub, three ways in — agents, people, and code work on the same live data. | | For | Start | | --------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | **With an AI agent** | Operate everything in natural language — Claude, ChatGPT, Cursor, or any MCP client, scoped to your permissions. | [Connect your agent](/ai/mcp/server/connect-via-mcp) → [For AI agents](/ai/mcp/server/for-agents) | | **In the app** | Teams and admins who organize data, build modules, and invite people — no code. | [Quickstart](/quickstart) → [Modules](/guides/modules) → [Fields](/guides/fields) | | **On the API & SDKs** | Developers building integrations on the REST API or a typed SDK. | [API](/api-reference) → [SDK](/sdk) | ## How Boost.space is structured Four levels — learn these and everything else follows: | Concept | What it is | | ----------------------------- | -------------------------------------------------------------------------------------------------- | | **[Module](/guides/modules)** | A type of data — the tables of your database. You build the ones you need. | | **[Space](/guides/spaces)** | A container that groups records within a module, with its own roles and access. | | **[Record](/guides/records)** | A single row of data — one contact, one task, one order. | | **[Field](/guides/fields)** | A typed attribute on a record — text, number, date, a link to another record, or a computed value. | Typed fields and relational links are what make the data reliable for both people and agents. See [Core concepts](/core-concepts) for the full vocabulary, or the [Glossary](/glossary) for every term. ## Product guides * **[Modules](/guides/modules)** · **[Spaces](/guides/spaces)** · **[Records](/guides/records)** · **[Fields](/guides/fields)** — the data model * **[Working with data](/guides/working-with-data)** — import, filter, views, and consolidate * **[Automation](/guides/automation)** — keep data in sync with Make scenarios * **[System settings](/guides/settings)** · **[Billing](/guides/billing)** — administration ## Build with Boost.space * **[Boost.space for AI agents](/ai/mcp/server/for-agents)** — the agent-ready surface: MCP, agent-readable docs, semantic search * **[AI](/ai)** — AI features inside your records * **[MCP](/ai/mcp)** — connect Claude, ChatGPT, Cursor, or any agent to your data * **[API](/api-reference)** — the REST API, one base URL per tenant * **[SDK](/sdk)** — typed clients for TypeScript, Python, PHP, and Go * **[Changelog](/changelog)** — every API and SDK change ## Get help **Ask AI** is the fastest answer — it sits at the top of every page and answers from these docs. [System status](https://status.boost.space) · [Trust Center](https://trust.boost.space) · [Blog](https://boost.space/blog) · [FAQ & support](/support) — anything else, [chat with us](/?support) Using **Boost.space AgentOS**? It is a separate product with [its own documentation](https://agentos.docs.boost.space). --- title: What is Boost.space? description: >- Boost.space is the unified data foundation that AI agents run on — connect your tools, keep products, customers, and orders in sync, and let agents act on clean, structured, permission-scoped data. --- # What is Boost.space? Boost.space is a **unified data foundation for your business — built so AI agents can actually run on it**. Most AI projects fail because the data behind them is broken. Boost.space fixes the data first: it connects the tools you already use, keeps your products, customers, orders, and campaigns in sync in both directions, and gives every AI agent one clean, structured place to read and act. ## The idea in one picture 1. **Connect your data** — plug in your e-shop, CRM, ERP, suppliers, and ad platforms (**2,600+ native integrations**). Everything flows into one foundation, synced both ways. 2. **Let agents work on it** — deploy ready-made AI agents for product operations, connect your own over [MCP](/ai/mcp/server/for-agents), or build on the [API](/api-reference) and [SDKs](/sdk). 3. **Results write back** — agents make decisions on live data and write the results back into your systems. These docs cover the foundation itself: [modules](/guides/modules), [spaces](/guides/spaces), [records](/guides/records), and typed [fields](/guides/fields) — plus the [automation](/guides/automation), [AI](/ai), [MCP](/ai/mcp), and developer surfaces built on top. ## Why the foundation matters for AI The same qualities that make data usable by people make it usable by agents: - **Typed fields** — a date is a date, a price is a price; agents read and write without guesswork. See [Field types](/guides/fields/custom-field-types-in-boost-space). - **Relational links** — [linked records](/guides/fields/linked-records) connect products to suppliers, orders to customers — so agents can traverse context, not just rows. - **Deduplicated by design** — the [key field](/guides/fields/key-column) and [source priority](/guides/working-with-data/api-token-prioritization-data-consolidation) keep one clean record per real-world entity, no matter how many tools feed it. - **Permission-scoped** — an agent over [MCP](/ai/mcp/server/for-agents) sees and changes only what the connecting user can. No separate security model. ## How it compares - **Unlike standalone AI tools**, which are only as smart as the data you paste into them — Boost.space prepares the data first, so AI executes with full business context. - **Unlike a traditional PIM**, it unifies products *and* customers, orders, and campaigns on one foundation. - **Unlike a CDP**, it goes deep on product data — built for product-led businesses with complex catalogs across channels and markets. - **Integration platforms (Make, n8n, Zapier)** sit *on top* of it: Boost.space is the data layer underneath — it completes them, not competes with them. ## Who it's for Built for **retailers and brands selling across multiple channels and markets** — pulling data in from suppliers, pushing it out to marketplaces, franchises, and partners — and for the **operations and AI teams** who need a governed, structured backend their agents can trust. Trusted by 15,000+ teams across 140 countries; security and compliance live at the [Trust Center](https://trust.boost.space) (GDPR, ISO 27001, SOC 2, HIPAA). ## Where to go next - Get working fast with the **[Quickstart](/quickstart)**. - Learn the data model in **[Core concepts](/core-concepts)** and the **[product guides](/guides/modules)**. - Connect an agent — **[Boost.space for AI agents](/ai/mcp/server/for-agents)**. - Build on the data with the **[API](/api-reference)** and **[SDKs](/sdk)**. --- title: Core concepts description: >- The vocabulary of Boost.space — modules, spaces, records, fields, field groups, automation, MCP, and the API — and how they fit together. --- # Core concepts A quick mental model of Boost.space. Each term links to its full guide. ![Your team in the app, your AI tools over MCP and your code through the API, all working on the records of one shared data layer](/img/illustrations/data-hub.webp) ## Data structure | Concept | What it is | |---|---| | **[Module](/guides/modules)** | A type of data — the tables of your database. You build the modules your process needs. | | **[Space](/guides/spaces)** | A container that groups records within a module, with its own roles and access. | | **[Record](/guides/records)** | A single row of data in a module (one contact, one task). | | **[Field](/guides/fields)** | A single typed attribute on a record — text, number, date, a relational link, or a computed value. | | **[Field group](/guides/fields/field-groups)** | A named collection of fields. Every field belongs to at least one group; a field can be shared across several. | | **[Key field](/guides/fields/key-column)** | The field that identifies a record for merging, so imports and syncs update instead of duplicate. | ## Working with data | Concept | What it is | |---|---| | **[Linked records](/guides/fields/linked-records)** | Relationships between records — link one record or many, and pull values across with lookups. | | **[Segmenter & filters](/guides/working-with-data)** | Slice large datasets by conditions, labels, status, and users. | | **[Data consolidation](/guides/working-with-data/api-token-prioritization-data-consolidation)** | Merging data from multiple sources into one record, using the key field and source priority. | | **[Users & teams](/guides/settings/system-roles-users-and-admins)** | Members, roles, and permissions across spaces and the system. | ## Connecting & automating | Concept | What it is | |---|---| | **Automation** | Keeping data current automatically — native [actions and triggers](/guides/automation/actions-and-triggers), plus scenarios that run on your connected **Make.com** account. | | **Scenario** | A visual automation (a trigger plus steps that move and transform data) running on Make.com, connected to your Boost.space data. | | **Connection** | Authenticated access to an external app, used by scenarios to read and write that app's data. | ## Building on top | Concept | What it is | |---|---| | **[MCP](/ai/mcp/server/connect-via-mcp)** | Lets AI agents read, write, and query your data in natural language over the Model Context Protocol — within the connecting user's permissions. | | **[AI features](/ai)** | AI built into your records: AI fields, text manipulation, and whole-column transformation and validation. | | **[REST API](/api-reference)** | The programmatic surface. One base URL per tenant: `https://{system}.boost.space/api`. | | **[SDKs](/sdk)** | Typed clients for TypeScript, Python, PHP, and Go. | | **System** | Your Boost.space tenant, identified by its name (e.g. `acme` → `acme.boost.space`). | Want the full vocabulary? See the **[Glossary](/glossary)**. Ready to try it? See the **[Quickstart](/quickstart)**. --- title: Glossary description: Definitions of the core Boost.space terms. --- # Glossary The terms you'll meet across Boost.space, in one place. **Action** — What an [automation](/guides/automation) does when it fires: a notification, an email, a webhook, or your own code. See [Actions and triggers](/guides/automation/actions-and-triggers). **Admin** — A [system role](/guides/settings/system-roles-users-and-admins) with full access: manage all levels, users, and settings; create fields and modules; configure automations. **AI agent** — An external AI assistant (Claude, ChatGPT, Cursor, and others) connected to your data over [MCP](/ai/mcp/server/connect-via-mcp). It can read and write your records within the connecting user's permissions. **AI credits** — The allowance that powers Boost.space's [AI features](/ai). See [AI credits](/guides/billing/boost-space-4-0-ai-pricing). **AI field** — A [field](/guides/fields) whose value is generated or enriched by AI. See [AI fields](/ai/ai-features/ai-fields). **AI mapping** — Automatically analyzes incoming data during [import](/guides/working-with-data/import-data-from-file) and maps it to the right fields, recognizing the structure and suggesting new fields when needed. **API token** — A secure code that authenticates a user with the [REST API](/api-reference) and integrations. It can never have more rights than the user it belongs to. See [API tokens and MCP tokens](/ai/mcp/server/token-creation). **API token prioritization** — Priorities set on API tokens that decide which source wins during [data consolidation](/guides/working-with-data/api-token-prioritization-data-consolidation). **Automation** — Keeping data current automatically: native [actions and triggers](/guides/automation/actions-and-triggers), your own [code automations](/guides/automation/code-automations) in a secure sandbox, and [scenarios](/guides/automation/views) on your connected Make.com account. **Basic fields** — The system fields present on every record: ID, Space, [Status](/guides/fields/statuses), [Labels](/guides/fields/labels), Created time, Created by user, and Remote ID. Everything else is a [field](/guides/fields) you define. See [Fields](/guides/fields). **Boost.space system** — The platform that centralizes and synchronizes your company data from internal and external sources. Also called your *system instance*. See [System instance](/guides/settings/system-instance). **Category** — A group of people, used the same places a [team](/guides/settings/inviting-users-and-setting-up-teams-admin) is: space access, menu visibility, segment visibility. Every new user joins **Everyone** by default. **Code automation** — An automation step that runs your **Python** in a secure, isolated sandbox — written by you or by your own AI agent. See [Code automations](/guides/automation/code-automations). **Connection** — Authenticated access to an external app, used by Make.com [scenarios](/guides/automation/views) to read and write that app's data. **Custom branding** — Personalize the system's appearance: logos, login-screen backgrounds, favicons, and colors. See [Company design settings](/guides/settings/company-design-settings). **Data consolidation** — Merging data from multiple sources into one record, using the [key field](/guides/fields/key-column) to match and API token prioritization to decide which source wins. See [API token prioritization + data consolidation](/guides/working-with-data/api-token-prioritization-data-consolidation). **Field** — A typed attribute on a record (text, number, date, a relational link, a computed value). Fields were formerly called *custom fields*. See [Fields](/guides/fields). **Field group** — A named collection of [fields](/guides/fields). Every field belongs to at least one group, and a field can be shared across several groups. See [Field groups](/guides/fields/field-groups). **Formula field** — A [field](/guides/fields) that computes its value from other fields. See [Formula fields](/guides/fields/custom-fields-formula). **Key field** — The [field](/guides/fields) that identifies records in a [space](/guides/spaces) for merging. Essential for data consolidation — e.g. setting *email* as the key means incoming data with the same email updates the existing record instead of creating a duplicate. See [Key fields](/guides/fields/key-column). **Label** — A tag added to records to categorize and organize them. See [Record labels](/guides/fields/labels). **Licence** — Enables access to certain features and plan tiers. See [Plans, tiers and usage limits](/guides/billing/plans-tiers-usage-limits). **Linked record** — A [field](/guides/fields) that links a record to one or more records in another module — the basis for relationships and lookups. See [Linked records](/guides/fields/linked-records). **Lookup** — A read-only [field](/guides/fields) that pulls a value from a linked record, so related data appears without being duplicated. **Manager** — A [space](/guides/spaces) role that can manage members and other managers, manage records, and change space settings such as statuses and labels. See [Space roles](/guides/spaces/space-roles-members-managers-and-owners). **MCP (Model Context Protocol)** — The open standard that lets an [AI agent](/ai) read, write, and query your data in natural language. See [Connect via MCP](/ai/mcp/server/connect-via-mcp). **Member** — A [space](/guides/spaces) role that can view and manage records using existing statuses and labels, but cannot manage members or change space settings. See [Space roles](/guides/spaces/space-roles-members-managers-and-owners). **Menu editor** — Customize the system's navigation: menus, folders, shortcuts, and embedded content, tailored per user. See [Menu editor](/guides/settings/menu-editor). **Module** — A type of data in your system — a table in your database. Modules hold [spaces](/guides/spaces) and [records](/guides/records); you create the modules your business needs, each with its own structure. **Multicurrency database** — Modules that work with currencies can store exchange rates and recalculate prices automatically. **Multilingual database** — Store your data in multiple languages. **Owner** — A [space](/guides/spaces) role with full control: manage members, managers, and owners; manage records; edit space settings; and delete the space. See [Space roles](/guides/spaces/space-roles-members-managers-and-owners). **Record** — A single data entry in a module — a row in the table (a company, a deal, a ticket). See [Records](/guides/records). **Remote ID** — The identifier a record carries from the external system it came from, used to match and update the right record on re-sync (upsert). See [Remote IDs](/guides/working-with-data/remote-ids). **Rollup** — A field that aggregates a value across [linked records](/guides/fields/linked-records) — a sum, count, minimum or maximum — and keeps it current. See [Rollup fields](/guides/fields/rollup). **Sandbox environment** — A copy of your system instance for risk-free testing. Regenerate it any time to match your main instance. See [Sandbox environment](/guides/settings/sandbox-environment). **Scenario** — A visual automation (a trigger plus steps that move and transform data) that runs on your connected Make.com account against your Boost.space data. See [Views](/guides/automation/views). **SDK** — A typed client for the [REST API](/api-reference), so you write Boost.space calls in your own language instead of assembling HTTP by hand. See [SDK](/sdk). **Segment** — A saved filter over a [module](/guides/modules) that shows only the matching records. Used both as a standing queue of work to do and as a throwaway view for a one-off job; records leave a segment on their own once they stop matching. See [Segmenter](/guides/working-with-data/segmenter). **Space** — A container within a module that groups records (e.g. *EU pipeline* and *US pipeline* inside a Deals module). Access is restricted to users who created it or were granted access. See [Spaces](/guides/spaces). **Status** — An indicator assigned to a record to represent its state or progress — system-defined (e.g. *Active*, *Done*) or custom. See [Record statuses](/guides/fields/statuses). **System instance** — A distinct environment for a team or organization: all its users, modules, spaces, records, and configuration. Every customer gets their own, on their own domain. See [System instance](/guides/settings/system-instance). **System key** — A unique identifier for your Boost.space system, used for secure connections across integrations. See [System name and system key](/guides/settings/system-name-system-key). **System roles** — The two roles: **Admin** (full permissions) and **User** (acts within permissions granted by an admin). See [System roles](/guides/settings/system-roles-users-and-admins). **System settings** — The admin-only settings (fields, actions and triggers, design, and more). See [System settings](/guides/settings/system-settings). **Team** — A named group of people. A team can be granted a [space role](/guides/spaces/space-roles-members-managers-and-owners), so everyone in it inherits that access — the maintainable way to run permissions, because you change the team rather than every space. Managed in **Settings → Teams**; which spaces a team reaches is set from each space. See [Inviting users and setting up teams](/guides/settings/inviting-users-and-setting-up-teams-admin). **Trigger** — What starts an [automation](/guides/automation): a record being created, updated or deleted, or a schedule. See [Actions and triggers](/guides/automation/actions-and-triggers). **User** — Uses the system within the rights an admin assigns, usually inherited through [team](/guides/settings/inviting-users-and-setting-up-teams-admin) membership. See [System roles](/guides/settings/system-roles-users-and-admins). **Vector database** — Turns the text in a space's records into embeddings so agents and search can match records by **meaning** rather than exact words. See [Vector database](/ai/ai-features/vector-database). **Webhook** — A way for an app to send real-time data to a URL in response to an event. As an [automation](/guides/automation) action, Boost.space calls a URL you choose when a record changes, and the payload can carry [dynamic values](/guides/automation/actions-and-triggers) from that record. --- title: Quickstart description: >- Get from zero to working with Boost.space — as a product user, connecting an AI agent, or building on the API. Pick your path. --- # Quickstart Three ways to start, depending on what you're doing. Pick your path. ## For product users 1. **[Open the app](https://gate.boost.space)** and sign in. 2. **[Create a space](/guides/spaces/how-do-i-create-a-space)** in a module. 3. **[Add records](/guides/records/manage-records)** manually, or **[import them from a file](/guides/working-with-data/import-data-from-file)**. 4. **[Add fields](/guides/fields/custom-fields-creation-usage)** so the data matches your process — or generate them with AI. 5. **[Invite your team](/guides/settings/inviting-users-and-setting-up-teams-admin)** and set [space roles](/guides/spaces/space-roles-members-managers-and-owners). ## For AI agents Connect the AI tool you already use: 1. Create an **[MCP token](/ai/mcp/server/token-creation)** and copy your connection URL. 2. Add Boost.space as a connector in **[Claude, ChatGPT, Cursor, or any MCP client](/ai/mcp/server/common-mcp-clients)**. 3. Ask the agent to read or change your data — it acts within your token's permissions. See **[Connect via MCP](/ai/mcp/server/connect-via-mcp)**. ## For developers 1. Create an **API token** in your profile (see the [API](/api-reference)). 2. Call the API — base URL `https://{system}.boost.space/api`, Bearer auth: ```bash curl https://{system}.boost.space/api/space \ -H "Authorization: Bearer $BS_TOKEN" ``` 3. Prefer a typed client? Install an **[SDK](/sdk)** — TypeScript and Python are published; PHP and Go are on the way. ## Next steps - Understand the model in **[Core concepts](/core-concepts)**. - Explore the **[product guides](/guides/modules)** and the **[API](/api-reference)**. - Get help in **[Support & resources](/support)**. --- title: Support & resources description: Where to get help, check status, review security, and find the legacy documentation. --- # Support & resources ## Get help - **Ask AI** — the fastest answer. It's at the top of every page of these docs and answers from the documentation itself. - **[Chat with us](/?support)** — for anything Ask AI can't resolve, like your account, billing or Enterprise features. The chat opens right here: our assistant answers from these docs straight away, and the team replies in the same chat on workdays, 9 AM – 7 PM CET. - **Open the app:** [gate.boost.space](https://gate.boost.space) - **Release notes:** [what shipped, release by release](/changelog/updates/release-notes) - **Blog:** [boost.space/blog](https://boost.space/blog) — launch stories and announcements ## Trust & reliability - **[Trust Center](https://trust.boost.space)** — security, compliance and privacy: our certifications (SOC 2 and ISO 27001 certified; GDPR, HIPAA and Google CASA Tier 2 compliant), the subprocessors we use, and the security controls behind them. Policies and documents for a vendor or security review, such as the SOC 2 Type I report, the ISO 27001 Statement of Applicability and a penetration testing confirmation letter, are requested there with **Request access**. For a DPA or another contract, [chat with us](/?support). - **[System status](https://status.boost.space)** — uptime, current incidents, planned maintenance and past incidents. ## For developers - **[API Reference](/api-reference)** — the full REST API. - **[SDKs](/sdk)** — TypeScript and Python, with PHP and Go on the way. - **[Changelog](/changelog)** — what shipped in the product, and the API, MCP and SDK trails. - **AI-readable docs:** [`/llms.txt`](/llms.txt) and [`/llms-full.txt`](/llms-full.txt). ## FAQ **I forgot my password.** Use *Forgot your password?* on the login screen — instructions arrive by email. See [Change or reset your password](/guides/account/password-change-reset). **I lost my 2FA device.** Sign in with one of the **backup codes** you saved when enabling 2FA, then re-enroll. See [Two-factor authentication](/guides/account/two-factor-authentication-2fa). **I need to change my account email.** That's one for the team — [chat with us](/?support) and include your system name, your old email and the new one. **Imports keep creating duplicates.** Set a **[key field](/guides/fields/key-column)** on the space — incoming data then updates the matching record instead of adding a new one. **My MCP/API token has the wrong permissions.** Tokens can't be edited after creation — create a new one with the scopes you need. See [API tokens and MCP tokens](/ai/mcp/server/token-creation). **I hit my record limit.** Delete old records to free room, or upgrade your tier — see [Plans and usage limits](/guides/billing/plans-tiers-usage-limits). **Something looks broken in the app.** Open the **[Status center](/guides/account/status-center)** — it checks your connection, data sync, browser, and security settings, and tells you what to fix. ## Legacy & older plans On an older plan, or using the pre-built modules, the Integrator, or the legacy API? See **[Legacy & older plans](/guides/billing/legacy)** — it maps each legacy feature to today. The Integrator, the pre-built modules and the app catalog are documented at **[legacy-api.boost.space](https://legacy-api.boost.space)**; the API itself is documented in the **[REST API reference](/api-reference)**. # Sklik.cz - sync emails to a Retargeting List This guide covers the whole setup: picking the scenario, choosing where the emails come from, checking how they are hashed, and starting the first run. ## 1. Select the scenario The scenario for importing emails into the Retargeting List is preselected for you. If nothing is preselected, your application does not currently support email synchronization. [Sklik - Select scenario](https://fast.wistia.net/embed/iframe/wpw3ffq8bs?seo=true\&videoFoam=true) ## 2. Select the trigger Choose the action that holds the email addresses. The exact name depends on the app - it may be Subscribers, Contacts, Companies, Records and so on. If no suitable action is offered, your application does not currently support email synchronization. [Sklik - Select action](https://fast.wistia.net/embed/iframe/0rbsre1wx9?seo=true\&videoFoam=true) ## 3. Select the Retargeting List Pick the Retargeting List the emails should go to, or create a new one. [Sklik - Select Retargeting list](https://fast.wistia.net/embed/iframe/1z6fjj21v9?seo=true\&videoFoam=true) ## 4. Set up your app Connect your app and choose which data to send to Sklik.cz. In **Choose where to start**, select **All** so every email is synchronized. The settings differ from app to app. [Sklik.cz - Authorize App](https://fast.wistia.net/embed/iframe/aaom0tlazh?seo=true\&videoFoam=true) ## 5. Pick the email field in the Array Aggregator Select the field that holds the email address. Where that field sits depends on the app you connected. [Sklik.cz - Choose e-mail](https://fast.wistia.net/embed/iframe/542qexo2ul?seo=true\&videoFoam=true) ## 6. Check the Sklik.cz module settings Two options decide how the addresses leave Boost.space: * **Source emails are hashed** - the emails coming out of your app are already hashed. * **Hash emails** - hash them with SHA256 before sending them to Sklik.cz. ## 7. Run the first synchronization Start the scenario. If all three modules finish successfully, switch the scenario to **ON**. From then on the data is sent automatically at the interval you set. [Sklik - Test and start](https://fast.wistia.net/embed/iframe/rik3nd8asj?seo=true\&videoFoam=true) That is the whole setup. Your data now goes to Sklik.cz on its own, at the interval the scenario runs on. --- title: Modules description: >- Modules are the data types your Boost.space database is built from. Build the modules you need — including with AI — and organize them into spaces, records, and fields. --- # Modules A **module** is a type of data at the top of the Boost.space data model — the tables of your database. Boost.space is **modular**: you build the modules you need and add more as you grow. Each module is a database of [records](/guides/records), organized into [spaces](/guides/spaces) and described by [fields](/guides/fields). ## Build the modules you need Modules are **fully customizable** — define a module's name, icon, [spaces](/guides/spaces), [key field](/guides/fields/key-column), permissions, and [fields](/guides/fields) to match your exact process. You can also **generate fields with AI** while building a module. See [Create a module](/guides/modules/boostspace-bs-custom-module-2) for the step-by-step. ## Filling a new module A module you created with nothing in it shows **Fill *(module name)* with data**, and administrators get two ways to bring the records in: - **Connect a tool** — pull the records from a system you already use. See [Views](/guides/automation/views). - **Upload a file** — a `.csv`, `.xls`, `.xlsx` or `.xml` goes into the [AI-mapped import](/guides/working-with-data/import-data-from-file). To add records by hand instead, see [Manage records](/guides/records/manage-records). ## Modules interconnect automatically Modules connect to each other out of the box, so data flows between them without manual setup — for example, a won opportunity can create a follow-up order in another module. ## Build on custom modules **Start every new project from a custom module you design yourself.** That is where the work has gone and where it keeps going: you define the fields, the structure, and the behaviour, so the module fits the data instead of the data being bent to fit the module. The pre-built modules — Tasks, Contacts, Products, Invoices, Warehouses — came from an earlier generation of Boost.space, when each one was pre-designed for you. Custom modules now cover what they did and more, so the pre-built ones are **not** the place to begin something new. For the systems still on them, they are documented at [legacy-api.boost.space/modules](https://legacy-api.boost.space/modules). ## One module, one kind of data Give each kind of data its own module, and use [spaces](/guides/spaces) for variations of the same kind. A module has a view across all of its spaces at once, and that view unions the fields of every space beneath it — so spaces holding similar records produce a readable overview, while unrelated records crammed into one module produce a very wide table of mostly empty columns. See [Spaces overview](/guides/spaces) for the longer version. ## Admins manage modules **System administrators** create and configure modules, then make them available to other users. For per-module configuration, see [Individual modules – setup (admin)](/guides/modules/setting-up-individual-modules-admin). ## Learn more - [Create a module](/guides/modules/boostspace-bs-custom-module-2) — build your own, step by step - [Hierarchy – modules, spaces and records](/guides/modules/hierarchy-modules-spaces-and-records) - [Navigating the modules](/guides/modules/navigating-through-the-modules) > Looking for the pre-built modules (Tasks, Contacts, Invoices, Products, Warehouses…) or their > setup? Those are documented at > [legacy-api.boost.space/modules](https://legacy-api.boost.space/modules), and mapped to today on > [Legacy & older plans](/guides/billing/legacy). --- title: Home page description: >- The Boost.space home page — your modules, your scenarios, and your usage at a glance. --- # Home page Your **home page** is where you land after signing in — the launchpad for everything you and your agents work with. ![The Boost.space home page](/img/guides/modules/home-1.webp) ## Navigation The left sidebar holds **Home**, the **Marketplace**, your [modules](/guides/modules), and **New** for creating one — with notifications, the Help Center (including **Ask AI**), System settings, and your avatar at the bottom. ## What's on the page - **My modules** — every module you've added; open one or create a **New module** ([with AI](/guides/modules/build-with-ai) or [manually](/guides/modules/boostspace-bs-custom-module-2)). - **My Scenarios** — your [automation](/guides/automation/views) at a glance, grouped by direction: **Data source** (importing), **Data enrich**, and **Data share** (exporting) — with each scenario's module, operations used, platform, and status. - **Usage** — live counters for **Records**, **Operations**, and **AI Credits** against your [plan limits](/guides/billing/plans-tiers-usage-limits), with a one-click upgrade. - **News** — release notes and product updates. ## Agents start here too The **Connect AI** button on any module wires up Claude, ChatGPT, Cursor, and more over MCP — see [Connect via MCP](/ai/mcp/server/connect-via-mcp). --- title: Hierarchy – modules, spaces and records description: >- Boost.space organizes data in three levels — modules, spaces, and records. Learn how they nest, and how modules differ from spaces. --- # Hierarchy – modules, spaces and records A Boost.space system can run anywhere from one to dozens of [modules](/guides/modules) at once. Thanks to one uniform structure — **modules → spaces → records** — it stays clear at any size, for people and for [AI agents](/ai/mcp/server/for-agents) alike. Say you've built a simple CRM with three modules: **Companies**, **Deals**, and **Tickets**. ## Modules A [module](/guides/modules) is a **type of data** — a table you design, with its own [fields](/guides/fields). Admins create and configure modules; every user works in them. **Example:** the **Deals** module — with fields like *Value*, *Stage*, and a [link](/guides/fields/linked-records) to **Companies**. ## Spaces A [space](/guides/spaces) groups records **inside** a module. A module can hold unlimited spaces, any user can create one, and access is per space. **Example:** the Deals module split into spaces per team — **EU pipeline** and **US pipeline**. ## Records A [record](/guides/records) is a **single row** in a space. What it represents depends on the module. **Example:** one deal — *"Acme renewal, €12,000, Negotiation"* — inside the EU pipeline space. ## Modules vs. spaces They're easy to confuse, but they do different jobs: | | Module | Space | |---|---|---| | **What it is** | A type of data — the table and its fields. | A container that groups records in a module. | | **Job** | Defines the structure. | Organizes data and controls access. | | **Created by** | Admins. | Any user. | | **Example** | Deals | EU pipeline | In short: **modules define the structure; spaces organize and protect the data** inside it. This same three-level shape is what agents traverse over [MCP](/ai/mcp/server/for-agents) and what the [API](/api-reference) exposes. ## Next - [Create a module](/guides/modules/boostspace-bs-custom-module-2) · [Space settings](/guides/spaces/space-settings) - [Manage records](/guides/records/manage-records) · [Field types](/guides/fields/custom-field-types-in-boost-space) --- title: Navigating through the modules description: >- A quick visual tour of a Boost.space module — moving between spaces, working with the records table, and where the settings live. --- # Navigating the modules Boost.space modules share one foundation, so once you know your way around one module, you know them all. This is a quick visual tour; the concepts live in [Hierarchy – modules, spaces and records](/guides/modules/hierarchy-modules-spaces-and-records). ## Orientation **One level above** — the back button returns you to the level above. ![The one-level-above button](/img/guides/modules/navigating-through-the-modules-1.webp) ## Spaces **Space menu** — filter the module's [spaces](/guides/spaces) by status and create new ones. ![The space menu](/img/guides/modules/navigating-through-the-modules-2.webp) **Navigation panel** — move between spaces within the module. ![The space navigation panel](/img/guides/modules/navigating-through-the-modules-3.webp) **Space settings** — with a space selected, open **⋮ → Edit** for its [settings](/guides/spaces/space-settings): key field, description, field groups, statuses, automations, and logs. ![Opening space settings](/img/guides/modules/navigating-through-the-modules-4.webp) **Space users** — click the user avatars to add or remove people and set their [roles](/guides/spaces/space-roles-members-managers-and-owners). ![Managing space users](/img/guides/modules/navigating-through-the-modules-5.webp) ## Records **Create** — the new-record button adds a [record](/guides/records/manage-records) to the selected space. ![Creating a record](/img/guides/modules/navigating-through-the-modules-6.webp) **The list** — shows records for the current selection; with no space or filter selected, you see every record you have access to. ![The records list](/img/guides/modules/navigating-through-the-modules-7.webp) **Filter & sort** — the toolbar searches, sorts, and opens the [filter builder](/guides/working-with-data/how-do-i-filter-records). ![The filtration toolbar](/img/guides/modules/navigating-through-the-modules-8.webp) **Edit** — open a record with the pen icon, or **Edit** for bulk changes. See [Manage records](/guides/records/manage-records). ![Editing records](/img/guides/modules/navigating-through-the-modules-9.webp) **Table settings** — the gear icon chooses which [fields](/guides/fields) show as columns. ![Choosing visible columns](/img/guides/modules/navigating-through-the-modules-10.webp) **Delete** — the trash icon removes a record (always with a confirmation). ![Deleting a record](/img/guides/modules/navigating-through-the-modules-11.webp) --- title: Build a module with AI description: >- Let AI create a module tailored to your needs — describe the purpose or paste a sample record, or start from a ready-made template. --- # Build a module with AI The fastest way to a new [module](/guides/modules): describe what you want to track, and AI generates the module with a fitting set of typed [fields](/guides/fields). No schema design up front — generate, review, refine. ## Generate a module When you create a module, Boost.space opens the **Build a module with AI** screen: 1. **Describe the purpose or give a sample record** in the AI Prompt field — e.g. *"A recruitment pipeline: candidates with role, stage, salary expectation, CV attachment, and interviewer."* Pasting a sample record (even raw JSON) works too — AI derives the structure from it. 2. Or start from a **template** — one click on **Contacts, Products, Deals, Tasks, Order, Campaigns, Emails,** or **Shipments** pre-fills a proven structure you can adjust. 3. Click **Generate**. 4. **Review the proposal** — edit or delete any field, or prompt again to refine — then save. Prefer to design everything by hand? Choose **From scratch** — see [Create a module](/guides/modules/boostspace-bs-custom-module-2). > AI generation runs on [AI credits](/guides/billing/boost-space-4-0-ai-pricing). ## Why start with AI - **Typed from day one** — AI picks real [field types](/guides/fields/custom-field-types-in-boost-space) (dates, selects, links, money), so the data is filterable, automatable, and [agent-ready](/ai/mcp/server/for-agents) immediately. - **You keep control** — everything AI generates is a normal module; tune fields any time in [field settings](/guides/fields/custom-fields-creation-usage). - **Works from what you have** — a pasted sample record or JSON becomes a matching structure. ## Next - [Create a module](/guides/modules/boostspace-bs-custom-module-2) (manual) · [Field types](/guides/fields/custom-field-types-in-boost-space) · [Import data from a file](/guides/working-with-data/import-data-from-file) # Create a module A [module](/guides/modules) is a table you design. The fastest way to get one is **[Build a module with AI](/guides/modules/build-with-ai)** — describe your data and review the result. This guide covers building one **manually**. [Building your data structure: modules, spaces and custom fields](https://fast.wistia.net/embed/iframe/kyw0ub4rqq?seo=true\&videoFoam=true) ## Create the module 1. From **[Home](/guides/modules/home)**, click the **+** icon — or go to **System settings → Modules → Add module**. ![Creating a module from the homepage](/img/guides/modules/boostspace-bs-custom-module-2-1.webp) 2. Choose the menu to place it in, pick **Module** as the item type, and create it (optionally assign a **parent folder**). 3. Give it a **name**, **icon**, and **color**. ![Naming the module and picking an icon and color](/img/guides/modules/boostspace-bs-custom-module-2-2.webp) ## Set up the first space 4. Create a [space](/guides/spaces/how-do-i-create-a-space) with **+ New space** and name it. 5. Choose who to share it with and their [roles](/guides/spaces/space-roles-members-managers-and-owners). 6. Set the **[key field](/guides/fields/key-column)** — it deduplicates incoming data, so syncs and imports update the matching record instead of creating a copy. ![Setting the key field](/img/guides/modules/boostspace-bs-custom-module-2-3.webp) 7. Connect [field groups](/guides/fields/field-groups), then **Finish**. Your module is ready — add [records](/guides/records/manage-records), or refine its [fields](/guides/fields/custom-fields-creation-usage) (you can also [generate them with AI](/guides/modules/build-with-ai)). ## Next * [Build a module with AI](/guides/modules/build-with-ai) · [Module settings](/guides/modules/setting-up-individual-modules-admin) * [Space settings](/guides/spaces/space-settings) · [Delete a module](/guides/modules/delete-a-module) --- title: Module settings description: >- Boost.space is modular — admins add, remove, and configure modules in System settings, and each module has its own settings for lists, types, statuses, and labels. --- # Module settings Boost.space is **modular**: choose which [modules](/guides/modules) you need, and add more as you grow. Modules work independently, so you can adopt the system one module at a time. ## Install and remove modules **System administrators** add and remove modules at any time in **System settings → Modules**. A newly added module is **automatically connected** to your other modules, so data flows between them without manual setup. ![Managing modules in System settings](/img/guides/modules/setting-up-individual-modules-admin-1.webp) ## Per-module settings Every module has its own settings, found in **System settings**. What's available depends on the module — for example: - lists and categories (e.g. a catalog's categories and attributes) - custom item and record types - [statuses](/guides/fields/statuses) and [labels](/guides/fields/labels) - module-specific options ![A module's settings in System settings](/img/guides/modules/setting-up-individual-modules-admin-2.webp) To build a module from scratch — including its spaces, key field, and fields — see [Create a module](/guides/modules/boostspace-bs-custom-module-2). --- title: Delete a module description: >- Remove a module from your system — where to find it, the confirmation steps, and what to check before you do. --- # Delete a module Deleting a [module](/guides/modules) removes it with everything inside — its spaces, records, and fields. Only **admins** can do it. > Export anything you need to keep first — see > [Bulk actions and exporting](/guides/working-with-data/bulk-actions-and-exporting). If you only want > the module out of the way, consider hiding it via the [Menu editor](/guides/settings/menu-editor) > instead. ## Steps 1. Go to **System settings → Modules → Main settings**. 2. Find the module and click the **trash icon**. ![Deleting a module](/img/guides/modules/delete-a-module-1.webp) 3. Confirm with **Yes**, then type the **exact module name**. ![Typing the module name to confirm](/img/guides/modules/delete-a-module-2.webp) > If the name is rejected even though it looks right, check for **extra spaces** — leading, > trailing, or doubled spaces count as part of the name. --- title: Spaces overview description: >- Spaces group the records inside a module into clear, access-controlled containers — with their own settings, roles, and structure. --- # Spaces overview A **space** is a container that groups records inside a [module](/guides/modules). Each module can hold an unlimited number of spaces and subspaces, so it stays organized and clear even with a large amount of data. ## Where spaces sit in the data model | Level | What it is | Example | |---|---|---| | **[Module](/guides/modules)** | A type of data — the table. | Deals | | **Space** | A container that groups records within that module. | EU pipeline | | **[Record](/guides/records)** | A single row of data. | One deal | See [Hierarchy – modules, spaces and records](/guides/modules/hierarchy-modules-spaces-and-records) for the full picture. ## Why use spaces - **Keep a module readable** — split its data into logical groups: by team, client, region, or dataset. - **Control access per space** — only the creator and invited users can open a space; what each can do is set by their [space role](/guides/spaces/space-roles-members-managers-and-owners). - **Give each space its own setup** — statuses, connected [field groups](/guides/fields/field-groups), a [key field](/guides/fields/key-column) for deduplication, and native automations. See [Space settings](/guides/spaces/space-settings). ## One module, one kind of data Because a module can hold any number of spaces, it is tempting to make one module the home for everything and separate the different kinds of data into spaces — products in one, contacts in another, contracts in a third. It works, right up until someone opens the module's own view of all its records. That view is the union of every field in every space beneath it. Spaces holding the same kind of data share their fields, so the view stays tight and readable. Spaces holding *different* kinds of data have almost no fields in common, so the union becomes a very wide table where nearly every cell is blank — a contact has no delivery weight, a contract has no stock level — and the one view that should give you the overview becomes the least usable screen in the system. **So give each kind of data its own module, and use spaces for variations of it.** Five spaces for five product ranges is exactly what spaces are for; the records still look alike, so the module view still reads. Products, contacts, and contracts are three modules. Small structural differences between spaces in one module are fine and normal. It is the mixing of genuinely unrelated record shapes that costs you the module view. ## Spaces and agents A space is also the unit an [AI agent](/ai/mcp/server/for-agents) works in: its **description** tells the agent what the data holds, its **key field** makes agent writes deduplicate safely, and **[vectorization](/ai/ai-features/vector-database)** makes its records semantically searchable. ## Parent and child spaces Spaces can nest inside a module: a **parent space** stands on its own, a **child space** belongs to it — for example a parent *Clients* space with a child space per region. You choose this when [creating a space](/guides/spaces/how-do-i-create-a-space). ## Next - [Create and manage a space](/guides/spaces/how-do-i-create-a-space) - [Space settings](/guides/spaces/space-settings) · [Space roles and permissions](/guides/spaces/space-roles-members-managers-and-owners) - [Add records](/guides/records/manage-records) # Create and manage a space You can create an unlimited number of spaces and subspaces in each [module](/guides/modules). This guide covers the full lifecycle: creating a space, modifying it, and deleting it. [Space creation](https://fast.wistia.net/embed/iframe/jijqs92ork?seo=true\&videoFoam=true) ## Create a space Click the **+ button** on the left side of the screen. ![The + button used to create a space](/img/guides/spaces/how-do-i-create-a-space-1.webp) A window opens where you fill in the details of the new space (example screenshot). ![The space creation window](/img/guides/spaces/how-do-i-create-a-space-2.webp) ### 1. Choose parent or child Decide whether this is a **parent** or a **child** space: * Leave the **Parent space** field empty to create a **parent space** that stands on its own. * Fill in the **Parent space** field to create a **child space** that belongs to the space you select. > When you create a space from inside an existing space, the **Parent space** field is pre-filled for you. ![Setting the parent space](/img/guides/spaces/how-do-i-create-a-space-3.webp) ### 2. Set sharing and roles Choose who the space is shared with — **everyone**, **specific users**, or keep it **private**. For each invited user, assign a role: **member**, **manager**, or **owner**. See [Space roles and permissions](/guides/spaces/space-roles-members-managers-and-owners) for what each role can do. ![Sharing a space and assigning roles](/img/guides/spaces/how-do-i-create-a-space-4.webp) ### 3. Set a key field Optionally set a **key field**. The key field merges data from different sources into a single item, keeping records unified and consistent while avoiding duplicates. See [Key field](/guides/fields/key-column) for details. ![Setting the key field](/img/guides/spaces/how-do-i-create-a-space-5.webp) ### 4. Choose field groups Set up the structure of the space by connecting the **[field groups](/guides/fields/field-groups)** your records need — ready-made groups or ones you've [built yourself](/guides/fields/custom-fields-creation-usage). Click **Create**. The space is ready and you can [add records](/guides/records/manage-records) to it. ## Modify a space Open a space's settings from either of two places: * the **navigation toolbar** on the left, or * the **top bar** next to the space name — the **pencil** icon or the **⋮ (three dots)** icon. ![Editing a space from the navigation toolbar](/img/guides/spaces/how-do-i-create-a-space-6.webp) ![Editing a space from the top bar](/img/guides/spaces/how-do-i-create-a-space-7.webp) The settings shown always match the module the space belongs to — see [Space settings](/guides/spaces/space-settings) for everything you can configure there. ## Delete a space Only an **owner** of a space can delete it. The delete action is under the **⋮** icon in the space bar. ![Deleting a space](/img/guides/spaces/how-do-i-create-a-space-8.webp) > **Deleting a space also deletes every record in it.** This can't be undone — export anything you need to keep first (see [Bulk actions and exporting](/guides/working-with-data/bulk-actions-and-exporting)). ## Next steps * [Space roles and permissions](/guides/spaces/space-roles-members-managers-and-owners) * [Add records to a space](/guides/records/manage-records) * [Key field](/guides/fields/key-column) · [Field groups](/guides/fields/field-groups) --- title: Space settings description: >- Everything you configure on a space — status, key field, description, vectorization, field groups, statuses, and native automations. --- # Space settings Every [space](/guides/spaces) has its own settings, tailored to what it holds. Open them by **editing the space** (the pencil or **⋮** next to the space name). Use **Go to Module Settings** for settings that apply to the whole [module](/guides/modules). ## Basics - **Status** — the space's own status (e.g. *Active*), so you can archive or pause a space without deleting it. - **Key field (avoid duplicates)** — the [key field](/guides/fields/key-column) used to match incoming records so imports and syncs update the right record instead of creating duplicates. - **Space description** — a short description of what the space holds. Besides documenting it for your team, the description **gives AI agents context** about the space over [MCP](/ai) — worth filling in for any space an agent will work with. ## Vectorization Switch on **Vectorization** to embed the space's records so AI and search can match them **by meaning**. Every text and rich text field in the space is embedded automatically — there is nothing to choose field by field, and no upkeep once it is on. This is the Enterprise **[vector database](/ai/ai-features/vector-database)** — ideal for giving agents relevant context from large spaces. ## Structure - **Field groups** — connect [field groups](/guides/fields/field-groups) to the space to decide which fields it has. You can reuse a group **from another module**, not just this one. - **Statuses** — manage the [statuses](/guides/fields/statuses) available in this space. ## Automation & history - **Triggers and actions** — the space's **native** [actions and triggers](/guides/automation/actions-and-triggers): when a record changes, send a **webhook**, **notification**, or **email**. This runs inside Boost.space — it's separate from [Make scenarios](/guides/automation/views). - **Logs** — a history of changes made in the space, for auditing. ## Next - [Create and manage a space](/guides/spaces/how-do-i-create-a-space) · [Space roles and permissions](/guides/spaces/space-roles-members-managers-and-owners) - [Key fields](/guides/fields/key-column) · [Field groups](/guides/fields/field-groups) # Space roles and permissions Alongside the system-wide roles (**admin** and **user**), every space has its own roles that decide who can manage and use it — including its records. Space roles apply to both users and admins. [Space roles: owner, manager, member](https://fast.wistia.net/embed/iframe/2ts2ckyni3?seo=true\&videoFoam=true) ## The three roles * **Member** — works with records using the existing statuses and labels. Can't change space settings or manage people. * **Manager** — everything a member can do, plus manages members and managers and edits space settings (such as status lists and labels). * **Owner** — full control: manages members, managers, and other owners, edits settings, and can delete the space. ## Permission matrix | Capability | Member | Manager | Owner | | ------------------------------------------ | :----: | :-----: | :---: | | View and manage records | ✓ | ✓ | ✓ | | Use existing statuses and labels | ✓ | ✓ | ✓ | | Edit space settings (status lists, labels) | — | ✓ | ✓ | | Manage members | — | ✓ | ✓ | | Manage managers | — | ✓ | ✓ | | Manage owners | — | — | ✓ | | Delete the space | — | — | ✓ | ## Assign roles Click the **+** icon next to the space name to view and set roles. This icon appears only for users who are a **manager** or **owner** of that space. ![Opening the space roles settings](/img/guides/spaces/space-roles-members-managers-and-owners-1.webp) ![Assigning members, managers, and owners](/img/guides/spaces/space-roles-members-managers-and-owners-2.webp) You set a person's initial role when you share a space with them during [space creation](/guides/spaces/how-do-i-create-a-space). For system-wide roles and team management, see [Users & teams](/guides/settings/system-roles-users-and-admins). --- title: Records overview description: >- Records are the rows of your Boost.space database — the data inside a space. Learn what records are, how they're displayed, and everything you can do with them. --- # Records overview Records are the **rows of your database** — the actual data inside a [space](/guides/spaces). What a record represents depends on its [module](/guides/modules): in a CRM you've built, a record is a company, a deal, or a ticket. Any user with access to a space can create and manage its records — and so can [AI agents over MCP](/ai/mcp/server/for-agents) and your code over the [API](/api-reference), within the same permissions. > Your plan sets a **record limit** — the maximum number of records across all your databases. > Free up room by deleting old records. ## Anatomy of a record Every record carries the system-maintained **[basic fields](/fields/custom-field-types-in-boost-space#basic-fields)** (ID, Space, Status, Labels, Created time, Created by user, Remote ID) plus the **[fields](/guides/fields)** its space's field groups define. Its [status](/guides/fields/statuses) tracks progress, [labels](/guides/fields/labels) categorize it, and [links](/guides/fields/linked-records) connect it to records in other modules. ## Views Records display in a **table** by default — filter, sort, and calculate on columns. Modules can offer additional layouts for their data, and saved filters become reusable **[Views](/guides/working-with-data/how-do-i-filter-records)** shared with your team. ## Working with records - **Create, edit & delete** — [Manage records](/guides/records/manage-records) - **Import** — [Import data from a file](/guides/working-with-data/import-data-from-file) - **Organize** — [Filtering & Views](/guides/working-with-data/how-do-i-filter-records) · [Segmenter](/guides/working-with-data/segmenter) · [Labels](/guides/fields/labels) · [Statuses](/guides/fields/statuses) - **Relate & compute** — [Linked records](/guides/fields/linked-records) · [Calculations on columns](/guides/working-with-data/calculations-on-columns) - **At scale** — [Bulk actions and exporting](/guides/working-with-data/bulk-actions-and-exporting) · [Data consolidation](/guides/working-with-data/api-token-prioritization-data-consolidation) - **Collaborate** — [Comments](/guides/collaboration/comments) · [Notifications](/guides/collaboration/notifications) --- title: Manage records description: >- Create, edit, and delete records in Boost.space — the + New button, edit mode, deletion safeguards, and how manual data ranks in consolidation. --- # Manage records This guide covers working with records **by hand** — creating, editing, and deleting them. To bring records in automatically, use [automation](/guides/automation/views) or [import from a file](/guides/working-with-data/import-data-from-file). > Manually entered data has **Medium** priority — the default for every source. In > [data consolidation](/guides/working-with-data/api-token-prioritization-data-consolidation), a > higher-priority source can overwrite it and a lower-priority one can't. ## Create a record Add a record with the **+ New** button on the right of the control bar. ![The + New button](/img/guides/records/manage-records-1.webp) The creation window opens — fill in the essentials and save. You can add the rest afterwards in the record's detail. ## Edit a record Editing happens in the **record detail** — open it with the **pen / Edit** icon on the row. 1. Enable **edit mode** with the **Edit** button. 2. Make your changes — every [field](/guides/fields) the record's space offers is editable here. 3. Click the blue **Save** button. ![Editing a record in edit mode](/img/guides/records/manage-records-2.webp) > Prefer to open records ready to edit? An admin can enable **Automatically start edit mode in > record detail** in [System settings](/guides/settings/system-settings). ## Delete a record Delete a record with the **trash icon** — on the right of the table row, or inside the record detail. A confirmation is always shown so you don't delete by accident. If other parts of the system depend on the record, Boost.space shows exactly **which links must be removed first** — this keeps your data consistent instead of leaving broken references. ## Next - [Filtering records](/guides/working-with-data/how-do-i-filter-records) · [Bulk actions and exporting](/guides/working-with-data/bulk-actions-and-exporting) - [Comments](/guides/collaboration/comments) · [Notifications](/guides/collaboration/notifications) --- title: The record detail description: >- What's inside a record's detail — basic information, field groups, attachments — and the actions you can take from it. --- # The record detail Open any record (the **pen icon** on its row) and you land in its **detail** — everything the record holds, ready to edit. ## What you'll find - **Basic information** — the system-maintained [basic fields](/fields/custom-field-types-in-boost-space#basic-fields): Status, Labels, Remote ID, Created time, and Created by user, with the record's **Space** up top. - **Your fields**, organized by [field group](/guides/fields/field-groups) — every group connected to the record's space renders as its own collapsible section. Empty fields are tucked away with an **Empty (N)** counter, so the detail stays focused on what's filled; expand to see them all. - **Attachments** — the record's files and images, in their own section. - **[Comments](/guides/collaboration/comments)** — on modules that support them, the discussion and activity trail. ## What you can do - **Edit** — the detail opens ready to edit: change any field and hit **Save**. - **Follow** — the **tracking icon** subscribes you to [notifications](/guides/collaboration/notifications) for a record you're not assigned to. - **Delete** — the trash icon, always with a confirmation; see [Manage records](/guides/records/manage-records). > The detail shows exactly what the [API](/api-reference) and > [agents over MCP](/ai/mcp/server/for-agents) see — the same fields, statuses, labels, and files, scoped by > the same permissions. The **Remote ID** even shows which external system a record came from > (`application: id`). ## Next - [Manage records](/guides/records/manage-records) · [Fields overview](/guides/fields) · [Field groups](/guides/fields/field-groups) --- title: Fields overview description: What fields are in Boost.space and how they define the structure of your records. --- # Fields overview **Fields** are the typed columns of your data. Every [record](/guides/records) is made of fields, and the fields in a [module](/guides/modules) define what you can store — text, numbers, dates, links to other records, files, computed values, and more. Typed fields are what make your data dependable for people, imports, automations, and AI agents alike. Every record has a set of **basic fields** the system maintains (ID, Space, Status, Labels, Created time, Created by user, Remote ID). Everything else is a **field you define** (formerly called a *custom field*). Fields are part of your system's structure, so **only admins create and manage them** — but every user can fill them in. ## Start here - **[Create and manage fields](/guides/fields/custom-fields-creation-usage)** — add fields manually or with AI, and configure them. - **[Field types](/guides/fields/custom-field-types-in-boost-space)** — the map of every type, linking to the guides below. ## Field type guides - **[Text fields](/guides/fields/text-fields)** — text, rich text, email, URL. - **[Number fields](/guides/fields/number-fields)** — number, decimal, money, percent, rating. - **[Selection fields](/guides/fields/selection-fields)** — single/multi select, radio, checkbox. - **[Date & time fields](/guides/fields/date-fields)** — date and date-and-time. - **[Files & people fields](/guides/fields/media-and-people-fields)** — file, image, users. - **[Linked records](/guides/fields/linked-records)** — relationships: link, lookup, rollup. - **[Formula fields](/guides/fields/custom-fields-formula)** — compute a value from other fields. ## Organize & identify - **[Field groups](/guides/fields/field-groups)** — group fields and control visibility. - **[Key fields](/guides/fields/key-column)** — the field that matches records for data consolidation. # Create and manage fields **Fields** hold the data on your records. They were formerly called _custom fields_, and the term still appears in a few places, but the concept is the same: a typed column you define. Fields are part of your system's structure, so **only admins create them**; every user can then fill them in. Each field belongs to at least one **[field group](/guides/fields/field-groups)** — the container that organizes fields within a module. [Fields](https://fast.wistia.net/embed/iframe/s19bt5n7xz?seo=true\&videoFoam=true) ## Two ways to create fields Open **System settings → \[your module]** — its fields are managed on that page. Pick or create a [field group](/guides/fields/field-groups), then either: 1. **Add one field** — click **New field** and define it in the field editor (below). 2. **Generate many with AI** — describe what you need in plain language (or paste JSON) and let AI propose a set of fields. Review, edit, or delete the suggestions, and prompt again to refine. ![Generating fields with AI](/img/guides/fields/custom-fields-creation-usage-1.webp) ## The field editor Every field has a **type** and a **name**; the rest depends on the type. * **Type** — what the field stores. See [Field types](/guides/fields/custom-field-types-in-boost-space). * **Name** — the label users see. Boost.space derives a stable API name from it (editable under **Advanced settings → API values**). * **Field group(s)** — the [group](/guides/fields/field-groups) the field belongs to. Type-specific options appear as you choose a type — for example: * **Select / Multi select / Radio** — the list of **options** (color, label, stored value). * **Money** — the **currency**; **Percent** — an optional **0–100** limit. * **Link a single/multiple record** — the **target module** and **spaces**, and an optional **counterpart** field created on the other side of the relation. * **Lookup / Rollup** — the relation to follow and the value or aggregation to pull. * **[Formula](/guides/fields/custom-fields-formula)** — the expression. * **[AI field](/ai/ai-features/ai-fields)** — the prompt, execution mode (automatic or manual), and tone/length/formatting/creativity. * **Button** — the action to trigger. ### Advanced settings * **Help text** — a tooltip shown next to the field. * **API values** — the field's system name for the API and imports. * **Required** — the field must be filled before a record can be saved. * **Enable multiple field groups** — lets the field belong to **more than one** [field group](/guides/fields/field-groups). With it off, the field lives in a single group. * **Primary label** — use this field as the record's title (the label shown wherever the record is referenced). Available for text-like and select fields on supported modules. ## Update or delete a field Reopen a field from its group to change its settings, move it between groups, or adjust which spaces it appears in. To remove it, open it and choose **Delete**. > Basic fields (ID, Space, Status, Labels, Created time, Created by user, Remote ID) are system fields — you can't edit or delete them. See [Field types](/fields/custom-field-types-in-boost-space#basic-fields). ## Next * [Field types](/guides/fields/custom-field-types-in-boost-space) · [Field groups](/guides/fields/field-groups) * [Key fields](/guides/fields/key-column) · [Linked records](/guides/fields/linked-records) --- title: Field types description: >- The field types in Boost.space, grouped — basic system fields plus the text, number, choice, date, media, relational, and computed types you define. Each group links to its own guide. --- # Field types A field's **type** decides what it stores, how it's displayed, and how it behaves in filters, imports, automations, and for AI agents. This page is the map — each group links to its own guide. To create a field, see [Create and manage fields](/guides/fields/custom-fields-creation-usage). ## Basic fields Every record has these **basic fields** — system fields Boost.space maintains for you, in the **Basic information** group. They can't be deleted or retyped. | Field | What it holds | |---|---| | **ID** | The record's internal identifier. | | **Space** | The [space](/guides/spaces) the record belongs to. | | **Status** | The record's [status](/guides/fields/statuses). | | **Labels** | The record's [labels](/guides/fields/labels). | | **Created time** | When the record was created. | | **Created by user** | Who created it. | | **Remote ID** | The identifier from the source system, used to match on re-sync. See [Remote IDs](/guides/working-with-data/remote-ids). | ## Fields you define Everything else is a field you create (formerly a *custom field*). Pick a group for the full guide: | Group | Types | Guide | |---|---|---| | **Text** | Text, Long text (Wysiwyg), Email, Website | [Text fields](/guides/fields/text-fields) | | **Number** | Number, Decimal number, Money, Percentages, Rating | [Number fields](/guides/fields/number-fields) | | **Selection** | Single select, Multi select, Radio button, Checkbox | [Selection fields](/guides/fields/selection-fields) | | **Date & time** | Date, Date and time | [Date & time fields](/guides/fields/date-fields) | | **Files & people** | File, Image, Users | [Files & people fields](/guides/fields/media-and-people-fields) | | **Relational** | Link single record, Link multiple records, Lookup, Rollup | [Linked records](/guides/fields/linked-records) | | **Computed** | Formula | [Formula fields](/guides/fields/custom-fields-formula) | | **AI** | AI | [AI fields](/ai/ai-features/ai-fields) | ### Button A **Button** field puts a button on the record that triggers a configured [action](/guides/automation/actions-and-triggers) — for example, run an automation from the record. ### Form fields Modules of type **Form** offer extra field types for submissions — **First name**, **Last name**, **Phone**, **Address** (with **city**, **country**, and **postal code** parts), **Hidden**, and consent fields (**Newsletter**, **Cookies**, **GDPR**). These appear only in Form modules. ## Choosing the right type - A **relationship**? Use [Link single / multiple record](/guides/fields/linked-records), then **Lookup** or **Rollup** to bring linked data across — don't copy values by hand. - A value **derived from other fields**? Use a [Formula](/guides/fields/custom-fields-formula) (math, logic, text), a [Rollup](/guides/fields/rollup) (aggregate across links), or an [AI field](/ai/ai-features/ai-fields) for language tasks. - A **fixed set of choices**? Use [Single/Multi select](/guides/fields/selection-fields) over free text, so filters and automations stay consistent. --- title: Text fields description: >- The text field types in Boost.space — Text, Long text (Wysiwyg), Email, and Website — what each stores, how it behaves, and when to use it. --- # Text fields Text fields store written content, from a short single line to formatted rich text. Boost.space has four. ## Text A single line of plain text with no formatting — the workhorse field. - **Stores:** one line of text. - **Behaves:** shows inline; filter with *contains / starts with / ends with / equals*; sorts alphabetically. Can be a record's **primary label** and its **[key field](/guides/fields/key-column)**. - **Use for:** names, titles, SKUs, reference numbers, short notes. ## Long text (Wysiwyg) Multi-line **rich text** with formatting — bold, lists, links, and inline images. - **Stores:** formatted multi-line content. - **Behaves:** opens a rich editor; supports inline **[AI text tools](/ai/ai-features/ai-powered-text-manipulation)** (shorten, rephrase, translate…). Not meant for sorting or exact-match filtering. - **Use for:** descriptions, meeting notes, long-form content. - **Text vs. Long text:** pick **Text** for short values you'll filter and sort on; pick **Long text** when you need paragraphs or formatting. ## Email An email address, validated and rendered as a clickable `mailto:` link. - **Stores:** one email address. - **Behaves:** click to compose; usable as a **[key field](/guides/fields/key-column)** (great for matching contacts on re-sync) and in [automation](/guides/automation). - **Use for:** contact email. ## Website A web address (URL), rendered as a clickable link. - **Stores:** one URL. - **Behaves:** opens in a new tab when clicked. - **Use for:** websites, social profiles, links to external documents. > **Forms** add more text-based fields for submissions — First name, Last name, Phone, and Address > parts. See [Field types](/fields/custom-field-types-in-boost-space#form-fields). ## Next - [Field types](/guides/fields/custom-field-types-in-boost-space) · [Number fields](/guides/fields/number-fields) · [Selection fields](/guides/fields/selection-fields) --- title: Number fields description: >- The numeric field types in Boost.space — Number, Decimal number, Money, Percentages, and Rating — with their formatting, options, and when to use each. --- # Number fields Number fields store values you count, measure, price, or score. All five sort numerically, filter with `= ≠ > ≥ < ≤`, and can feed [Formula](/guides/fields/custom-fields-formula) and [Rollup](/guides/fields/rollup) calculations. ## Number Whole numbers (integers). - **Stores:** an integer. - **Use for:** counts, quantities, sort order, IDs that are numeric. ## Decimal number Numbers with decimal places. - **Stores:** a decimal value. - **Use for:** weights, rates, measurements — anything fractional. - **Number vs. Decimal number:** use **Number** when the value is always whole; **Decimal number** when fractions matter. ## Money An amount together with a currency. - **Stores:** amount + currency (the currency is set on the field). - **Behaves:** formatted automatically with the currency symbol. Changing the field's currency **does not** re-convert existing amounts — it only changes how they're displayed. - **Use for:** prices, budgets, totals. ## Percentages A percentage value, shown with a `%`. - **Stores:** a number displayed as a percentage. - **Option — clamp to 0–100:** when enabled, values outside 0–100 are rejected (ideal for progress or completion); leave it off for values that can exceed 100 (e.g. growth). - **Use for:** discounts, VAT, completion, margins. ## Rating A score on a star scale. - **Stores:** a rating value. - **Behaves:** shown as stars; click to set. - **Use for:** lead scoring, product or supplier ratings, quick prioritization. ## Next - [Field types](/guides/fields/custom-field-types-in-boost-space) · [Formula fields](/guides/fields/custom-fields-formula) · [Selection fields](/guides/fields/selection-fields) --- title: Selection fields description: >- Choice-based field types in Boost.space — Single select, Multi select, Radio button, and Checkbox — how to configure their options and when to use each. --- # Selection fields Selection fields let a record pick from a defined set of choices. They keep data consistent, filterable, and automation-friendly — far better than free text for anything with a fixed set of values. ## Defining options **Single select**, **Multi select**, and **Radio button** share an options list. Each option has: - a **color** — the colored chip shown on records, - a **label** — what people see, - a **value** — what's stored and sent to the [API](/api-reference) (set when the option is created). Keep a stable **value** while renaming a **label** and your filters, automations, and integrations keep working. ## Single select One option from the list, shown as a dropdown. - **Use for:** category, type, priority, stage — longer lists of mutually exclusive choices. - Can serve as a record's **primary label** or **[key field](/guides/fields/key-column)**. ## Multi select Several options from the list. - **Behaves:** shows multiple colored chips; filter with *is any of / is none of*. - **Use for:** tags, attributes, applicable regions. ## Radio button One option, shown as inline radio buttons rather than a dropdown. - **Use for:** short, always-visible either/or choices (2–4 options). - **Single select vs. Radio button:** both store one choice — radio shows every option inline; single select saves space with a dropdown. ## Checkbox A single true/false value. - **Behaves:** a simple toggle; filter by checked/unchecked; can drive [automation](/guides/automation/actions-and-triggers). - **Use for:** flags like *Active*, *Approved*, *Done*. For several independent yes/no flags, use several checkboxes or a Multi select. ## Next - [Field types](/guides/fields/custom-field-types-in-boost-space) · [Text fields](/guides/fields/text-fields) · [Number fields](/guides/fields/number-fields) --- title: Date & time fields description: >- The date field types in Boost.space — Date and Date and time — how they behave and when to use each. --- # Date & time fields Date fields store points in time as real date values, so they sort chronologically, filter by range, and can drive [automation](/guides/automation) and [Formula](/guides/fields/custom-fields-formula) date math. Boost.space has two. ## Date A calendar date, with no time of day. - **Stores:** a single date. - **Behaves:** opens a date picker; filter with *before / after / equals* and sort chronologically. - **Use for:** deadlines, invoice dates, birthdays, start/end dates — anywhere the time of day doesn't matter (also avoids timezone confusion). ## Date and time A date together with a time. - **Stores:** a timestamp (date + time). - **Behaves:** opens a date-and-time picker. - **Use for:** appointments, event starts, precise timestamps, SLA deadlines. ## Working with dates - **Automation** — a [scenario](/guides/automation/views) or [trigger](/guides/automation/actions-and-triggers) can fire relative to a date (e.g. when a due date passes). - **Formula** — use date functions like *Date difference*, *Date add*, *Workdays*, and *Format date*. See [Formula fields](/guides/fields/custom-fields-formula). - **Rollup** — return the *Earliest date*, *Latest date*, or *Date range* across linked records. See [Rollup fields](/guides/fields/rollup). ## Next - [Field types](/guides/fields/custom-field-types-in-boost-space) · [Filtering records](/guides/working-with-data/how-do-i-filter-records) --- title: Files & people fields description: >- Field types for attachments and people in Boost.space — File, Image, and Users — what each stores, how it behaves, and when to use it. --- # Files & people fields These field types attach documents and images to a record, or link it to people in your system. ## File One or more file attachments of any type. - **Stores:** attached files (documents, PDFs, spreadsheets, archives…). - **Behaves:** lists the attachments on the record; upload, download, and remove them. With **custom file categories** enabled in [System settings](/guides/settings/system-settings), files can be organized by category (e.g. *contract*, *final*). - **Use for:** contracts, invoices, specs, any document that belongs to the record. ## Image Image attachments, previewed as thumbnails. - **Stores:** image files. - **Behaves:** shows thumbnails inline; accepts only images (otherwise identical to File). - **Use for:** product photos, logos, avatars, screenshots. - **File vs. Image:** use **Image** when you want thumbnail previews and only images; use **File** for any file type. ## Users One or more [users](/guides/settings/system-roles-users-and-admins) from your system. - **Stores:** links to real people (not free text). - **Behaves:** a user picker; assignments drive [notifications](/guides/collaboration/notifications) and can be used in [automation](/guides/automation/actions-and-triggers) — e.g. notify the assignee on a status change. - **Use for:** owner, assignee, reviewer, account manager. > To link a record to **another record** (not a user), use a relationship field — see > [Linked records](/guides/fields/linked-records). ## Next - [Field types](/guides/fields/custom-field-types-in-boost-space) · [Linked records](/guides/fields/linked-records) # Linked records Real data is connected: an order has a customer, a project has tasks, an invoice has line items. **Linked records** model those relationships directly, so related data stays connected instead of copied. Three [field types](/guides/fields/custom-field-types-in-boost-space) work together: * **Link** — _creates_ the connection between records. * **Lookup** — _displays_ a value from a linked record. * **Rollup** — _calculates_ across linked records. [Linked records and lookup fields](https://fast.wistia.net/embed/iframe/m841b4almb?seo=true\&videoFoam=true) ## Link fields A link field connects a record in one [module](/guides/modules) to record(s) in another. Choose the cardinality when you create it: | Field | Relationship | Example | | ------------------------- | ------------------------------------------------------------------------ | ----------------------- | | **Link single record** | One-to-one / many-to-one — the record links to exactly one other record. | An order → its customer | | **Link multiple records** | One-to-many / many-to-many — the record links to several. | A company → its deals | When you create a link field you pick the **target module** (and which [spaces](/guides/spaces) it can link into). You can also create a **counterpart** field on the other module, so the relationship is visible and navigable from both sides. ## Lookup fields A **[Lookup](/guides/fields/lookup)** shows a value from a linked record without duplicating it — pick the **relation** and the **property** to display, and it always reflects the source. For example, a lookup through an order's _customer_ link can show the customer's **email**. See **[Lookup fields](/guides/fields/lookup)** for the full setup. ## Rollup fields A **[Rollup](/guides/fields/rollup)** aggregates a field **across many linked records** into a single value — pick the **relation**, the **target field**, and an aggregation **function** (Sum, Average, Count, Min/Max, and more). For example, on a **Company** linked to **Deals**, roll up the **Value** field with **Sum** for pipeline value. See **[Rollup fields](/guides/fields/rollup)** for the full setup and every function. ## Put it together Model a **Companies** module linked to **Deals**: 1. On **Companies**, add a **Link multiple records** field targeting **Deals**. 2. Link each company to its deals (with a counterpart, each deal shows its company too). 3. Add a **Rollup** on Companies for the sum of deal values, and a **Lookup** to show each deal's owner — all live, none copied. This is exactly the structure an AI agent can traverse over [MCP](/ai): follow a company to its deals, read the rollup, act on the result. ## Next * [Field types](/guides/fields/custom-field-types-in-boost-space) · [Create and manage fields](/guides/fields/custom-fields-creation-usage) * [Records overview](/guides/records) · [Key fields](/guides/fields/key-column) --- title: Lookup fields description: >- A Lookup field displays a value from a record's linked records — read-only, always in sync with the source, chosen by relation and property. --- # Lookup fields A **Lookup** field pulls a value **from a record's linked records** and shows it here — read-only, without copying. It always reflects the source, so when the linked record changes, the lookup updates automatically. Lookups keep related data visible where you need it without duplicating it. > A Lookup **shows** a value; a **[Rollup](/guides/fields/rollup)** *aggregates* many linked values into > one. Both read through a [link field](/guides/fields/linked-records). ## Configure a Lookup Create a field, choose the **Lookup** type, and set two things: 1. **Relation** — the [link field](/guides/fields/linked-records) (Link single or multiple record) to read through. 2. **Property** — which field on the linked record(s) to display. > Example: on an **Order** linked to a **Customer**, add a Lookup with Relation = *Customer* and > Property = *Email* to show the customer's email on every order — always current, never retyped. ## How it behaves - **Read-only** — you can't edit a lookup directly; change the value on the linked record and the lookup follows. - **Single vs. multiple** — through a *Link single record* relation a lookup shows one value; through *Link multiple records* it shows the value from each linked record. - **Live** — it reflects the source in real time, and can be shown in the table, filtered, and used by [automation](/guides/automation). - **Not stored on the record** — because it's derived, it isn't a separate value you can overwrite; to change it, edit the source or the link. ## Lookup vs. Rollup vs. Formula | Need | Use | |---|---| | Show a value from a linked record as-is | **Lookup** | | Aggregate many linked values (sum, count, min/max…) | **[Rollup](/guides/fields/rollup)** | | Compute from fields **on the same record** | **[Formula](/guides/fields/custom-fields-formula)** | ## Next - [Linked records](/guides/fields/linked-records) · [Rollup fields](/guides/fields/rollup) · [Field types](/guides/fields/custom-field-types-in-boost-space) --- title: Rollup fields description: >- A Rollup field aggregates a field across a record's linked records — sum, count, min/max, and more — chosen by relation, target field, and function. --- # Rollup fields A **Rollup** field takes a field from a record's **linked records** and aggregates it into a single value on this record — the total value of a company's deals, the number of open ones for an account, the latest order date for a customer. It updates automatically as the linked records change. > Rollup is available on higher plans — see the [pricing page](https://boost.space/pricing/). To > compute a value *within a single record* instead, use a [Formula](/guides/fields/custom-fields-formula). ## Configure a Rollup Create a field, choose the **Rollup** type, and set three things: 1. **Relation** — the [link field](/guides/fields/linked-records) (Link single record or Link multiple records) whose linked records you want to roll up. 2. **Target field** — which field on those linked records to aggregate. 3. **Function** — how to aggregate it (below). > Example: on a **Company** linked to **Deals**, set Relation = *Deals*, Target field = *Value*, > Function = **Sum** to show total effort. Switch the function to **Count not empty** to show how > many tasks are estimated. ## Aggregation functions The functions available depend on the **target field's type**. ### General — any field type | Function | Result | |---|---| | **Show original** | The linked values as-is. | | **Show unique** | The distinct linked values. | | **Count all** | Count of linked records, including empty. | | **Count values** | Count of non-empty values. | | **Count unique values** | Count of distinct values. | | **Count empty** / **Count not empty** | Count of empty / filled values. | | **Percent empty** / **Percent not empty** | Share of empty / filled values. | ### Numeric — number, decimal, money, percent, rating | Function | Result | |---|---| | **Sum** | Total of the values. | | **Average** | Arithmetic mean. | | **Median** | Middle value. | | **Min** / **Max** | Smallest / largest value. | | **Range** | Max minus min. | ### Date — date, date and time | Function | Result | |---|---| | **Earliest date** / **Latest date** | The first / last date. | | **Date range** | Span between the earliest and latest date. | ### Checkbox | Function | Result | |---|---| | **Checked** / **Unchecked** | Count of checked / unchecked. | | **Percent checked** / **Percent unchecked** | Share of checked / unchecked. | ## Rollup vs. Lookup Both read across a [link field](/guides/fields/linked-records) — but a **[Lookup](/fields/linked-records#lookup-fields)** shows a value from linked records as-is, while a **Rollup** *aggregates* many linked values into one number or summary. ## Next - [Linked records](/guides/fields/linked-records) · [Formula fields](/guides/fields/custom-fields-formula) · [Field types](/guides/fields/custom-field-types-in-boost-space) --- title: Formula fields description: >- Formula fields compute a value from other fields — read-only, validated live, and always up to date. Full function reference: math, logic, text, dates, arrays, conversion, and record metadata. --- # Formula fields A **Formula** field calculates its value from other fields in the same record. It's read-only and recomputes automatically whenever the fields it depends on change — totals, derived text, conditional logic, date math, and more. > Formula fields are available on higher plans — see the [pricing page](https://boost.space/pricing/). > To aggregate values *across linked records* instead, use a **[Rollup](/guides/fields/rollup)** field. ## Build a formula Create a field and choose the **Formula** type (see [Create and manage fields](/guides/fields/custom-fields-creation-usage)). In the editor you **insert other fields** and combine them with **functions** and operators (`+`, `-`, `*`, `/`, comparisons, and parentheses for grouping). Functions can be nested, and the editor **validates the formula live** — showing whether it's valid before you save. ## Function reference ### Math & numbers | Function | What it does | |---|---| | **Sum** | Adds two or more numeric values. | | **Subtract** | Subtracts the second value from the first. | | **Multiply** | Multiplies two or more values together. | | **Divide** | Divides the first value by the second. | | **Modulo** | Returns the remainder after division. | | **Power** | Raises a base to an exponent. | | **Square root** | Returns the square root of a number. | | **Absolute value** | Returns the non-negative value of a number. | | **Round** | Rounds to a given number of decimal places. | | **Round up** / **Round down** | Rounds away from / toward zero. | | **Ceil** / **Floor** | Rounds up / down to the nearest integer. | | **Average** | The arithmetic mean of the values. | | **Max** / **Min** | The largest / smallest value. | | **Count** | Counts non-empty numeric values. | | **Count all** | Counts all values, including empty ones. | ### Logic & comparison | Function | What it does | |---|---| | **If** | Returns one value if a condition is true, otherwise another. | | **Switch** | Compares an expression to multiple cases and returns the match. | | **AND** / **OR** | True if all / at least one value is truthy. | | **NOT** | Returns the opposite boolean. | | **XOR** | True if an odd number of arguments are truthy. | | **Equals** | True if two values are equal. | | **Greater than** / **Less than** | Compares two values. | | **Is empty** / **Is not empty** | Tests whether a value is empty. | | **Is error** | True if the value is an error. | ### Text | Function | What it does | |---|---| | **Concat** | Joins two or more text values into one string. | | **Length** | Number of characters in a text value. | | **Lowercase** / **Uppercase** | Changes text case. | | **Trim** | Removes leading, trailing, and duplicate whitespace. | | **Contains** | True if the text contains a substring. | | **Starts with** / **Ends with** | Tests a prefix / suffix. | | **Replace** | Replaces all occurrences of a substring. | | **Substring** | A part of the text from a start position and length. | | **Left** / **Right** | The first / last N characters. | | **Split** | Splits text into an array by a delimiter. | | **Index of** | Position of the first occurrence, or -1. | | **Format** | Fills a template by replacing `{0}`, `{1}`, … placeholders. | | **Regex match** | True if the text matches a regular expression. | | **Regex extract** | Returns the first regex match. | | **Regex replace** | Replaces regex matches with replacement text. | ### Date & time | Function | What it does | |---|---| | **Now** | Current date and time. | | **Today** | Current date, no time. | | **Date add** / **Date subtract** | Adds / subtracts a duration to a date. | | **Date difference** | Difference between two dates in a given unit. | | **Format date** | Formats a date as text using a pattern. | | **Year** / **Month** / **Day** | The year, month (1-12), or day (1-31). | | **Weekday** | Day of the week (1 = Monday … 7 = Sunday). | | **Is after** / **Is before** | Compares two dates. | | **Workdays** | Working days between two dates (Mon-Fri). | ### Arrays | Function | What it does | |---|---| | **Array join** | Joins array values into text with a separator. | | **Array unique** | Returns the unique values from an array. | | **Array length** | Number of items in an array. | ### Conversion | Function | What it does | |---|---| | **To number** | Converts a value to a number. | | **To string** | Converts a value to text. | | **To boolean** | Converts a value to a boolean. | | **To date** | Parses a value into a date. | ### Record | Function | What it does | |---|---| | **Record ID** | The unique ID of the current record. | | **Created at** / **Updated at** | When the record was created / last updated. | | **Created by user ID** | ID of the user who created the record. | | **Created by user name** | Name of the user who created the record. | ## Examples - **Line total** — `Round(Quantity * Price, 2)` - **Full name** — `Concat(First name, " ", Last name)` - **Fallback text** — `If(Is empty(Owner), "Unassigned", Owner)` - **Age in days** — `Date difference(Created at, Now, "days")` ## Next - [Rollup fields](/guides/fields/rollup) — aggregate across linked records - [Field types](/guides/fields/custom-field-types-in-boost-space) · [Number fields](/guides/fields/number-fields) --- title: Button fields description: >- A Button field puts an action button on a record — click it to run a configured action like a notification, email, or webhook. --- # Button fields A **Button** field adds a clickable button to a record. Clicking it runs a configured **action** — so people can trigger something from the record itself, without leaving the table or opening a tool. ## Configure a Button Create a field, choose the **Button** type, and pick the **action** it triggers. Actions come from your [actions and triggers](/guides/automation/actions-and-triggers) — for example a **system notification**, an **email**, or a **webhook** that kicks off an external process. ## How it behaves - The button shows on the record (in the table and in the record detail). - Clicking it runs the linked action **for that record**, passing the record's data. - **Anyone who can open the record can click it**, not only administrators. - Unlike other fields it doesn't store a value — it performs an action. ## Use it for - A one-click **"Send confirmation"** email on an order. - A **"Notify owner"** button that posts a system notification. - A **webhook** trigger that starts an external workflow for the record. ## Next - [Actions and triggers](/guides/automation/actions-and-triggers) · [Automation](/guides/automation) · [Field types](/guides/fields/custom-field-types-in-boost-space) --- title: Field groups description: >- Field groups organize the fields in a module. Learn how they work, the Basic information group, and how a single field can belong to several groups. --- # Field groups A **field group** is a named collection of [fields](/guides/fields) within a [module](/guides/modules). Groups keep a module's structure organized — related fields sit together, and you connect a group to a [space](/guides/spaces) to make its fields available there. **Every field belongs to at least one group.** Some modules ship with ready-made groups you can connect in a click; you can also build your own. ## The Basic information group Every module has a built-in **Basic information** group holding the [basic fields](/fields/custom-field-types-in-boost-space#basic-fields) — ID, Space, Status, Labels, Created time, Created by user, and [Remote ID](/guides/working-with-data/remote-ids). This group is managed by the system and can't be edited or removed. ## A field in more than one group A field can belong to **several groups at once**. When editing a field, turn on **Enable multiple field groups** (in Advanced settings) and pick every group it should appear in — useful when the same attribute is relevant to more than one part of a module. See [Create and manage fields](/guides/fields/custom-fields-creation-usage). ## Connect groups to a space Connecting a field group to a space makes its fields available on that space's records. Open the space's field settings to add or remove groups; expand a group to preview the fields it contains before connecting it. ## Control field visibility Connecting a group makes its fields *available*; you still choose which appear in the table. Click the **settings icon** at the top-right of the records table and toggle individual fields on or off. ![Toggling field visibility in the table](/img/guides/fields/field-groups-1.webp) ## Create a field group 1. Open **System settings → [your module]**, where its fields are managed. 2. Click **New field group**, give it a **name**, and choose the **spaces** it applies to. 3. Save, then add [fields](/guides/fields/custom-fields-creation-usage) to it. ## Next - [Create and manage fields](/guides/fields/custom-fields-creation-usage) · [Field types](/guides/fields/custom-field-types-in-boost-space) - [Key fields](/guides/fields/key-column) --- title: Key fields description: >- The key field matches incoming data to existing records, so imports and syncs update instead of creating duplicates. Learn how to set one and how it works. --- # Key fields The **key field** is how Boost.space decides whether incoming data is a **new record** or an **update to an existing one**. It powers [data consolidation](/guides/working-with-data/api-token-prioritization-data-consolidation): records that share the same key value merge into one. Each [space](/guides/spaces) can have its own key field. > **Key field vs. primary label.** The *key field* matches records for merging. The *primary > label* is what a record is titled by wherever it's shown — a separate setting on a field. A > space can use different fields for each. ## How it works When data arrives — from an [import](/guides/working-with-data/import-data-from-file), a [scenario](/guides/automation/views), or the [API](/api-reference) — Boost.space compares the key field: - if a record with that key **already exists**, the incoming data **updates** it; - if not, a **new record** is created. This keeps one unified record per real-world entity instead of duplicates piling up on every sync. ## Set a key field Choose the key field when **[creating a space](/guides/spaces/how-do-i-create-a-space)** (in the space wizard), or later by **editing the space**. ## Example Set **Email** as the key field for a Companies space. When data arrives for `jane@example.com`: - if that email **already exists**, its record is updated with the new data; - if it **doesn't**, a new contact is created. The result: no duplicates, one record per person — whether the data comes from a person, an import, or an automation. When several sources set the same field, [API token prioritization](/guides/working-with-data/api-token-prioritization-data-consolidation) decides which one wins. # Labels Label records to organize and find them faster. Boost.space has two types of labels: personal and shared. [Shared/personal labels](https://fast.wistia.net/embed/iframe/tco7vojopi?seo=true\&videoFoam=true) Labels can be set by both user and admin. The difference is that the admin has access to settings, so they can set labels globally or across multiple spaces. A user can only add labels in a space where they are a Manager or Owner — see [Space roles and permissions](/guides/spaces/space-roles-members-managers-and-owners). ## Personal labels Personal labels are user-specific and only visible to the user who created them, allowing for an individualized organization that is not visible to others. Personal labels are always located above the spaces at the module level. ## Shared labels Shared labels are assigned to spaces and are visible to all users. Each space can have a unique set of labels. If no label is assigned to a space in the settings (i.e., if nothing is marked), the label is considered global and will be visible across all spaces. **Personal and shared labels are available in the filtration panel or inside the record detail after clicking on the EDIT button.** ![](/img/guides/fields/labels-1.webp) ![](/img/guides/fields/labels-2.webp) # Statuses A **status** shows where a record is in its process — it's one of the [basic fields](/fields/custom-field-types-in-boost-space#basic-fields) every record carries. Boost.space has two kinds — **system statuses** and **custom statuses** — and both can drive automation. Because a status is structured state (not free text), it's also something [agents](/ai/mcp/server/for-agents) and [filters](/guides/working-with-data/how-do-i-filter-records) can rely on. [Record statuses](https://fast.wistia.net/embed/iframe/yp3hzb4k31?seo=true\&videoFoam=true) ## System statuses System statuses are predefined and carry built-in behavior — for example **Active · Done · Cancelled · Archive**. A record marked **Done** is complete and stops showing as pending; an **Archive** record is out of the way but not deleted. ## Custom statuses Custom statuses are set per [space](/guides/spaces) and inherit behavior from a system status, so you can build your own flow (for example **Pending approval** or **Checked**). To create one: 1. Open the module that offers system statuses. 2. Select the space, click **Edit**, and choose **Add** in the statuses section. 3. Give it a name and select a **parent system status**. 4. Optionally pick an icon and color. 5. Save. ![Creating a custom status](/img/guides/fields/statuses-1.webp) ## Drive automation with statuses Link statuses to **actions and triggers** to automate processes and notifications: 1. Give the automation a name, module, and trigger. ![Defining an automation](/img/guides/fields/statuses-2.webp) 2. Check whether a record's status changed to the target status. 3. If it matches, run an action — for example, email a designated person. ![Linking a status to an action](/img/guides/fields/statuses-3.webp) For the full setup, see [Actions and triggers](/guides/automation/actions-and-triggers). --- title: Import data from a file description: >- Import your data into Boost.space using CSV, XML, or XLSX files. Map fields, preview your data, and create fields automatically with AI assistance. --- # Import data from a file Import your own data into any [space](/guides/spaces) from a file — map it to existing [fields](/guides/fields) or create new ones automatically. With a [key field](/guides/fields/key-column) set on the space, an import **updates** matching records instead of duplicating them. ## Supported file formats You can upload the following file types: * **CSV** * **XLSX** * **XML** These formats allow you to import structured datasets from most external systems. ## How it works The import process consists of a few simple steps: 1. **Select Data destination.** Open the desired Module and choose the Space where your data will be imported. Then click **+ New Data source**. ![](/img/guides/working-with-data/import-data-from-file-1.webp) 2. **Choose source type.** Select the **Upload a file** option. ![](/img/guides/working-with-data/import-data-from-file-2.webp) 3. **Upload your data file** (e.g. CSV, XML, XLSX) and click **Continue**. ![](/img/guides/working-with-data/import-data-from-file-3.webp) 4. **Map Fields.** Boost.space uses AI to analyze your data structure and suggest the most suitable field setup. During the import process, you define how data from your file is mapped to fields in Boost.space. * Your uploaded data (e.g. CSV) is analyzed automatically * AI proposes matching **field types** * Each **source field** (from your file) is matched to a **target field** (in Boost.space) * You can map data to existing fields or create new ones * Unmapped columns can be created as new fields. ![](/img/guides/working-with-data/import-data-from-file-4.webp) 5. **Data preview.** Before importing, you can **review** your data: * See how fields are mapped * Validate values and formats * Identify missing or incorrect mappings Only valid data will be imported, helping you avoid errors. Click **Continue** to proceed. ![](/img/guides/working-with-data/import-data-from-file-5.webp) 6. **Start import.** Confirm and start the import process. ![](/img/guides/working-with-data/import-data-from-file-6.webp) 7. **View your Data.** Once the import is complete, your data will appear in the **selected Space** and is immediately ready to use. ![](/img/guides/working-with-data/import-data-from-file-7.webp) --- title: Filtering records description: >- Build simple or complex filters in Boost.space — conditions, condition groups, and AND/OR logic — and save them as reusable Views. --- # Filtering records Filtering narrows a table to just the records you want to see. Open the **Filter** on a records table and build a rule from **conditions** — from a single condition to a complex set combined with AND/OR logic. A live **Matching records** count updates as you build. ## Build a filter A filter reads top to bottom as a sentence: *show records **where** …*. 1. Click **Filter**, then **Add condition**. 2. Each condition has three parts: a **field**, an **operator**, and a **value** — for example `Status` `Equals` `Active`. 3. Add more conditions and choose how they combine: **and** (a record must match all) or **or** (any). The first condition reads *Where*; each one after it shows the **and / or** selector. The **Matching records** count at the bottom shows how many records match right now. **Clear filter** removes everything. ## Condition groups For complex logic, use **groups**. Add a group with **Add group**, and combine groups with their own **and / or** — so you can express rules like: > *(Status is Active **and** Space is Leads) **or** (Created by is me)* Conditions inside a group combine with each other; groups combine with each other. This two-level structure covers most real filtering needs. ## Operators The operators available depend on the field's type: | Field type | Typical operators | |---|---| | **Text, Website, Email** | equals · not equals · contains · does not contain · starts with · ends with | | **Number, Rating, Percentages** | equals · not equals · greater than · ≥ · less than · ≤ | | **Date, Date and time** | equals · not equals · before (`<`) · after (`>`) · on or before/after | | **Single/Multi select, Status, Labels** | is any of · is none of · not equals | | **Users, Linked records** | is any of · not equals | The **value** input adapts to the field — a date picker for dates, a record picker for links, a user picker for Users, and so on. ## Save a filter as a View Turn a filter you use often into a **View**: give it a name and it appears as a tab above the table, one click to reapply. Views can be **shared** with specific users, teams, or roles, so your team works from the same slices of data. The **Main** view is the unfiltered table. Admins create shared Views; the filter itself is available to anyone working in the table. ## Related - **[Segmenter](/guides/working-with-data/segmenter)** — for very large datasets, load and work with one segment at a time. - **[Labels](/guides/fields/labels)** · **[Statuses](/guides/fields/statuses)** — common things to filter on. --- title: Segmenter description: >- The Segmenter helps Boost.space users handle large datasets by creating filtered segments. This speeds up data loading and lets you reuse the same filter elsewhere in Boost.space. --- # Segmenter The Segmenter is a helpful feature for users who work with large datasets inside Boost.space. When a module contains many records, loading the full dataset can take time. The Segmenter helps by allowing you to load and view only a part of the data at once. Segments can be created only by administrators, ensuring consistent data management across the platform. ## When the segmenter is active The Segmenter can be: * **Turned on manually** in the System Settings, or * **Automatically activated** when a module contains **more than 70,000 records**. When it's active, the system loads only selected parts of your data instead of the whole module at once. This makes the interface faster and more responsive. ![](/img/guides/working-with-data/segmenter-1.webp) ## Creating a segment When you open a module, you will see a button at the top that says **"+ Segment"**. ![](/img/guides/working-with-data/segmenter-2.webp) You can create multiple segments, each with its own filter. Boost.space keeps the **last 5 opened segments** in the local cache. If you open a sixth one, the oldest one is removed from the cache. ![](/img/guides/working-with-data/segmenter-3.webp) When you add a New segment, a filter table appears. You can choose: * **Field** – e.g. Product ID, Creator, etc. * **Operator**– e.g. equals, greater than, starts with * **Value** – the value to compare This allows you to define exactly what records should be included in the segment. In addition, you can add multiple conditions to refine your segment even further. Conditions can also be grouped together, and for each group you can choose whether they should be connected by **AND** or **OR**: * **AND** means that records must meet _all_ selected conditions at the same time. * **OR** means that records can meet _any_ of the conditions to be included in the results. ![](/img/guides/working-with-data/segmenter-4.webp) Once saved, the segment appears in the top bar. Clicking it shows only the filtered records. You can also assign users who will be able to view this segment, making it easy to share relevant data with the right team members. ![](/img/guides/working-with-data/segmenter-5.webp) ## Segment actions Right-clicking on a segment opens a menu. One useful option here is **Copy filter**. This copies the segment's filter rules so you can reuse them elsewhere in Boost.space — for example when [filtering records](/guides/working-with-data/how-do-i-filter-records) in another view. ![](/img/guides/working-with-data/segmenter-6.webp) ## Two ways to use a segment Most people treat a segment as furniture: you build it once and it stays. That is one of its two jobs, and the less interesting one. **A standing queue.** A segment whose filter describes *work that needs doing* becomes a permanent attention list — records with a validation error, items waiting for approval, anything parked in a status a human has to clear. Because the filter is evaluated live, the list maintains itself: fix a record so it no longer matches and it leaves the segment on its own. Watching the count fall to zero is the progress bar. Put the ones people should check every day [in their menu](/guides/settings/menu-editor) so they do not have to remember to look. **A throwaway.** A segment can equally exist for an afternoon. "These 40 products need new photos" — make the segment, hand the link to whoever is doing it, delete it when the work is done. Creating one is cheap and there is nothing to clean up afterwards but the segment itself. Opening a segment puts it in the address bar, so **copying the URL shares that exact filtered view** — no export, no screenshot, no explaining which filter to set. Whoever opens it needs access to the space and to be assigned the segment; they then land on the same records you were looking at. Nothing removes an empty segment for you. A segment that has emptied out is exactly what a finished standing queue looks like, so Boost.space cannot tell the difference between *done for now* and *done forever* — deleting is a decision you make, not something that happens to you. **Name it after the job, not the filter.** *Needs photos* tells the next person what to do; *status = 3 AND image IS NULL* makes them work it out. This matters most for the throwaway segments, which are the ones somebody else opens from a link with no context. ## The human-in-the-loop pattern Put those pieces together and you get the shape most Boost.space work with AI ends up taking. Software handles what it can and hands the rest to a person, in a form that person can act on immediately. 1. **A filter describes the leftovers.** Whatever the automation could not decide — missing data, a status only a human can set, anything flagged for review. Save it as a segment. 2. **Tell the people who have to act.** An [automation](/guides/automation/actions-and-triggers) emails or notifies them when a record lands in that state, and `{$entityLink}` puts a link to the exact record in the message. No hunting. 3. **Keep the queue in sight.** Add the segment to their [menu](/guides/settings/menu-editor) so it is there every time they open the app, rather than something to remember to check. 4. **The queue empties itself.** Each fixed record stops matching the filter and leaves. Nobody marks anything as done — the count falling is the progress. 5. **Then decide whether it lives.** A recurring kind of leftover stays as a standing queue. A one-off gets deleted, by whoever made it. Nothing here is a feature you switch on. It is a filter, a notification, and a menu entry — the value is in wiring them together, and it works the same whether the records were flagged by an automation, by an [agent](/ai/mcp/server/for-agents), or by a person noticing a problem. --- title: Processing large data description: >- How to move a lot of records at once — bulk endpoints instead of row-by-row calls, and segments to keep a big module workable in the browser. --- # Processing large data Two different problems hide under "we have a lot of records", and they have two different answers. **Writing** a lot of data is about using bulk endpoints instead of a loop. **Looking at** a lot of data is about giving the browser a bounded slice to render. ## Writing: one bulk call, not a thousand small ones Most write endpoints accept an array as readily as a single object. Sending 500 records in one request instead of 500 requests is not a small optimisation — each request otherwise repeats the connection, the authentication, and the permission resolution, and you pay that overhead 500 times for nothing. The bulk operations are documented in the **[API reference](/api-reference)** under the entity they belong to rather than in a section of their own, so look for them beside the single-record ones: | What you are writing | Bulk operation | |---|---| | Records | `PUT /record` — update many records in one call | | Modules | `POST /module` (create) and `PUT /module` (update) | | Fields | `PUT /field`, and `PUT /field/order/{id}` to reorder a group | | Labels | `PUT /label`, `DELETE /label` | | Statuses | `PUT /status/` | | Users | `PUT /user` | An **[SDK](/sdk)** is the easier route if you are writing code: the same method takes one item or many, and the `*Chunked` variants split an oversized batch for you and hand back a per-chunk result, so one bad row does not cost you the whole run. **Pick a batch size and stay well under the request limit.** There is no documented cap on items per call, but a request that is too large fails as a request, not as a friendly error. A few hundred records per call is a sane default; if you are also writing wide records with many custom fields, come down from there. Chunking with the SDK saves you doing this arithmetic. **Ask for a page when you read.** `GET /record` without `limit` returns everything that matches, which on a large module means a response nobody wanted. Pass `offset` and `limit`, and read the total from the `X-BoostSpace-FoundRecords` header to know how far you have to go. > An agent connected over [MCP](/ai/mcp) changes at most 500 records per call. For a larger import, > give the agent the job of deciding *what* to change, and do the writing in code. ## Looking at it: segments keep the browser honest The database is comfortable with far more records than a browser is. Rendering tens of thousands of rows means holding all of them in memory and laying every one of them out, and past a certain size the interface stops feeling instant no matter how fast the backend answered. That is what the **[Segmenter](/guides/working-with-data/segmenter)** is for. A [segment](/guides/working-with-data/segmenter) is a saved filter, so it hands the interface a bounded slice instead of the whole module — work through one slice, then move to the next. Above **70,000 records** in a module Boost.space switches this on by itself, because past that point loading everything is the wrong default. Cut the slices along a line that means something to the work rather than an arbitrary block of rows: one client, one region, one status, one month. A segment named after the job it serves stays useful, and it keeps the count small as a side effect. ## Next - [Segmenter](/guides/working-with-data/segmenter) — creating and managing segments - [Filtering records](/guides/working-with-data/how-do-i-filter-records) — the filter grammar segments are built on - [API reference](/api-reference) · [SDKs](/sdk) # Bulk actions and exporting [Bulk edits and exporting](https://fast.wistia.net/embed/iframe/p1g7zps93z?seo=true\&videoFoam=true) ## Using bulk actions Bulk actions allow you to select multiple records and apply changes across them at once. Here's how to use bulk actions: 1. **Select Records**: You can select one or more records within your space. Once you select the records, a _Bulk Actions_ button will appear at the right side of the screen.\ ![](/img/guides/working-with-data/bulk-actions-and-exporting-1.webp) 2. **Apply Bulk Action**: After selecting your records, click on the Bulk Actions button.\ ![](/img/guides/working-with-data/bulk-actions-and-exporting-2.webp) 3. A dropdown menu will appear for you to choose from. For example, you can bulk **add a label** to all the selected records. This action will be applied to every record you have chosen, and you'll see it reflected in your database after a brief moment.\ You can also update multiple fields at once using the **Bulk Edit** feature. Simply click on **Bulk Edit**, and add the fields you'd like to change. This makes it quick and efficient to apply updates across many items simultaneously.\ ![](/img/guides/working-with-data/bulk-actions-and-exporting-3.webp) 4. When searching for records or fields within the Bulk Actions and Exporting interface, you no longer need to scroll through the list manually. Simply **start typing what you are looking for**, and the system will automatically filter and display matching results as you type. ![](/img/guides/working-with-data/bulk-actions-and-exporting-4.webp) ## Exporting Boost.space offers a straightforward way to **export your data**. Once you've selected your data, you can export it directly to an Excel file. The exported file will include the columns you currently have visible in your viewport, and the order of the columns will be the same as it appears on the screen. This ensures that the exported data matches the layout you're working with. ![](/img/guides/working-with-data/bulk-actions-and-exporting-5.webp) # Calculations on columns Boost.space can calculate summary metrics on a column instantly — no formulas or manual tracking needed. [Instant calculations on columns](https://fast.wistia.net/embed/iframe/1axzf6lq4e?seo=true\&videoFoam=true) ## How to use the data calculation feature To access this feature, follow these steps: 1. Navigate to the module containing your data. 2. Scroll all the way to the bottom of your columns. 3. Hover over the bottom of a column to reveal the **Calculate** button, then click it to choose a calculation. ![](/img/guides/working-with-data/calculations-on-columns-1.webp) ## What you can calculate Once you click the _Calculate_ button, you'll have the option to instantly calculate key metrics related to your data. For example: * **Empty Fields**: Quickly count how many fields in your data set are empty. * **Filled Fields**: See how many fields have been completed with data. * **Unique Records**: Determine how many unique records are present in your data set. * **Percentage of Filled Data**: Calculate the percentage of data that has been filled out compared to the total number of fields. These give you an immediate read on your data's completeness and quality. ![Calculation results on a column](/img/guides/working-with-data/calculations-on-columns-2.webp) --- title: Remote IDs description: >- Remote IDs pair Boost.space records with their identifiers in external applications, so syncs and agents always update the right record. --- # Remote IDs Remote ID is a table in the database for pairing third party records with Boost.space records where one Boost.space record can have several Remote IDs from external systems. Remote IDs are good to use both when synchronizing data and when working with third party applications. With the help of remote IDs you can easily query specific records. Remote IDs consist of two fields – _**Remote ID**_ and **_Remote Application_**. In the _Remote ID_ field, enter the record's ID in the external system, and in the _Remote Application_ field, enter the name of that external application. The Remote Application matters when you sync several tools, so their IDs don't collide. In [automation](/guides/automation/views), the Boost.space app's actions in Make — such as _Create a record_, _Update a record_, and _Search records_ — already expose fields for the Remote ID. ![](/img/guides/working-with-data/remote-ids-1.webp) On the output when getting the log data, the Remote ID structure looks just like an array with objects of individual Remote IDs. ![](/img/guides/working-with-data/remote-ids-2.webp) # Data consolidation & token priority **Data consolidation** merges data from multiple sources into a single, up-to-date record instead of piling up duplicates. Two mechanisms work together: the **[key field](/guides/fields/key-column)** decides _which record_ incoming data belongs to, and **source priority** decides _which value wins_ when two sources set the same field. [Data consolidation & token priority](https://fast.wistia.net/embed/iframe/pzitklaw8e?seo=true\&videoFoam=true) ## How the key field matches records Every incoming write — from an [import](/guides/working-with-data/import-data-from-file), a [Make scenario](/guides/automation/views), or the [API](/api-reference) — is matched against the space's [key field](/guides/fields/key-column). A match **updates** the existing record; no match **creates** a new one. Set the key to whatever uniquely identifies your data (email, SKU, order number). ## Source priority Each source that writes data — every [API token](/ai/mcp/server/token-creation), plus manual entry — has a **priority**. When two sources set the same field on the same record, the **higher-priority** source wins. There are seven levels: **Highest › Higher › High › Medium › Low › Lower › Lowest** * **Medium is the default** for everything — every new token _and_ data entered or imported **manually**. So by default all sources sit at the same level, and the most recent write wins. * Raise a trusted source above **Medium** so it always wins; drop a noisy one below so it can never overwrite better data. * Priority governs **writes into Boost.space** (the Connect and Enrich directions). Exports (Share) don't consolidate. > Manual entry isn't special — it's simply at **Medium**. A source above Medium _can_ overwrite a value you typed; a source below Medium can't. ## Set priorities Setting priorities is available on higher plans — see the [pricing page](https://boost.space/pricing/). Open a module and switch to the **[Flow view](/guides/automation/views)**. * **Per source** — set a token's base priority, applied to every field it writes. * **Per field** — open a field's **Data aggregation** settings (the gear on the column) to override priority for that field only. **Restore default** clears the override. ## In short The key field keeps one record per real-world entity; priority keeps the _right_ value on it when sources disagree — giving you one clean, trusted dataset no matter how many tools feed it. See also [Remote IDs](/guides/working-with-data/remote-ids), which record each source's external identifier for the matched record. --- title: Automation overview description: >- Keep your Boost.space data current automatically — native triggers and actions, your own code in a secure sandbox, and Make scenarios across apps. --- # Automation overview Automation keeps your data current without manual work. Boost.space gives you three complementary kinds — and one conversational way to build them all: | | Native actions & triggers | Code automations | Make scenarios | |---|---|---|---| | **What runs** | Notification, email, webhook | **Your own Python**, in a secure sandbox | Flows on your connected Make account | | **Good for** | Reacting to record changes and schedules | Any logic you can express in code | Moving data between Boost.space and 2,600+ apps | | **Set up in** | [Actions & triggers](/guides/automation/actions-and-triggers) | [Code automations](/guides/automation/code-automations) | The [Connect / Enrich / Share](/guides/automation/views) views | ## Native actions and triggers A **trigger** fires the automation — when a record is **created, updated, or deleted** (scoped to a module, optionally specific spaces), or **at a scheduled time** (minutes to months, or once). An **action** is what runs: a system notification, an email, a webhook — or code. See [Actions and triggers](/guides/automation/actions-and-triggers). ## Code automations The most powerful action is your own: a **Python script** running in a **secure, isolated sandbox** against your data, with credentials kept in a **secret vault** that never leaks into code or conversation. Write it by hand, or don't write it at all — see the vibecoded path below. Full guide: **[Code automations](/guides/automation/code-automations)**. ## Vibecoded: built by describing You don't have to configure any of this by hand. Tell [any agent connected over MCP](/ai/mcp/server/for-agents) what should happen — *"every Monday at 8:00, summarize last week's orders and email me"* — and the agent creates the automation, wires the trigger, writes the code, asks you for the Secrets it needs, tests it, and deploys. It can also list your automations, edit them, run them, and read their logs when something needs a look. ## Make scenarios For moving data in and out of other apps, Boost.space connects to **[Make](https://www.make.com)**. You link your own Make account once, then build **scenarios** that import data into a module, enrich existing records, or share data out — surfaced directly on the module as the **Connect**, **Enrich**, and **Share** views. See [Make scenarios and views](/guides/automation/views). Scenarios you built in the older **Integrator**, and the per-app connection guides, are archived at **[legacy-api.boost.space](https://legacy-api.boost.space)** — see [Legacy & older plans](/guides/billing/legacy) for what maps to what. ## Keeping data clean Every kind of automation writes to the same records, so consolidation matters: the [key field](/guides/fields/key-column) decides whether incoming data updates a record or creates one, and [API token prioritization](/guides/working-with-data/api-token-prioritization-data-consolidation) decides which source wins when values conflict. # Actions and triggers [Actions and triggers](https://fast.wistia.net/embed/iframe/vkli5lq5l7?seo=true\&videoFoam=true) **Actions and triggers** are Boost.space's **native** automation — they run inside Boost.space with no external account. A **trigger** decides _when_ an automation fires; an **action** decides _what happens_. Manage them under **System settings → Automations**, or have your own AI agent build one over **[MCP](/ai/mcp/server/connect-via-mcp)**. ## Triggers — when it fires | Trigger | Fires | | --------------------- | ------------------------------------------------- | | **Record created** | When a record is added to the module | | **Record updated** | When a record changes | | **Record deleted** | When a record is removed | | **At scheduled time** | On a schedule you define — no record event needed | **Record triggers** are always scoped to a **module**, and can be narrowed further — to specific **spaces**, or with a more detailed condition — so the automation fires exactly when you mean. **At scheduled time** covers every rhythm: | Interval | You set | | ------------------- | -------------------------------------------------- | | **Minutes / Hours** | Every N minutes or hours, from a start time | | **Days** | Every N days, at a time | | **Weeks** | Every N weeks, on the weekdays you pick, at a time | | **Months** | Every N months, on a day of the month, at a time | | **One time** | A single date and time | Times are shown in **your local timezone**; the trigger fires at the same absolute moment for everyone in the system. ## Conditions — narrowing a record trigger A record trigger can fire on every change in its module, or only on records that match conditions you set. Build them in the trigger card — **When this happens** — below **Spaces**. The builder is there for **Record created**, **Record updated** and **Record deleted**, on a module that has fields to condition on. * The first row opens with **Where**. Each row after it is joined to the one before with **and** or **or**, chosen per row. * **Add condition** adds a row to the group you are in; **Add group** starts a new group. **A group is the bracket** — its rows resolve first, then the group joins the ones before it. That is how you say _this, and either of those_. * Joins read **left to right**, and **and** does not bind tighter than **or**: `A or B and C` is _(A or B) and C_. * Compare with **Equals**, **Unequal**, **More than**, **Greater than or equal to**, **Less than** or **Less than or equal to**. A **status** condition takes no operator: pick the status and it matches. * **Record updated** has one more: **Changed** fires whenever that field changed, whatever it changed to. It takes no value, and only that trigger has it. * [Rollup](/guides/fields/rollup) and [Formula](/guides/fields/custom-fields-formula) fields are not offered as condition fields. Condition on the fields they are computed from instead. ## Actions — what happens | Action | What it does | | ----------------------- | ---------------------------------------------------------------------------------------------------------- | | **System notification** | Notifies the users you choose, inside Boost.space | | **Email** | Sends an email | | **Webhook** | Calls a URL with the event's data — for developers wiring external systems | | **Code** | Runs your own Python in a secure sandbox — see **[Code automations](/guides/automation/code-automations)** | Actions are defined once (under **Actions**) and attached to triggers, so one action can serve several automations. ## Dynamic values An email, a notification or a webhook does not have to send fixed text. Wrap a value in single braces and it is resolved from the record that fired the trigger, so one action serves every record it ever runs on. ```text Product {$entity->name} (ID {$entity->id}) changed status to {$entity->status['name']}. Fix it here: {$entityLink} ``` Inside the braces you can use: | Expression | Resolves to | | -------------------------------- | ---------------------------------------------------------------------------------------------------- | | `{$entity->field}` | Any field of the triggering record, named exactly as the **[REST API](/api-reference)** names it | | `{$statusName}` | The name of the record's status | | `{$entityLink}` | A ready-made URL that opens that record in the app — the one thing you want in a "go fix this" email | | `{$steps[]['output']}` | What an earlier **[Code](/guides/automation/code-automations)** action in the same run returned | **Field names are the API's names, not the column headings.** Look a field up in the [API reference](/api-reference) — or fetch one record and read the JSON — and use the key you see there. Casing is not uniform across fields, so copy it rather than guess it. **Nested values are indexed, not chained.** A status arrives as a small object, so it is `{$entity->status['name']}` — square brackets and quotes. `{$entity->status->name}` renders nothing. **Custom fields are addressed by their numeric ID**, because a custom field has no fixed name to reference: ```text {(array_column($entity->customFieldsValues, null, 'customFieldInputId')[123]['value'])} ``` You do not have to type that. In an email's subject and in a notification's text, click **Add variable**; in the email body, click **Add field** in the editor toolbar, or type `/`. Pick a field — or **Link to record** or **Status name** — and it goes in as a chip that is saved as the expression. ### Where it works, and where it does not | Field | Dynamic values | | ----------------------------------------------------------- | --------------------------------- | | Email subject and body | yes | | Notification text | yes | | Webhook URL and headers | yes | | Webhook body, when you author the payload yourself | yes | | Webhook body, when you pick fields or send the whole record | no — the payload is built for you | The email and the notification have the picker. In a webhook you type the expression by hand, so copy one that works. The obvious use is telling somebody a record needs them, with `{$entityLink}` so they land on it directly. That is one leg of the **[human-in-the-loop pattern](/guides/working-with-data/segmenter)** — the notification that turns a queue of leftovers into work somebody can actually pick up. > **Scheduled triggers have no record.** A trigger that fires on a schedule rather than on a record change has nothing to resolve against, and every expression is emitted **literally** — the recipient reads `{$entity->name}`. Keep dynamic values for record triggers, and have scheduled automations pull what they need in a [Code](/guides/automation/code-automations) action instead. An action attached to a scheduled trigger does not offer the picker. ## Create one 1. Open **System settings → Automations**. 2. Under **Triggers**, click **New trigger** — name it, pick the **module**, and choose the **trigger**. 3. Attach the **automated action** (or create one under **Actions** first). Or ask your own AI agent over [MCP](/ai/mcp/server/connect-via-mcp): > _"When a record in Leads gets the status Won, email the sales channel a summary."_ ## Next * **[Code automations](/guides/automation/code-automations)** — when the action is your own logic * [Make scenarios and views](/guides/automation/views) — for moving data between apps * [Automation overview](/guides/automation) --- title: Code automations description: >- Run your own Python code as an automation step — written by you or by your own AI agent — in a secure, isolated sandbox with Secrets kept safe. --- # Code automations When notifications, emails, and webhooks aren't enough, write the logic yourself. The **Code** action runs a **Python** script as an automation step — against your data, in a **secure, isolated sandbox**. What the script does is up to you: the possibilities are as wide as code. ## Two ways to write the code - **Let your own AI agent write it** — any agent [connected over MCP](/ai/mcp/server/connect-via-mcp) writes the script, wires the [trigger](/guides/automation/actions-and-triggers), asks you for the Secrets it needs, tests it, and deploys. This is the **vibecoded** path: automation in minutes, no developer required. - **Write it by hand** — a code editor in the automation's settings, for developers who want full control. ## How a Code step works ```python def main(input): # your logic — work with the record that triggered the run, # call an external API, compute, decide… return {"status": "processed"} ``` - **Inputs are detected from your code** — reference what you need and the editor picks it up. - **The output schema comes from a test run** — run the step once and its output becomes typed data the next steps in the automation can use. - **Runs are logged** — every execution keeps its output and result, in the automation's log (an agent connected over MCP can read it too — ask it *"why did last night's run fail?"*). ## Secrets stay secret API keys and credentials the code needs live in the **secure vault**, never in the code: - Add a Secret in the automation's settings — or let your agent ask for it: you get a **secure one-time form**, so the value never passes through the conversation. - At runtime the Secret is **injected into the sandbox** — it doesn't appear in the code, the conversation, or the logs. ## The sandbox Each run executes in an **isolated environment** that exists only for that run — separated from other automations, other users, and other systems. It gets your inputs and Secrets, does its work, returns its output, and is gone. ## Trigger it however you need A Code step runs from any [trigger](/guides/automation/actions-and-triggers): when a **record is created, updated, or deleted**, **at a scheduled time**, or on demand. ## What people build with it - **Enrichment** — on new record, call an external API (key stored as a Secret) and fill in the missing fields. - **Scheduled digests** — every morning, aggregate yesterday's records and post the summary where the team lives. - **Guardrails** — validate incoming data with real logic, beyond what [formulas](/guides/fields/custom-fields-formula) can express, and flag what fails. - **Custom sync** — push changes to an internal system that has an API but no [Make](/guides/automation/views) app. ## Next - [Actions and triggers](/guides/automation/actions-and-triggers) — wire the trigger - [Connect via MCP](/ai/mcp/server/connect-via-mcp) — let your agent build it - [Automation overview](/guides/automation) — how it all fits together --- title: "Views: Connect, Enrich, Share, Flow" description: >- On a Make-connected module, Boost.space shows your automation as Views — Connect, Enrich, Share, and Flow — each surfacing the Make scenarios that move data in a direction. --- # Views: Connect, Enrich, Share, Flow Automation between Boost.space and other apps runs on **[Make](https://www.make.com)** — you connect your own Make account, and your **scenarios** run there against your Boost.space data. Rather than hiding those scenarios away, Boost.space surfaces them on the module itself as a set of **Views**, each one a direction of data flow. Switch views from the toolbar; each lists the relevant scenarios as nodes you can open, edit, or add to. > Views appear for **admins** on a module that's **connected to Make**. Everyone else works in the > data (Organize) view. ## The views | View | What it shows | Direction | |---|---|---| | **Organize** | The normal data table (and Kanban, etc.). | — | | **Connect** | Scenarios that **import** data into this module. | External app → Boost.space | | **Enrich** | Scenarios that **augment** existing records. | Boost.space → app → Boost.space | | **Share** | Scenarios that **export** data out of this module. | Boost.space → external app | | **Flow** | A single diagram of every scenario and connection wired to the module. | The whole picture | Adding or editing a scenario from any view opens the Make editor; the finished scenario appears as a node in that view. Each scenario uses **connections** — authenticated access to the external apps it reads from and writes to. ## Connect your Make account Link your Make account once. You are asked for the token the first time you use something that runs a Make scenario, and you can add it any time in **System settings → Integration**: 1. In Make, create a **Make API token**. 2. Paste it into Boost.space and choose your **team / organization** (and hosting region, if asked). 3. Save. Your modules can now use Make scenarios, and the views above appear. ## Keeping incoming data clean **Connect** and **Enrich** scenarios write into your records, so consolidation matters. The [key field](/guides/fields/key-column) decides whether an incoming record updates an existing one or creates a new one, and [API token prioritization](/guides/working-with-data/api-token-prioritization-data-consolidation) decides which source wins when values conflict — you set both from the **Flow** view. (The Share view exports data out, so it has no consolidation settings.) ## Import a file instead Bringing in a one-off file rather than an ongoing sync? Use [Import data from a file](/guides/working-with-data/import-data-from-file) — it maps columns to fields with AI, no scenario needed. ## Going deeper Building complex scenarios, working with a specific app, and the full app catalog are covered in the archived automation & app documentation at **[legacy-api.boost.space](https://legacy-api.boost.space)** — per-app guides live under [legacy-api.boost.space/applications](https://legacy-api.boost.space/applications). What is archived and what replaced it is mapped on [Legacy & older plans](/guides/billing/legacy). --- title: Comments description: >- Discuss work directly on a record — leave notes, ask questions, and see the automatic activity trail. --- # Comments **Comments** let your team discuss work right where it lives — on the record. Leave a note, ask a question, or post an update, and everyone with access to the record sees it in context. Boost.space also adds **automatic comments** for key events — who created the record, who assigned users — so every record carries its own activity trail. ![Comments on a record](/img/guides/collaboration/comments-1.webp) ## Where to find them On modules that support comments, open a record's **detail** — the comments section sits at the bottom. ![The comments section in a record detail](/img/guides/collaboration/comments-2.webp) ## Add a comment Type your message in the comment box and send it. It's immediately visible to everyone who can open the record. ![Writing a comment](/img/guides/collaboration/comments-3.webp) > Visibility follows permissions: a person sees and writes comments only on records they can > access — the same [space roles](/guides/spaces/space-roles-members-managers-and-owners) as the data > itself. ## Next - [Notifications](/guides/collaboration/notifications) · [Manage records](/guides/records/manage-records) # Notifications Boost.space sends short notifications about important events and changes that affect you. [Notifications](https://fast.wistia.net/embed/iframe/rda3lv5hoi?seo=true\&videoFoam=true) A notification is sent, for example, when someone: * **assigns** a user or team to a space/record; * **removes** a user or team from a space/record; * **changes** the status of a space/record; * **adds a comment** to a space/record. ## Enable notifications You need to enable notifications to receive them. The first time you open the system, your browser asks whether to allow them. If you declined, re-enable them from your profile: **profile picture → My profile → Push notifications → Subscribe / Unblock**. ![Enabling push notifications in your profile](/img/guides/collaboration/notifications-1.webp) You can also see your notifications in-app via the **bell icon** in the left sidebar. ![The notifications bell in the sidebar](/img/guides/collaboration/notifications-2.webp) ## Follow a record To keep notifications focused, users who created a record but aren't directly assigned to it don't get automatic notifications for it. To follow a record you're not assigned to, click its **tracking icon** — you'll then get all its updates. ![The tracking icon on a record](/img/guides/collaboration/notifications-3.webp) Notifications make sure you don't miss anything important — an assignment, a status change, or a new [comment](/guides/collaboration/comments). --- title: Log in to Boost.space description: >- Discover how to effortlessly log into your Boost.space account, either through the Gate or directly via your system's URL, with our concise step-by-step guide. --- # Log in to Boost.space There are two ways to log into your Boost.space system. ## Via Gate ![](/img/guides/account/logging-in-1.webp) 1. Go to the [gate.boost.space](https://gate.boost.space) page 2. Here, you will need to fill in your [system name](/guides/settings/system-name-system-key), username, and [password](/guides/account/password-change-reset) 3. After filling in these details, you are automatically redirected into the system ## Via your system URL ![](/img/guides/account/logging-in-2.webp) 1. Type your URL into the URL bar – e.g., https://_**MYSYSTEMNAME**_.boost.space 2. On this page, just fill in your username/email and your [password](/guides/account/password-change-reset) 3. After filling in these details, you are automatically redirected into the system > Not sure what your system name is? See [System name and system key](/guides/settings/system-name-system-key). --- title: Change or reset your password description: >- Easily change or reset your password on Boost.space with our straightforward guide, ensuring secure and hassle-free account access. --- # Change or reset your password ## How to change your password To change your password, go to the main screen of your system. Click your **avatar** in the bottom left corner and then on **Change password**. ![](/img/guides/account/password-change-reset-1.webp) Then you need to fill in your original password + create a new one. Click **Save**. ![](/img/guides/account/password-change-reset-2.webp) ## How to reset your password Go to the URL of your system – ex. _**MYSYSTEMNAME**_.boost.space (write the name of your system followed by the domain boost.space). Here click "**Forgot your password**?" ![](/img/guides/account/password-change-reset-3.webp) Fill in your email, then follow the instructions sent to that address. ![](/img/guides/account/password-change-reset-4.webp) --- title: Two-factor authentication (2FA) description: >- Two-Factor Authentication (2FA) in Boost.space adds a simple extra layer of security to your account. Learn what it is, why it matters, and how to set it up in just a few steps. --- # Two-factor authentication (2FA) **Two-Factor Authentication (2FA)** adds an extra layer of protection to your account, keeping your data safe even if your password is compromised. ## What is two-factor authentication (2FA)? 2FA is a security feature that requires not just your password, but also a second form of verification to access your account. This dramatically reduces the risk of unauthorized access, especially in the case of stolen or leaked credentials. While passwords can be guessed or exposed, the second factor — typically a time-based code from an authentication app — ensures that only you, with access to your personal device, can log in. ## How to enable 2FA in Boost.space 1. Click your **avatar** in the bottom-left corner and go to **Profile Settings**. 2. In the security section, choose to **enable Two-Factor Authentication**. ![Enabling 2FA in profile settings](/img/guides/account/two-factor-authentication-2fa-1.webp) 3. Download an authentication app (**Google Authenticator**, **Authy**, or **Microsoft Authenticator**) on your phone. ![Choosing an authentication app](/img/guides/account/two-factor-authentication-2fa-2.webp) 4. Scan the **QR code** on screen with the app — it starts generating time-based codes. ![Scanning the QR code](/img/guides/account/two-factor-authentication-2fa-3.webp) 5. Save the **backup codes** somewhere safe — they let you regain access if you lose your device. ![Backup codes](/img/guides/account/two-factor-authentication-2fa-4.webp) That's it — 2FA is now active. ### What happens next? The next time you log in to Boost.space: * Enter your email or user name and password as usual. ![](/img/guides/account/two-factor-authentication-2fa-5.webp) * Then, you'll be asked to enter a **6-digit code** from your authentication app. ![](/img/guides/account/two-factor-authentication-2fa-6.webp) * Once verified, you'll be granted access to your account. This simple extra step greatly increases your security and helps prevent unauthorized access to your data. --- title: Status center description: >- The Status Center gives you a quick overview of your system's technical status—such as connection, data sync, browser compatibility, and security settings—so you can ensure everything is running as expected. --- # Status center The **Status Center** is a helpful diagnostic tool available in the left-hand panel of your Boost.space interface. It gives you a quick overview of technical conditions that ensure your system is functioning optimally. The Status Center helps you identify potential problems related to your system setup, connection, or browser environment. ![](/img/guides/account/status-center-1.webp) ## What does the Status Center check? The Status Center monitors the following key areas: 1. **Connection** — indicates whether your internet connection is stable. If unstable, some parts of the system may not work as expected. 2. **Data Synchronization** — shows whether your system is working with the latest data. If data is outdated or syncing is delayed, this status will alert you. 3. **Browser Compatibility** — displays information about the browser you're currently using. Some features may not work correctly in unsupported or outdated browsers. 4. **System Version** — shows the current version of the Boost.space system you're running. Staying on the latest version ensures compatibility and access to new features. 5. **Security Checks** — this checks whether **Content Security Policy (CSP)** and other essential browser security configurations are functioning properly. CSP is a browser mechanism that helps protect against cross-site scripting (XSS) and other code injection attacks. If these checks fail, parts of the system may behave unexpectedly or become vulnerable. 6. **Local Storage** — indicates whether your browser allows Boost.space to use local storage. Local storage is essential for temporarily saving data and ensuring smooth user experience between page transitions. 7. **Live Updates** — verifies if your system is receiving real-time updates. If disabled, you might experience delays in reflecting new data or changes. ## How to use it If any of the monitored items are **not green**, it means that specific aspect does not fully meet system requirements. Click on the row to expand more details and see recommended steps to fix the issue. ### Available beyond the homepage The Status Center isn't limited to the homepage—you can also access it inside any module. There, it will show whether all relevant data for the module has already been loaded, or how long it will take to finish loading. ![](/img/guides/account/status-center-2.webp) --- title: System settings description: >- Where admins configure Boost.space — system name, languages, currency, table and detail behavior, email, and design — plus where to manage your own profile. --- # System settings Boost.space separates **personal settings** (any user) from **system settings** (admins only). Admins open **System settings** from the bottom of the sidebar. ## Your profile Click your **avatar** (bottom-left) to open your profile and update your **name**, **phone number**, **profile picture**, **interface language**, and **[password](/guides/account/password-change-reset)**. Your account **email** can't be changed in-app — [contact support](/?support). ## About the system The **Main settings** card holds your system's core configuration: | Setting | What it is | |---|---| | **Version** | The Boost.space version this system runs (read-only). | | **System name** | Your system's display name. | | **Interface language (default)** | The default UI language for the system. | | **Currency (default)** | The default currency for money values. | ### Advanced settings | Setting | What it does | |---|---| | **Available languages** | Which languages users can switch between. | | **Disable client cache** *(not recommended)* | The client cache stores data browser-side and greatly speeds up the system and sync. Turning it off slows everything down. | | **Enable performance profiling** | Collects technical performance data to find bottlenecks and troubleshoot — no personal or sensitive data. | | **Use Boost.space Legacy Integrations** *(not recommended)* | Older integrations that are no longer updated. Prefer the newer alternatives. | | **Show SMTP and system email settings** | Adds the SMTP section (below) so you can set the sender address and your own mail server. | | **Multiple currency support** | Lets modules hold multiple currencies without automatic conversion. | ## Tables & Details Settings Control how record tables and detail views behave across the system: | Setting | What it does | |---|---| | **Segments Mode – on-demand data** | Loads only the records that pass your saved filters; the rest stays on the server, so large tables open faster and use far less memory. This is what enables the **[Segmenter](/guides/working-with-data/segmenter)**. | | **Do not save table filters when leaving a module** | Applied filters reset as soon as you leave the module. | | **Do not save table sorting when leaving a module** | Sorting resets each time you leave and return to the module. | | **Clear saved table filters when returning to desktop** | Filters on table spaces are cleared when you return to the desktop. | | **Clear saved table sorting when returning to desktop** | Custom record order is reset when you return to the desktop. | | **Empty custom fields in Detail are hidden by default** | Empty fields are hidden on the record detail for performance; reveal them with the detail's toggle. | | **Show extended row counts** | Shows more detailed row counts. Note: many records on one page can slow the system depending on your device. | | **Automatically start edit mode in record detail** | Opens a record's detail ready to edit. | | **Enable custom file categories** | Adds a section in Main settings to define categories for uploaded files (e.g. design, final, contract). | | **Enable personal labels** | Lets users create [labels](/guides/fields/labels) visible only to them. | ## Email (SMTP) When **Show SMTP and system email settings** is on, configure your mail server — host, port, credentials, sender name and address, and security (None / SSL / TLS). See [SMTP setup](/guides/settings/smtp-setup-guide). ## Design Personalize the system's look — logos, login background, favicon, colors/theme, and the chat panel. See [Company design settings](/guides/settings/company-design-settings). ## More admin areas - **[Modules](/guides/modules/setting-up-individual-modules-admin)** — add, configure, and remove modules. - **[Menu editor](/guides/settings/menu-editor)** — control navigation and the homepage. - **[Actions and triggers](/guides/automation/actions-and-triggers)** — native automation and webhooks. - **[Users and teams](/guides/settings/inviting-users-and-setting-up-teams-admin)** and roles. - **[Plans and billing](/guides/billing/plans-tiers-usage-limits)** — usage and upgrades. # System roles: users and admins Boost.space has two system-wide roles — **admin** and **user** — that set what a person can do across the whole system, on top of their per-[space](/guides/spaces) role. [System roles – users and admins](https://fast.wistia.net/embed/iframe/9sglnhb6pe?seo=true\&videoFoam=true) ## Admin A system administrator can add, remove, and manage **all three levels of the system**. They **manage all users** from **System settings**, which is **only accessible to administrators** via the bottom toolbar on the main desktop. Admins create [fields](/guides/fields) and [modules](/guides/modules) and set up [automation](/guides/automation) (including connecting your Make account); users can then fill in fields but not create them. The number of admins depends on your licence and tier — see the [pricing page](https://boost.space/pricing/). ## User System users can use modules and create or manage spaces and records to which they or their team have been **assigned**. They can **fill in fields** but are not able to create them. # Invite users and set up teams As an **admin**, you manage everyone in the system — inviting users, creating teams, and assigning roles. Open the **settings** icon at the bottom left of the home screen and choose **Users and teams**. [Teams](https://fast.wistia.net/embed/iframe/decsx7njr9?seo=true\&videoFoam=true) ![The Users and teams settings](/img/guides/settings/inviting-users-and-setting-up-teams-admin-1.webp) ![The Users and teams list](/img/guides/settings/inviting-users-and-setting-up-teams-admin-2.webp) ## Add users There are two ways to add a colleague: * **Invite by email** — enter their email and [role](/guides/settings/system-roles-users-and-admins) (user or admin). When they accept, they log in, fill in their details, and can be assigned to teams. The number of (non-admin) users is unlimited. ![Inviting a user by email](/img/guides/settings/inviting-users-and-setting-up-teams-admin-3.webp) * **Create manually** — fill in the user's details yourself and add them to teams or categories. They get access as soon as they log in. ![Creating a user manually](/img/guides/settings/inviting-users-and-setting-up-teams-admin-4.webp) > **The invitation didn't arrive?** Check the spam folder first. Invitations come from `system@mail.boost.space` unless you [send from your own SMTP](/guides/settings/smtp-setup-guide), so a company mail server that filters strictly may need `boost.space` and `mail.boost.space` on its allowlist. Or skip the email and create the user manually. ## Deactivate a user The **Users** section lists every active and inactive user. To stop working with someone, **deactivate** their profile — this removes their access but **preserves their data**. You can also anonymize a user's data if needed. ![Deactivating a user](/img/guides/settings/inviting-users-and-setting-up-teams-admin-5.webp) ## Teams and categories Create **teams** and **categories** to organize people. Teams can be assigned to modules (via the [Menu editor](/guides/settings/menu-editor)), to [spaces](/guides/spaces) — while [creating the space](/guides/spaces/how-do-i-create-a-space), or afterwards from the space's own people dialog, the same place you assign individual users — and to individual records. Every new user joins the **Everyone** category by default; add your own categories as needed. **Set access up teams-first.** Create the teams, give the _teams_ their [space roles](/guides/spaces/space-roles-members-managers-and-owners), then put people into teams. Access then follows membership: someone joining a team inherits every space that team can reach, and someone leaving loses it — one change instead of one grant per person per space. Granting each user each space individually works on day one and becomes unmaintainable by the tenth space. Note the direction: a space chooses its teams, not the other way round. Settings → Teams manages _who is in a team_; which spaces that team can reach is set from each space. ![Creating a category](/img/guides/settings/inviting-users-and-setting-up-teams-admin-6.webp) ## Assign people to a space 1. Choose the module. 2. Open the space where you want to assign people. 3. Click **User settings** at the top. 4. Assign the colleagues and set their [space roles](/guides/spaces/space-roles-members-managers-and-owners). ![Assigning users to a space](/img/guides/settings/inviting-users-and-setting-up-teams-admin-7.webp) > **Tip:** organize teams around departments — marketing, developers, designers, finance — to mirror how your company actually works. --- title: Company design settings description: >- Tailor Boost.space design to align with your brand identity. Admins can customize logos, login screen, favicon, and system colors through design settings. --- # Company design settings Personalize the system to match your brand — logos, colors, backgrounds, and favicon. Admins can change the design through system settings. ![](/img/guides/settings/company-design-settings-1.webp) In the design settings, you can personalize: * **A large logo –** is displayed when the system loads and on the login screen; * **A small logo –** is displayed in the main menu; * **The background of the login screen –** is displayed when you first log in to the system; * **Favicon –** displayed in the browser bar; * **System colors –** that appear across the system. ![](/img/guides/settings/company-design-settings-2.webp) --- title: Menu editor description: >- The Menu Editor in Boost.space allows admins to create, edit, and manage menus, enhancing user navigation and organizational workflow. Customize visibility, add users, and incorporate modules, folders, shortcuts, or embedded content to optimize your interface. --- # Menu editor The Menu Editor is an essential interface where users navigate according to the structure set by an admin. As an admin, you have the authority to create, edit, and manage menus, as well as control user access within these menus. ## Creating and editing menus Admins can easily create and modify menus. To create a new menu, simply open your primary menu and click on the "New Module" button. This will open a sidebar where you'll find the "Menu Editor" option at the bottom. Click on it to access the Menu Editor. Alternatively, you can reach the Menu Editor through "System Settings" by selecting the "Menu Editor" option in the left column. ![](/img/guides/settings/menu-editor-1.webp) ## Features of the menu editor Within the Menu Editor, you can create a new menu by naming it and adding a description. Once created, the menu will appear in a customizable format. Here, you can add users, ensuring they have access to the necessary sections. ![](/img/guides/settings/menu-editor-2.webp) Each menu item can be configured for visibility, allowing you to control which items are seen by users. You can edit or delete any item within the menu, providing flexibility and control. Additionally, you can create new entries at the bottom of the menu, including: * **Modules**: Add specific functionalities or tools to the menu. * **Folders**: Organize modules into categories, such as business or marketing. * **Shortcuts**: Include direct links to frequently accessed pages. * **Embed/iFrame**: Insert embedded content or iFrames to enhance functionality. ![](/img/guides/settings/menu-editor-3.webp) ## Several menus at once A menu is not a single global thing you edit — you can keep several, and a person can be in more than one. When they are, they see **all** of their menus, in the order the menus sit in the Menu Editor list. Drag the list to change that order; it is what every affected user sees. Assignment is not limited to individual people either: a menu can be given to **teams** and **categories**, which is what makes per-audience menus practical to maintain. ## Three things menus are good for **Cut a menu down to one audience.** Give a group only what they act on. A team that translates product copy does not need billing, warehouse, or CRM entries — build them a menu with the one space and the one view they work in, and their whole system becomes that job. This is the most underused thing in the editor and the fastest way to make Boost.space feel simple to someone who only has one task in it. **Put the queue people should check in the menu.** When a [segment](/guides/working-with-data/segmenter) exists precisely so a human keeps an eye on it — records with errors, items waiting for review — leaving it inside a data view means remembering to go look. As a menu shortcut it is simply there every time they open the app. **Bring outside tools inside.** A shortcut takes any external URL, so a dashboard you built on the [API](/api-reference) belongs in the menu next to everything else. To the person using it there is no seam. --- title: SMTP setup description: >- Discover a step-by-step guide to configuring your SMTP server for efficient email delivery. This article covers everything from server settings and authentication to security and testing. Perfect for setting up system emails on Boost.space or your preferred email provider. --- # SMTP setup This article serves as a Boost.space general guide for setting up the e-mail address to and from which the system sends system messages. By default, emails are sent from system@mail.boost.space. If you want to use your own email, follow the guide on this page. The specifics such as server names, ports, and security settings must be adapted based on the service provider or the particular requirements of the email server in use. ## SMTP server configuration 1. Open **System settings**. ![](/img/guides/settings/smtp-setup-guide-1.webp) 2. In **Main settings**, open the **System emails and SMTP** section. ![](/img/guides/settings/smtp-setup-guide-2.webp) 3. Set up the authentication: The SMTP server requires authentication to verify the identity of the email sender. Please use the following details for setting up the SMTP server: * **SMTP Server** — `smtp.yourdomain.com` (replace with your SMTP server) * **SMTP Port** — choose one based on your security requirements: * **587** with TLS (recommended) * **465** with SSL * **25** if the other ports aren't available (less secure) * **Username** — your full email address * **Password** — your email account password For a Gmail connection you may need an **app-specific password**: enable [two-factor authentication](/guides/account/two-factor-authentication-2fa) on your Google account, then create one at [Google App passwords](https://myaccount.google.com/apppasswords). ![](/img/guides/settings/smtp-setup-guide-3.webp) ## Sending domains The sender's email address domain must match the domain used for authentication or its alias. If your email provider is different (e.g., Gmail, Outlook), you should use the SMTP server provided by them. ## Security and encryption The following methods are supported to secure the email delivery process: * _**TLS**_: This initiates a secure TLS connection over an initially unsecured network. * _**SSL**_: This establishes a secure connection from the beginning of the communication. ![](/img/guides/settings/smtp-setup-guide-4.webp) ## Limits and restrictions Be aware of the following limits and restrictions that your SMTP server might impose: * A maximum number of invalid authentication attempts per hour. * Daily and hourly limits on the number of emails sent. * Restrictions on sending emails from domains that do not have associated webhosting. **Testing the setting** After you set up your SMTP, you can test the changes with a "send test e-mail" button. ![](/img/guides/settings/smtp-setup-guide-5.webp) --- title: System name and system key description: >- Your system name is the unique identifier of your Boost.space instance — it forms your login URL and identifies your system to integrations. --- # System name and system key Your **system name** uniquely identifies your Boost.space instance — for example `mysystem` in `mysystem.boost.space`. It forms your login URL at [gate.boost.space](https://gate.boost.space) and identifies your system when you connect it to other tools. In that integration context it's also called the **system key** — it's the same value. > The system name **can't be changed** after installation, so choose it carefully. ![The system name and key](/img/guides/settings/system-name-system-key-1.webp) ## Where to find it - **In the URL** — when you're logged in, it's the part before `.boost.space`. - **In your setup email** — if you created the system, it's in the message from `system@mail.boost.space`. - **Otherwise** — ask your system's administrator, or [chat with support](/?support) if you can't log in. --- title: System instance description: >- A system instance is your own isolated Boost.space environment — its users, modules, spaces, records, and configuration — separate from every other. --- # System instance A **system instance** is your organization's own environment on Boost.space, reachable at `yoursystem.boost.space`. Everything in it — users, [modules](/guides/modules), [spaces](/guides/spaces), [records](/guides/records), and configuration — is isolated from every other instance, so your data and setup are entirely your own. ## What an instance contains - **Users** — the people with access, each with a [system role](/guides/settings/system-roles-users-and-admins). - **Modules, spaces, and records** — your data model and the data in it. - **Data and configuration** — everything stored, plus your settings and customizations. ## Switch between instances If you belong to more than one instance, open your **avatar** menu, click the Boost.space logo at the top right, and sign in to the instance you want. See [Agency account](/guides/settings/agency-account) for managing several instances with one email. ![Switching instances](/img/guides/settings/system-instance-1.webp) # Agency account Every Boost.space customer gets their **own system on its own domain** — `yourcompany.boost.space` — with its own database, its own users, and its own [MCP endpoint](/ai/mcp). Systems are isolated from each other by design; there is no shared tenancy to opt out of. That isolation is why agencies run **one system per client** rather than one system with everything in it. Each client's data stays in its own system, and the people who work across several clients move between systems instead of having access widened. **Linking is automatic and takes no setup.** Create a user with the **same email address** in each system and Boost.space recognises it as one person across all of them. Nothing to configure, no request to file — a switcher simply appears. That is the whole mechanism, so if you were expecting a longer procedure, there isn't one. Set up an [admin](/guides/settings/system-roles-users-and-admins) user with that shared email address on each system in [system settings](/guides/settings/system-settings). [Agency Account](https://fast.wistia.net/embed/iframe/gf1svm94ew?seo=true\&videoFoam=true) ## Switching between systems in Boost.space Then click on your avatar in the bottom left corner and click on the icon to switch between systems. ![](/img/guides/settings/agency-account-1.webp) Here, you can choose which system you want to log into. Just fill in your login details for that system, and you're done. The switcher lists the systems **this browser has signed into**, so on a new machine you sign in once per system and they accumulate from there. Sharing an email address links the accounts; it does not sign you in everywhere. ![](/img/guides/settings/agency-account-2.webp) ## Switching between Make organizations If you have multiple Make organizations connected, you can switch between them by clicking the name of your organization in the [Make](/guides/automation/views) area. ![](/img/guides/settings/agency-account-3.webp) # Sandbox environment A **sandbox** is a copy of your [system instance](/guides/settings/system-instance) where you can test changes and new workflows without affecting your live data. Anything you do in the sandbox stays there. [Sandbox environment](https://fast.wistia.net/embed/iframe/8vos5r9ha3?seo=true\&videoFoam=true) ## Use the sandbox * **Test safely** — try new fields, modules, automations, or imports; nothing you do reaches production. * **Regenerate any time** — refresh the sandbox to match your current live instance again, so you start testing from a clean, up-to-date copy. When a change works as expected in the sandbox, apply it in your live instance. --- title: Plans and usage limits description: >- What actually affects your Boost.space usage — records, AI credits, administrators, and operations — and where to manage your plan. --- # Plans and usage limits Boost.space offers several plans, from a free tier to Enterprise. Rather than repeat the feature matrix here, compare plans and prices on the **[pricing page](https://boost.space/pricing/)** — it is always current. What matters day to day is your **usage limits**, set by your plan and tier: | Limit | What it covers | |---|---| | **Records** | How much data you store across all your databases. Delete old records to free room. | | **AI credits** | Consumed by [AI features](/ai). Included in every plan in different amounts — see [AI credits](/guides/billing/boost-space-4-0-ai-pricing). | | **Administrators** | How many admins can manage the system. | | **Operations** | Consumed by automation ([scenarios](/guides/automation/views)). | You can change your **tier** at any time as your needs grow. ## Manage your plan Administrators manage everything in the **Billing** section — from the homepage or via **Profile settings → Billing**. From there you can monitor records, AI credits, operations, and admin usage, and upgrade your plan or change tiers. ![Billing and limits](/img/guides/billing-and-policy/billing/plans-tiers-usage-limits-1.webp) --- title: AI credits description: >- How AI credits work in Boost.space — what they power, how they're consumed, and where to manage them. --- # AI credits Boost.space's inline [AI features](/ai) run on **AI credits**. Every plan includes a monthly amount of credits; you can top up or change your allocation at any time. ## How AI credits work - Credits are **monthly** and used exclusively for AI features. - They're consumed according to the complexity of the operation and the number of rows processed, so usage stays transparent. - Credits **don't roll over** — each month starts with your plan's fixed amount. - **Bring Your Own Key (BYOK)** is available for automations, letting you connect your own AI account. Inline database features use AI credits and don't support BYOK. ## What AI credits power - **[AI data validation](/ai/ai-features/boost-space-data-validation)** — detect and resolve inconsistencies directly in your tables. - **[AI data transformation](/ai/ai-features/boost-space-data-transformation)** — turn messy data into clean, standardized values. - **[AI fields](/ai/ai-features/ai-fields)** — autofill and enrich field values. - **[AI text manipulation](/ai/ai-features/ai-powered-text-manipulation)** — shorten, extend, translate, and rephrase text inline. ## Managing your credits View, purchase, and monitor credits under **Billing and limits** in your system. That section always shows the current pricing options — pick the one that fits and confirm with **Upgrade**. ![AI credits in Billing and limits](/img/guides/billing-and-policy/billing/boost-space-4-0-ai-pricing-1.webp) --- title: Legacy & older plans description: >- Scenarios in the Integrator, the pre-built modules (Tasks, Contacts, Invoices, Products, Warehouses…), the app catalog, the legacy API, and older or lifetime plans — where each one is documented now. --- # Legacy & older plans Boost.space has evolved, and part of it now lives in a separate, archived documentation space at **[legacy-api.boost.space](https://legacy-api.boost.space)**. That is where you will find the **Integrator** — scenarios, connections, routers, iterators, mapping, functions, data stores, webhooks, error handling, blueprints — the **pre-built modules** (Tasks, Contacts, Products, Invoices, Business Orders, Warehouses, Projects, Calendar, Forms, Docs, Notes, Offers, Contracts, Business Cases, News Monitor, Work Hours), and the **catalogue of apps** you can connect. This page tells you which of those is documented where, and what each one maps to today. > **Short version:** anything about the Integrator, a pre-built module, or a specific app → > **[legacy-api.boost.space](https://legacy-api.boost.space)**. > Everything else is here in the current docs. ## Setting up or fixing a scenario in the Integrator Opening a scenario from **My scenarios** on the home page, or from a module's Connect / Enrich / Share view, takes you into the **Integrator** — the automation workspace with *Organization*, *Teams*, *Installed apps*, *Variables* and *Scenario properties* in its sidebar. Everything you do there is documented at **[legacy-api.boost.space](https://legacy-api.boost.space)**, and nowhere else: scenarios and the scenario editor, the app modules inside them (actions, searches, triggers, aggregators, iterators), routers and filters, mapping and functions, data stores, connections and webhooks, error handling and its directives, blueprints, subscenarios, scheduling, previous versions, and the DevTool. Your scenarios keep running. The documentation is archived, not the product. Starting something new instead? Automation now runs on your own Make account, surfaced on each module as the [Connect, Enrich and Share views](/guides/automation/views), plus native [actions & triggers](/guides/automation/actions-and-triggers) inside Boost.space. ## Using a pre-built module (Tasks, Contacts, Invoices, Products…) The **pre-built modules** are the pre-built, fixed-structure modules from an earlier generation of Boost.space: **Tasks** (with the Gantt chart and Kanban board), **Contacts**, **Products** (categories, variants, product files), **Invoices**, **Business Orders**, **Warehouses** (stock cards, receipts, issues, transfers, reservations, inventory), **Projects**, **Calendar**, **Contracts**, **Docs**, **Forms**, **News Monitor**, **Notes**, **Offers**, **Business Cases** and **Work Hours**. They are documented at **[legacy-api.boost.space/modules](https://legacy-api.boost.space/modules)**, where records are still called **items** and fields are still called **custom fields**. For anything new, build a custom [module](/guides/modules) instead — you define the structure yourself, or [generate it with AI](/guides/modules/build-with-ai). Custom modules cover what the pre-built ones did, and more. ## Connecting an app — Shopify, HubSpot, Google Sheets and the rest of the catalogue Looking for how to connect a specific app, what its modules do, or how to get its API key, Client ID or OAuth credentials? Every app in the catalog has its own guide at **[legacy-api.boost.space/applications](https://legacy-api.boost.space/applications)**. The general procedures — obtaining a Client ID and Client Secret, Google and Facebook scopes, custom OAuth clients, connecting any service that uses API tokens, custom apps, and the HTTP module for an app that isn't listed — are on the same site under **[legacy-api.boost.space/connections](https://legacy-api.boost.space/connections)**. > **Marketplace and AppFlows.** The **Marketplace** in the left sidebar and the **AppFlows** panel > on your home page are where pre-packaged app templates were installed; installed AppFlows also > show as a column on **My scenarios**. AppFlows are hidden on new systems since > [version 5.5](/changelog/updates/release-notes), the Marketplace is not always available, and > neither has its own documentation. For an AppFlow already running on your system — or to install > one — [contact support](/?support). The individual apps behind them > are documented at > [legacy-api.boost.space/applications](https://legacy-api.boost.space/applications). ## Using the legacy API There is no separate legacy API reference any more. The current **[REST API](/api-reference)** is the one place the API is documented — for new integrations and for anything you built against the older surface alike. If a request you used is missing from the reference, it was internal rather than published, so it was never supported: [ask support](/?support) before you build against it. Connecting an AI agent instead? See [Connect via MCP](/ai/mcp/server/connect-via-mcp). ## Older plans, lifetime deals and AppSumo If you're on an earlier plan — **Scale**, **Grow**, or a **lifetime deal** (AppSumo, SaaSMantra, and similar) — your plan stays honored. Current tiers and limits are on **[Plans and usage limits](/guides/billing/plans-tiers-usage-limits)**; for anything specific to a legacy or lifetime plan (limits, upgrades, redeeming a code, or how a feature maps to your plan), [contact support](/?support) with your system name. Locked out of an older system, or unsure of your system name? See [Logging in](/guides/account/logging-in) and [System name & system key](/guides/settings/system-name-system-key). ## An old documentation link stopped working Links of the form `docs.boost.space/knowledge-base/…` are from the previous documentation site. They still resolve — each one redirects to its current home, which for Integrator, module and app articles is **[legacy-api.boost.space](https://legacy-api.boost.space)**. Keep the trailing slash; that is the form the redirects are registered under. If a link lands somewhere unexpected, search from [legacy-api.boost.space](https://legacy-api.boost.space) for the archived article, or from [docs.boost.space](https://docs.boost.space) for the current one. --- title: Overview description: >- ACT by Boost.space is an AI agent for automations. Describe what should happen and when; it writes, tests, schedules and runs the automation for you. --- # ACT by Boost.space **ACT is an AI agent that builds and runs your automations.** Tell it what should happen and when, in plain words. It writes the code, tests it, sets the schedule, keeps your API keys safe and switches the automation on. When something should change, you ask again. ![A request in plain words becomes an automation that ACT writes and runs: new leads scored, the hot ones sent to Slack](/img/illustrations/act.webp) ## What it's for Work that repeats, and that nobody should have to do by hand: - **Reports on a schedule.** *"Every weekday at 7:00, fetch the ECB euro rates for USD, GBP and CZK."* - **Messages to your team.** *"Every Monday at 9:00, post last week's rates to our Slack channel."* - **Reacting to other apps.** *"When our e-shop sends an order, calculate the total with 21% VAT."* - **Reacting to your data.** *"When a new lead is created, score it and notify me."* ## How you use it 1. **Talk to the agent.** Open **Chat** in ACT, or talk to ACT from ChatGPT, Claude or another assistant connected over [MCP](/act/connect/api-and-mcp). 2. **Check the result.** **Automations** shows everything the agent built: the trigger, the code and every run. 3. **Ask for changes.** *"Run it at 8:00 instead"* is all it takes. ## Why it works - **No code to write, nothing to host.** The agent writes the automation and ACT runs it. - **Works with any service that has an API.** The agent writes the code that calls it; you give it the key. - **Tested before it goes live.** The agent test-runs the code and fixes what fails before it switches the automation on. - **Keys stay secret.** API keys go into a secure form, are stored encrypted, and never appear in the chat or the code. - **Every run isolated and recorded.** Each run gets its own fresh environment, and leaves behind its result or the exact error. ## Start here - **[Quickstart](/act/guide/quickstart)** — your first automation from one request - **[Work with the agent](/act/guide/agent)** — what to ask, and how - **[API & MCP](/act/connect/api-and-mcp)** — use ACT from ChatGPT, Claude and other assistants - **[ACT for AI agents](/act/connect/for-agents)** — the technical reference --- title: Quickstart description: >- Build your first ACT automation from one request to the agent, then check it and run it. --- # Quickstart One request, one working automation. This example fetches the European Central Bank's euro reference rates every weekday morning. ## 1. Tell the agent what you need Sign in or register at [act.boost.space](https://act.boost.space). The agent's chat is the first thing you see. Write the request the way you would brief a colleague: > *Every weekday at 7:00 Prague time, fetch today's euro reference rates from the European Central > Bank and return the rates for USD, GBP and CZK. Call it "Daily euro exchange rates".* Say when it runs, what it does, where the result goes and what it's called. Include the time zone, or the agent will ask for it. ## 2. Let the agent build it The agent writes the code, test-runs it against the live source, creates the schedule and switches the automation on. Then it sums up what it built. ![The agent confirms the new automation with its schedule, source and output](/img/act/chat-result.webp) It also tells you how it handles edge cases. Here: if the ECB hasn't published today's rates yet, the automation says so instead of returning yesterday's numbers. ## 3. Check it Open **Automations** and pick the new automation. The header shows the next run and the last run. The tabs hold the trigger, the runs, the code and the rest. ![The automation detail with its trigger and settings](/img/act/automation-overview.webp) ## 4. Run it now Don't wait for 7:00. Ask the agent: *"Run Daily euro exchange rates and show me the result."* Or open **⋯** next to **Edit in chat** and choose **Run**. Every run lands on the **Runs** tab. ![Run history with two successful runs](/img/act/runs.webp) ## Next - [Work with the agent](/act/guide/agent) — everything else you can ask - [Triggers](/act/guide/triggers) — schedules, webhooks and record events - [Secrets](/act/guide/secrets) — connect services that need an API key --- title: Work with the agent description: >- The ACT agent builds, changes, runs and explains your automations. What to ask it, how to phrase a request, and what it does with it. --- # Work with the agent **Everything in ACT starts with a sentence.** The agent in **Chat** builds automations, changes them, runs them and explains what happened. The Automations screen is where you check the result. ## What to ask | You want to | Ask the agent | |---|---| | **Build** an automation | *"Every Monday at 9:00 Prague time, post last week's euro rates to our Slack channel. Call it 'Weekly rates to Slack'."* | | **Change** one | *"Daily euro exchange rates: also include PLN."* | | **Run** one now | *"Run Daily euro exchange rates and show me the result."* | | **Check** how it's doing | *"Show me the run history for Daily euro exchange rates."* | | **Understand** a failure | *"Why did the last run of Weekly rates to Slack fail?"* | | **Connect** a service | *"I have a Slack incoming webhook URL — store it as a secret."* | Prefer to stay in ChatGPT or Claude? Connect it over [MCP](/act/connect/api-and-mcp) and ask the same things there. ## Write a good request Say four things, and the agent can build without coming back to you: - **When** it runs: *every Monday at 9:00 Prague time*, *when a new lead is created* - **What** it does: *post last week's euro rates* - **Where** the result goes: *to our Slack channel* - **What it's called:** *"Weekly rates to Slack"* If something is missing, such as the time zone, the agent asks before it builds. ## What the agent does 1. **Writes the code** for the job. 2. **Test-runs it** and fixes what fails, before you see it. 3. **Asks for API keys** in a [secure form](/act/guide/secrets), never in the chat. 4. **Sets the trigger:** a [schedule or a record event](/act/guide/triggers). Webhooks are added on the automation's Webhooks tab. 5. **Switches it on** and sums up what it built. ## Change an automation Open the automation and click **Edit in chat**. The agent already knows which automation you mean, so you only say what should change. It updates the automation in place, tests it again and tells you what it changed. ![The agent adds PLN to an existing automation and confirms the test run](/img/act/chat-edit.webp) > **You stay in control.** Every automation's [Code tab](/act/guide/automations#code) explains in > plain words what it reads, computes, writes and calls, and **Try it** runs it on demand. ## Conversations **New chat** starts a clean conversation. **History** reopens earlier ones, so you can pick up a build where you left it. --- title: Automations description: >- The Automations screen: everything the agent built, with each automation's status, trigger, code, runs and secrets. --- # Automations **The agent does the work; Automations is where you see it.** Every automation it built is here, with its status, trigger, code and runs. To change one, click **Edit in chat** and tell the agent. ## The list ![The automations list with status and trigger for each automation](/img/act/automations-list.webp) - **Search** by name, or press `/` to jump to the search field. - **Filter** by **Active** or **Paused**. - **Each row** shows the trigger, the status and the last change. Pause or resume straight from the row. - **Select** several automations to pause or resume them together. Paused automations skip their scheduled runs until you resume them. ## The automation detail Click a row to open it. The header shows **Next run**, **Last run** and **Updated**. ![The automation detail, Overview tab](/img/act/automation-overview.webp) | Tab | What it holds | |---|---| | **Overview** | The [triggers](/act/guide/triggers) and the settings: timeout and retries | | **Runs** | The [run history](/act/guide/runs) with each run's result or error | | **Code** | What the code does in plain words, the full source, and **Try it** | | **Webhooks** | The address another app calls to start the automation — see [Webhook](/act/guide/triggers#webhook) | | **Files** | Files the automation works with, up to 4 MB each | | **Secrets** | The [secrets](/act/guide/secrets) the code uses, with their values hidden | ## Code **You don't have to read Python to know what an automation does.** The Code tab opens with a plain summary: what it **reads**, what it **computes**, what it **writes** and which services it **calls**. The full source follows, with copy and download. ![The Code tab: a plain summary above the source](/img/act/code.webp) **Try it** runs the code once with an optional JSON input and shows the result. Here, a sample order goes in and the VAT comes out. Nothing is saved, though the code runs for real: a Slack automation does post to Slack. ![Try it: a sample order in, the total with VAT out](/img/act/try-it.webp) ## More actions The **⋯** menu next to **Edit in chat**: ![The actions menu: pause, run, rename, duplicate, delete](/img/act/automation-menu.webp) - **Pause automation** — it won't run until you resume it. - **Run** — runs it right away. If it works on a record, ACT asks which one. - **Rename** — gives it a new name. - **Duplicate** — makes a paused copy; give the copy its trigger and files. - **Delete** — permanent, it can't be undone. ## Create one by hand For simple jobs you can skip the agent: **New automation** opens a form with five action types — E-mail, Notification, HTTP request, Create a record and Python code. The type can't be changed later. For anything with logic in it, [asking the agent](/act/guide/agent) is faster. ![The New automation form with its five action types](/img/act/new-automation.webp) --- title: Triggers description: >- What starts an ACT automation — a schedule, a record event, a webhook another app calls, or a manual run — and how to set each one up. --- # Triggers **A trigger decides when an automation runs.** The easiest way to set one is to say it: the agent turns *"every weekday at 7:00 Prague time"* or *"when a new lead is created"* into the right trigger. An automation can have several, and it runs whenever any of them fires while it is **Active**. | Trigger | Runs when | Set it up | |---|---|---| | **Schedule** | At set times: every few minutes, daily, on weekdays, or once | Tell the agent, or edit it on the Overview tab | | **Record event** | A record is created, updated or deleted | Tell the agent | | **Webhook** | Another app sends data to the automation's address | Webhooks tab | | **Manual** | You start it | Ask the agent, or **⋯** → **Run** | > **Triggers and webhooks are managed by administrators.** See [Team & account](/act/connect/team-and-account). ## Schedule Tell the agent when: *"Run it every weekday at 7:00 Prague time."* To adjust it yourself, click the pencil next to the schedule on the **Overview** tab, or **Add schedule** for another one. ![The schedule editor: weekdays at 07:00, Europe/Prague](/img/act/trigger-editor.webp) - **Repeatedly** runs every *n* minutes, hours, days, weeks or months, on the days you pick, at a set time. - **Once** runs a single time on a date, then stops. - **Time zone** belongs to the schedule: 07:00 *Europe/Prague* means 07:00 in Prague, wherever you are. ## Record event Runs the automation when a record in one of your modules is **created**, **updated** or **deleted**: score a lead the moment it arrives, notify the owner when a deal changes. Tell the agent: *"When a new lead is created, score it and notify me."* Changes to event triggers go through the agent too. ## Webhook **A webhook lets another app start the automation and hand it data.** An e-shop sends a new order, a form sends a submission, a script sends a JSON payload. Webhooks start **Python code** automations. Open the automation's **Webhooks** tab and click **Add webhook**. The address stays hidden until you click **Show**; **Copy** puts it on your clipboard. ![The Webhooks tab: a hidden address, the last delivery, and what arrived](/img/act/webhooks.webp) The other app sends a `POST` with a JSON body: ```bash curl -X POST "" \ -H "Content-Type: application/json" \ -d '{"id": "ORD-1042", "items": [{"sku": "MUG-01", "price": 12.5, "quantity": 4}]}' ``` ACT answers at once with `"status": "accepted"`, then runs the automation. The code finds the JSON body in `input["body"]`; a form post arrives as an object, anything else as text, up to 1 MB. The result goes to the [Runs tab](/act/guide/runs), not back to the caller. ![The run the webhook started, with its result](/img/act/webhook-run.webp) - **What arrived** lists recent deliveries and what they carried. Some values are hidden. - **Replace the address** issues a new one, and the old one stops working. > **Treat the address like a password.** Anyone who has it can start the automation. If it leaks, > replace it. ## Manual Ask the agent: *"Run Daily euro exchange rates and show me the result."* Or open **⋯** → **Run** on the automation. --- title: Secrets description: >- How ACT keeps API keys out of the chat and the code: the agent's secure form, the Secrets tab, and how code reads a secret at run time. --- # Secrets **Keep API keys out of the chat and out of the code.** ACT stores them as secrets: encrypted, hidden once saved, and handed to the code only while it runs. ## The agent asks for it When an automation needs a credential, the agent opens a **secure form** right in the conversation. ![The agent asks for the Slack webhook URL in a secure form](/img/act/secret-form.webp) The value goes straight to the server and is stored encrypted. **The agent never sees it**, it never appears in the chat history, and the agent carries on building as soon as you save it. You can also start it yourself: *"I have a Stripe API key — store it as a secret."* ## The Secrets tab Each automation's **Secrets** tab lists the secrets its code uses. ![The Secrets tab with one stored secret, value hidden](/img/act/secrets.webp) - **Values stay hidden.** Once saved, a value can't be shown again. You can only **replace** it. - **Secrets are saved by name for the whole workspace.** A second automation can use the same key without asking for it again. - **Removing a secret** asks for confirmation first, because code that uses it stops working. ## How code reads a secret For developers: at run time the code gets a `connections` dictionary with the secrets it asked for, by name: ```python def main(input): webhook_url = connections["SLACK_INCOMING_WEBHOOK_URL"] ... ``` Only the secrets an automation lists are passed in. Each run happens in its own isolated environment, and that environment is gone when the run ends. --- title: Runs & troubleshooting description: >- Ask the agent how an automation is doing and why a run failed, read the run history, and check the usual causes when something doesn't run. --- # Runs & troubleshooting **Every run is recorded: when it started, how long it took, and what came out.** When something fails, you see the exact error and the line that caused it, and the agent can explain it for you. ## Ask the agent You don't need to read a traceback. Ask: > *Why did the last run of "Weekly rates to Slack" fail? Explain it, don't change anything yet.* The agent reads the run history, finds the failing line and tells you what happened in plain words. ![The agent explains a failed run: the input arrived as a list, not a dictionary](/img/act/chat-diagnose.webp) Then ask it to fix the code. It tests the change before it saves it. Asking for the explanation first is a good habit: you see the cause before anything changes. ## The Runs tab ![Run history: two successful runs](/img/act/runs.webp) - **The bar chart** shows recent runs at a glance: green succeeded, red failed. - **Filter** by running, successful or failed runs. - **Expand a run** to see its **result**, or for a failed run the **error** and the full traceback, down to the line that broke. ![A failed run with its error and traceback](/img/act/run-failed.webp) > **Run history and manual runs are for administrators.** See [Team & account](/act/connect/team-and-account). ## Quick checks | You see | Check | |---|---| | **Next run** passed, no new run | Is the automation **Paused**? Paused automations skip scheduled runs. | | A schedule fires at the wrong hour | The **time zone** in the [trigger](/act/guide/triggers#schedule). | | A webhook call came back `accepted`, no result | The **Runs** tab, not the HTTP response. The result is recorded there. | | A run stops before finishing | The **timeout** under **Settings** on the Overview tab. | | A run fails at a service's sign-in | The [secret](/act/guide/secrets) behind it. Replace the value if the key changed. | --- title: API & MCP description: >- Use ACT from ChatGPT, Claude and other AI assistants over MCP, and give other apps access with an API token. --- # API & MCP **Work with ACT from the AI assistant you already use.** Connect ChatGPT, Claude or another assistant over MCP and ask it what you would ask the ACT agent: build, change, run and debug automations. Other apps connect with an API token. Open the avatar menu in the top right and choose **API & MCP**. ![API & MCP: the MCP server address and your API tokens](/img/act/api-mcp.webp) ## MCP server **MCP is the standard AI assistants use to connect to other services.** ACT's address is: ```text https://mcp.boost.space/v2//sse ``` The page shows it with your system name filled in. Copy it into your assistant's connector or MCP settings. It works in assistants that support custom MCP servers, including ChatGPT, Claude, Gemini, Copilot, Grok, Le Chat and Perplexity. Availability can depend on the assistant's plan. **Signing in:** - **Assistants that sign in for you:** paste only the address. The assistant opens a Boost.space sign-in; use your ACT email and password. - **Assistants that need a key:** create an [API token](#api-tokens) and send it as the `Authorization: Bearer ` header. **What an assistant can do once connected:** - **Build an automation from a description**, the same way the ACT agent does - **List, create, change and delete** automations and their triggers - **Test-run code** and **run** automations on demand - **Read run history** and explain failures - **Ask you for a secret** through a secure link, without the value passing through the chat Try: *"List my ACT automations and tell me which ones failed this week."* ## API tokens **A token lets an app sign in to ACT without your password.** Use one for integration platforms, scripts, or an AI tool that asks for a key. 1. Click **New token** and name it after the app that will use it, for example *Shopify*. 2. Copy the token. **It is shown only once.** 3. Copy the **system name** too. Most integrations ask for both. ![The new token, shown once, with the system name](/img/act/token-created.webp) > **A token has the same access as you.** Give each app its own token, so you can cut one off > without breaking the rest. Deleting a token signs that app out immediately. ## The REST API The same token signs in to the [Boost.space REST API](/api-reference) of your system, at `https://.boost.space/api`, for your data: records, modules and spaces. To work with automations, use the MCP server. The one automation endpoint in the REST API is the [webhook address](/act/guide/triggers#webhook), and that one needs no token. For agents and developers, [ACT for AI agents](/act/connect/for-agents) has the technical details. --- title: Team & account description: >- Invite people to your ACT workspace, choose who is an administrator, and manage your own password and sign-in. --- # Team & account **Everything about you and your team sits in the avatar menu** in the top right. ![The account menu: password, API & MCP, users, sign out](/img/act/account-menu.webp) - **Change password** — enter the current one, then the new one twice. - **API & MCP** — connect AI assistants and apps. See [API & MCP](/act/connect/api-and-mcp). - **Manage users** — invite and manage your team. Administrators only. - **Sign out** ## Invite your team Open **Manage users** and click **Invite user**. Enter their e-mail and pick a role. They get an invitation and appear in the list once they accept it. ![Manage users: the members of the workspace and their roles](/img/act/users.webp) From the same list you can change someone's role or remove them. A workspace has a limit on users and on administrators; the invite tells you when you reach it. ## Roles - **Administrator** — full access: building and running automations, triggers, webhooks, run history and the team. The **Admin** badge next to your name in the avatar menu shows it. - **User** — sees the workspace's automations and their status. --- title: ACT for AI agents description: >- Technical reference for agents and developers working with ACT — MCP endpoint and auth, the automation model, the MCP tools, the code contract and the rules. --- # ACT for AI agents **ACT works over MCP.** Everything a person asks the ACT agent, your own agent can do with the same tools: build automations from intent, test code, wire triggers, run, read the history and fix failures. This page is the reference. For people, start at the [Overview](/act). ## Endpoints | What | Value | |---|---| | **MCP server** | `https://mcp.boost.space/v2/{system}/sse` (SSE transport) | | **MCP auth** | OAuth: protected-resource metadata at `https://mcp.boost.space/.well-known/oauth-protected-resource/v2/{system}`, scopes `all` and `offline_access`. Or `Authorization: Bearer ` | | **Webhook ingest** | `POST https://{system}.boost.space/api/hook/{token}`, no auth: the token in the path is the credential | | **REST API** | `https://{system}.boost.space/api`, Bearer token. Covers data (records, modules, spaces); automations are MCP-only. [API reference](/api-reference) | | **These docs** | [`/llms.txt`](/llms.txt), and any page as markdown at `/index.md` | `{system}` is the system name shown under **API & MCP** in ACT. API tokens are created there too and carry the full access of the user who created them. See [API & MCP](/act/connect/api-and-mcp). ## The model - **Automation** = one **action** plus zero or more **triggers**. Action types: `email`, `notification`, `url`, `create`, `code`. ACT's chat builds `code` actions. - **Trigger** = `SCHEDULED` (interval, days, time and an explicit time zone) or a record event (`CREATE`, `UPDATE`, `DELETE` on a module, with optional conditions). Webhook triggers are added in the ACT app, on the automation's Webhooks tab, and fire `code` actions only. - **Run** = one execution: status, duration, the returned result, or `error` plus `stderr`. - **Secret** = a named Variable, stored encrypted, write-only for people. Code receives the ones an action lists, by name. ## MCP tools | Task | Tools | |---|---| | Build or change from natural language | `build_automation` (pass the full intent; include `actionId` to change an existing automation in place) | | Inspect | `list_automation_actions`, `list_automation_triggers`, `get_automation_runs` | | Create and edit directly | `create_automation_action`, `update_automation_action`, `delete_automation_action`, `create_automation_trigger`, `update_automation_trigger`, `delete_automation_trigger` | | Run | `run_automation_action` (on demand), `run_automation_code` (test run, stores nothing) | | Secrets | `request_secret` (one-time secure link for the user), `variable_-_list_records` | | Data access from code | `get_boostspace_sdk_reference` (the Python SDK for this system's modules) | | Help | `about_this_mcp_server`, `get_help`, `search_documentation` | Prefer `build_automation` for anything non-trivial: it writes the code, test-runs it until it passes, and creates or updates the trigger and action in one call. ## The code contract ```python def main(input): # the runner calls main(); no __main__ block key = connections["STRIPE_API_KEY"] # secrets listed on the action, by name order = (input or {}).get("body") # a webhook's JSON body return {"ok": True} # JSON-serialisable; becomes the run's result ``` - `input` is the data payload, never the secrets. On a test run it is the `input` you send. - A webhook's JSON body is `input["body"]`. Form posts arrive parsed, other bodies as a string, 1 MB at most. - A failed run carries `error` (`type`, `message`); the full traceback, with the failing line, is in `stderr`. - Every run executes in its own isolated environment, created for that run and discarded after. ## Rules for agents - **Never ask for a secret in chat.** Call `request_secret` with the secret's name and give the user the link; the value goes from their browser straight to the vault. - **Test before you save.** `run_automation_code` runs the code exactly like a fired action, and stores nothing. - **Pass the time zone** on every schedule. A time without a zone is ambiguous for the user. - **A webhook caller gets `accepted`, not the result.** Read the outcome with `get_automation_runs`. - **Triggers, manual runs and run history need an administrator.** For other users those tools are refused. - **Check the token with a read tool.** A revoked token is reported on the first tool call, not when the client connects. --- title: Overview description: >- AI inside Boost.space — the AI features that enrich, transform, and validate your data, scoped to your permissions. --- # AI Boost.space brings AI directly to your data: **AI features** enrich, transform, and validate the data itself. Connecting an external agent — Claude, ChatGPT, Cursor, or your own — is covered in **[MCP](/ai/mcp)**. ![An AI field's prompt fills the Category column of a table, one record at a time](/img/illustrations/ai.webp) **AI always acts within your permissions — it can read, write, and query only the data you can, nothing more.** > **Start here:** **[AI fields](/ai/ai-features/ai-fields)** — a value generated or enriched from a > prompt and the record's own data. Bringing your own agent, or building *for* agents? That lives in > the **[MCP](/ai/mcp)** tab, starting with **[Boost.space for AI agents](/ai/mcp/server/for-agents)**. ## AI inside your data | Feature | What it does | |---|---| | **[Vector database](/ai/ai-features/vector-database)** | Embed spaces so agents and search match records by meaning | | **[AI fields](/ai/ai-features/ai-fields)** | Fields whose values are generated or enriched from a prompt | | **[AI text manipulation](/ai/ai-features/ai-powered-text-manipulation)** | Shorten, extend, translate, and rephrase text inline | | **[AI data transformation](/ai/ai-features/boost-space-data-transformation)** | Clean and standardize a whole column with AI | | **[AI data validation](/ai/ai-features/boost-space-data-validation)** | Check a column against a rule and surface what fails | AI features run on **[AI credits](/guides/billing/boost-space-4-0-ai-pricing)**. ## Bring your own agent External agents connect over the **[Remote MCP Server](/ai/mcp)** — they search and write records, build structure, and run AI operations within the connected user's permissions. Start with **[Connect via MCP](/ai/mcp/server/connect-via-mcp)**; per-client guides live in **[MCP clients](/ai/mcp/server/common-mcp-clients)**. ## How they fit together Your data lives in Boost.space. AI features act on it from the inside; [MCP](/ai/mcp) lets outside agents read and write it too — both within your permission boundaries. The same operations are available to your own code over the **[REST API](/api-reference)** and **[SDKs](/sdk)**. --- title: Vector database description: >- Turn your Boost.space spaces into a vector database so AI agents retrieve records by meaning, not keywords — lean, relevant context at scale, over the API and MCP. --- # Vector database Large datasets are hard for an AI agent to use well: it can't read a whole space, and keyword search misses anything phrased differently. Boost.space's **vector database** solves this. It turns the text in your records into **embeddings** — numeric representations of meaning — so an agent can retrieve the **most relevant records by meaning**, not exact words. The result: agents (and your own code) get **lean, on-point context** from even a huge space — exactly what retrieval-augmented generation (RAG) needs — instead of dumping thousands of rows into a prompt. ## Why it matters - **Search by meaning.** "Unhappy enterprise customers" finds the right records even if none contain those words. - **Context at scale.** An agent pulls the handful of records that matter before it acts, so answers are grounded in *your* data and stay within the context window. - **Same permissions.** Vector search is scoped to a space and the acting user's access — an agent only ever retrieves what that user can see. - **Find the unusual, too.** Surface outliers — records that *don't* fit a description — for anomaly detection and data-quality review. ## Enabling it The vector database is an **Enterprise** feature — **[contact support](/?support)** to unlock it. Once it's available, you turn it on where the data lives: In a **[space's settings](/guides/spaces/space-settings)**, switch on **Vectorization** ("Embed this space's records so AI and search match them by meaning"). That is the whole setup — there is nothing to pick field by field. **What gets embedded.** Every **text** and **rich text** field on the records in that space, and only those. Numbers, dates, checkboxes, and selection fields are left out: a date has no meaning to compare, so embedding one would cost tokens and return noise. Rich text is stripped to its prose before it is embedded, so markup never competes with the actual words. Only records in **custom modules** are embedded. The scope you control is therefore the **space**, not the field. Switch vectorization on where the text worth searching lives, and leave it off elsewhere. **Keeping it current** needs no work at all. Saving a text value embeds it as part of the same write, so a record is searchable the moment it is saved — no queue to watch, no nightly job, no re-indexing step. It adds a small delay to writes in a vectorized space, and nothing else. ## Using it Once a space is vectorized, three operations are available over the **[REST API](/api-reference)**: | Operation | What it does | Use it for | Over MCP | |---|---|---|---| | **Similar** | The records most semantically **similar** to a query, ranked by relevance. | Semantic search, "find records like this", RAG retrieval | yes | | **Outliers** | The records **furthest** from a query. | Anomaly detection, data-quality review | yes | | **Context** | A **compact, lean** list of the most relevant records — trimmed field values, built for agents that need context before acting. | Grounding an agent's answer on your data | REST only | All three are scoped to one space, accept a natural-language **query**, and can be **pre-filtered** by a [filter](/guides/working-with-data/how-do-i-filter-records) or a saved [segment](/guides/working-with-data/segmenter) first. You can also set a relevance threshold to keep only strong matches. ## What people actually use it for Three operations do not sound like much until you see what they replace. These are patterns in real use, not hypotheticals. **Agents finding the right records.** The most common use by a distance, and the one that makes everything else an agent does possible. An agent asked to *"look at our unhappy enterprise customers"* has no keyword to search for — "unhappy" appears in none of your fields. Semantic search is how it finds the records a human would have picked, which is why a vectorized space is worth so much more to an [agent](/ai/mcp/server/for-agents) than a plain one. **Categorising new records from the ones you already sorted.** A supplier sends products with no categories. Instead of writing rules, search your existing catalogue for the records most similar to each new one and read the categories and tags off the matches. Your own past decisions become the classifier, so it already knows your taxonomy, your naming, and your edge cases — and it gets better every time somebody categorises something by hand. **Finding the prospects who look like your buyers.** Take the customers who actually bought as the description of what a good customer looks like, then search the rest of your database for the records most similar to them. What comes back is a ranked list of prospects that resemble people who already said yes — a far better basis for deciding whether to spend on a campaign than demographics you guessed at. **Finding the records that are quietly broken.** This one runs the search backwards. Query with a description of your *best* records and ask for the **outliers** — the ones furthest from it. Poor descriptions, thin data, mistyped entries, and quietly wrong records all surface together, because what they have in common is not resembling anything good. It is the fastest way to build a data-quality worklist without writing a single validation rule. Save it as a [segment](/guides/working-with-data/segmenter) and it stays a standing queue. > Every one of these gets sharper with a filter in front of it. Categorise within one product range, > look for lookalikes within one region, hunt outliers within one catalogue — narrower candidates, > better ranking, and for outliers, dramatically less work. ## Filter first, then search **Narrow the records with a real filter, then let semantic search rank what is left.** This is the one habit that decides whether semantic search feels sharp or vague, and it is worth building into every query you or your agents write. It works because that is genuinely the order things happen: the filter resolves the candidate records first, and only those are ranked by meaning. If the filter matches nothing, no embedding call is made at all. So a filter is not a post-processing step you bolt on — it decides what the search is even looking at. Two things follow: - **Accuracy.** "Enterprise customers unhappy about onboarding" searched across every record will surface whatever is loosely similar anywhere. Filter to the enterprise segment first and the same query ranks only records that were already the right kind of record. - **Speed, especially for outliers.** Similarity search is index-backed; **outliers are not** — finding what is *least* similar means scanning the whole candidate set, because an index built to find near neighbours cannot shortcut to far ones. On a large space, filtering first is not a nicety for outliers, it is the difference between a usable query and a slow one. > Over MCP, this is the **semantic search** an agent reaches for when it needs the right context > from a large space without reading all of it. Tell your agents the same rule: filter, then rank. > See [what an agent can do](/ai/mcp/server/for-agents). ## Next - [Connect via MCP](/ai/mcp/server/connect-via-mcp) — let an agent query your data - [API reference](/api-reference) · [AI overview](/ai) # AI fields An **AI field** is a [field](/guides/fields/custom-fields-creation-usage) whose value is **generated or enriched by AI** — a summary, a translation, a categorization, a drafted reply — computed from a prompt and the record's own data. > AI fields run on **[AI credits](/guides/billing/boost-space-4-0-ai-pricing)**. [AI-powered custom fields](https://fast.wistia.net/embed/iframe/x0tprdyfvk?seo=true\&videoFoam=true) ## Create an AI field Open **System settings → \[your module]**, where its fields are managed, click **New field**, and choose the **AI** type. Give it a name, then configure how it generates. ## The prompt Tell the AI what to produce. Two ways: * **Template** — pick a ready-made behavior (e.g. **Shorten**, **Summarize**, **Translate**) and point it at a field. * **Custom prompt** — write your own instruction (e.g. _"Categorize this ticket as Bug, Question, or Feature"_). Insert **other fields** into the prompt so the AI works from the record's data — for example _"Write a one-line summary of {Description} for {Company}."_ ## Execution mode * **Automatic** — the value regenerates whenever the source fields change, so it stays current. * **Manual** — generate on demand from the record (good for costly or one-off generations). ## Advanced settings Shape the output: * **Voice / tone** — auto, professional, casual, straightforward, confident, friendly, humorous, inspirational. * **Length** — auto, a word or two, a sentence, a few sentences, a paragraph, or three paragraphs. * **Formatting** — plain text, formatted text, bullet list, or numbered list. * **Creativity** — high, medium, or low. ## Related * [Field types](/guides/fields/custom-field-types-in-boost-space) — where AI fields fit * [AI text manipulation](/ai/ai-features/ai-powered-text-manipulation) · [AI data transformation](/ai/ai-features/boost-space-data-transformation) · [AI data validation](/ai/ai-features/boost-space-data-validation) # AI text manipulation _**Note: To access this feature, you'll need [AI Credits](/guides/billing/boost-space-4-0-ai-pricing).**_ Managing and editing text content can be time-consuming, especially when you need precision and efficiency. That's where **AI-powered text manipulation** in **Boost.space** comes in, offering tools that simplify and supercharge your text workflows. Whether you're working with records, fields, or any module that uses the text editor, AI tools are here to save the day. [AI-powered text manipulation](https://fast.wistia.net/embed/iframe/w5ecqe0zgl?seo=true\&videoFoam=true) ### How to use AI tools Let's illustrate the capabilities with a practical example: a record titled **Onboarding** with a short description. 1. Open the module that you want to use. 2. Locate the record in the appropriate space. 3. Click on the _Edit_ option to open the text editor. 4. Highlight the text you want to work on. As soon as you highlight the text, you'll notice an _AI Tools_ button pop up. This is where the magic happens. ![The AI Tools button on highlighted text](/img/guides/ai-tools-mcp/ai-features/ai-powered-text-manipulation-1.webp) ### What can you do with AI tools? The AI-powered features give you a variety of options to tailor your text with just a few clicks. Here's a glimpse of what's possible: * **Shorten**: Need to make a lengthy description more concise? The AI tool will trim your text while keeping its core message intact. * **Extend**: Want to add more details or context? Extend your text to make it richer and more informative. * **Simplify**: Transform complex language into something clear and easy to understand, perfect for improving readability. * **Translate**: Instantly convert your text into another language, ideal for global teams or multilingual projects. * **Add Emojis**: simply type the command, highlight it, and let the AI take over. * **Others**: Fix spelling and grammar, Continue writing, Rephrase, TL;DR, Adjust tone, Summarize, and more. These options allow you to refine your content quickly and effortlessly, ensuring it aligns with your goals. ![](/img/guides/ai-tools-mcp/ai-features/ai-powered-text-manipulation-2.webp) The versatility of Boost.space's AI tools extends beyond individual tasks. Any module that involves text management can benefit, allowing you to refine, enhance, or adapt content without time-consuming manual edits. # AI data transformation **_Note: To access this feature, you'll need [AI Credits](/guides/billing/boost-space-4-0-ai-pricing)._** ## Overview The **AI Data Transformation** function in Boost.space allows users to enhance and refine data within a specific column using **advanced AI-powered transformations**. This tool enables flexible data manipulation, from cleaning and translating to extending and customizing content based on user-defined prompts. [AI-powered data transformation](https://fast.wistia.net/embed/iframe/esp63bodb5?seo=true\&videoFoam=true) ## How it works This feature can be applied to a **selected column** in your Boost.space database to automatically process and improve its contents. You can choose from **pre-configured transformation template** or create your own **custom transformation prompt**. ![](/img/guides/ai-tools-mcp/ai-features/boost-space-data-transformation-1.webp) ### Key features: 1. **Templates for Common Transformations**: * **Data Cleaning:** Cleanse and standardize data in a selected column, removing extra spaces, correcting typos, and formatting dates and numbers for consistency * **Data Transform (Standardize):** Convert and standardize data. * **Shorten**: Make content shorter and to the point. * **Extend**: Add more details to give fuller picture. * **Fix spelling & grammar:** Corrects linguistic mistakes in texts to enhance clarity and correctness. * **Translate:** Translate the text from one language to another. * **Data Enrichment:** Make data better by adding more useful information. * **Data Extraction:** Pulls specific pieces of information from a larger dataset or document, like names, dates, or prices. * **Censor and anonymize:** Censors personal information. 2. **Custom Prompts**: For specialized needs, users can write their own prompts, such as "Make all letters capital" or "Format as title case." This flexibility allows you to tailor transformations exactly to your requirements. ## How to use the AI data transformation feature 1. **Select a Column**: * Start by choosing the column that you wish to transform. 2. **Choose a Transformation**: * Select from one of the pre-made templates or enter a custom prompt for a more tailored transformation. 3. **Preview the Transformation**: * Use the **Preview** feature to see how the transformation will affect your data before finalizing it. This helps you verify the outcome and make any adjustments if needed. 4. **Adjust Advanced Settings**: * **Automatic Execution**: Choose between Manual or Auto execution to control when transformations should be applied. * **Tone of Voice**: Adjusts the style of the text output, making it suitable for formal, casual, or other tonal needs. * **Creativity**: Sets the level of creativity for the AI. A lower setting will be more precise, while a higher setting may yield more diverse responses. 5. **Execute the Transformation**: * Once satisfied with the settings, you can run the transformation. You can either **Save** the configuration or **Save & Run** to immediately apply it. ## Example Let's say you have a column with first names, and you want them all in uppercase. You would: 1. Select the column with first names. ![](/img/guides/ai-tools-mcp/ai-features/boost-space-data-transformation-2.webp) 2\. Enter the custom prompt: "Make all letters capital". ![](/img/guides/ai-tools-mcp/ai-features/boost-space-data-transformation-3.webp)\ 3\. Preview the change to see an example output. ![](/img/guides/ai-tools-mcp/ai-features/boost-space-data-transformation-4.webp) 4\. Adjust the advanced settings if necessary, and click "**Save & Run**". ![](/img/guides/ai-tools-mcp/ai-features/boost-space-data-transformation-5.webp) 5\. Check the results. ![](/img/guides/ai-tools-mcp/ai-features/boost-space-data-transformation-6.webp) # AI data validation **_Note: To access this feature, you'll need [AI Credits](/guides/billing/boost-space-4-0-ai-pricing)._** **Data Validation** is an AI function that helps you validate your data effectively within the Boost.space system. This article guides you through using it. [AI-powered data validation](https://fast.wistia.net/embed/iframe/xavbnpj5x7?seo=true\&videoFoam=true) ## What is data validation? Data Validation is a process that ensures the **data entered into the system meets specific criteria**, thus maintaining data quality. By implementing this feature, you can check for accuracy, consistency, and completeness, reducing the likelihood of errors in your applications. ## How to use data validation Using data validation is straightforward: 1. Open the [space](/guides/spaces) where you want to use it. Select the column, click the three dots, and choose **Data validation**. ![Opening data validation on a column](/img/guides/ai-tools-mcp/ai-features/boost-space-data-validation-1.webp) 2. Let's define how your Data Validation will be carried out. You can either choose from our **pre-made templates** or create your own **custom validation**. For example, you might enter a command like, "**Filter all names that contain an "A"**. Once you've made your selection, simply click "**Save and Run**".\ ![](/img/guides/ai-tools-mcp/ai-features/boost-space-data-validation-2.webp) 3. Your template for Data Validation has been saved. Now, it's time to activate it. You can also select the option **Sort by Data Validation** so that the data matching the validation criteria will appear first in the table.\ ![](/img/guides/ai-tools-mcp/ai-features/boost-space-data-validation-3.webp) 4. Review the results — each row is checked against your rule, so you can spot and fix the ones that don't pass. --- title: Overview description: >- Connect any AI agent to Boost.space over the Model Context Protocol — the hosted Remote MCP Server, per-client setup guides, and token scoping. --- # MCP Boost.space hosts a **Remote MCP Server** — connect Claude, ChatGPT, Cursor, or any MCP client to your system and it can read and search records, create and update data, build modules and fields, and run Boost.space's AI operations. It runs on Boost.space infrastructure; there is nothing to host yourself. ![Claude, ChatGPT, Cursor or any other agent connect to your Boost.space data, within your permissions](/img/illustrations/mcp.webp) **An agent connected over MCP acts with exactly your Boost.space permissions — it can read, write, and query only the data you can, nothing more.** ## The server | What it's for | URL | |---|---| | Read, write, and query your Boost.space system | `https://mcp.boost.space/v2/{system}/sse` | ## Start here | Guide | What you'll do | |---|---| | **[Connect via MCP](/ai/mcp/server/connect-via-mcp)** | Point any MCP client at your system with the Connect AI window | | **[MCP clients](/ai/mcp/server/common-mcp-clients)** | Per-client setup: Claude, ChatGPT, Cursor, VS Code, Claude Code, v0, Lovable, CLI | | **[API tokens and MCP tokens](/ai/mcp/server/token-creation)** | Tokens, OAuth, and how access stays scoped | Want the full picture first — what an agent can actually do here, and the agent-readable doc surfaces like `/llms.txt`? **[Boost.space for AI agents](/ai/mcp/server/for-agents)** is the next page. --- title: Boost.space for AI agents description: >- How AI agents work with Boost.space — operate the data over MCP, read these docs as markdown, and rely on typed, permission-scoped structure. --- # Boost.space for AI agents Agents need **live operational context** to act on — and Boost.space is that layer: your business data aggregated from every tool, unified, and exposed so agents can **read it, act on it, and write results back**. **An agent connected over MCP acts with exactly your Boost.space permissions — it can read, write, and query only the data you can, nothing more.** The MCP is built for production agents, not demos: operations are **grouped and pre-computed**, so when an agent asks *"what's the total invoiced to this client over ten years?"* it gets **the answer, not the raw history** — fewer tokens, and none of the hallucinations that come from dumping raw data into a context window. One MCP server matters here: the one for your data. Its URL is in the **[MCP overview](/ai/mcp)**. ## Operate the data over MCP Connect any MCP client — Claude, ChatGPT, Cursor, Claude Code, and more — using the in-app **Connect AI** window, which creates the token and shows per-client steps. See [Connect via MCP](/ai/mcp/server/connect-via-mcp) and [Common MCP clients](/ai/mcp/server/common-mcp-clients). Once connected, an agent can: | Capability | Example prompt | |---|---| | **Search & read records** | *"Find every company in the Sales space with no email."* | | **Create & update records**, deduplicated by [key field](/guides/fields/key-column) | *"Import these 40 leads — update existing ones by email."* | | **Build structure** — modules, [fields](/guides/fields), field groups, spaces, [statuses](/guides/fields/statuses), [labels](/guides/fields/labels) | *"Create a Projects module with owner, status, and due date."* | | **Run Boost.space AI** — enrich fields, transform or validate columns | *"Standardize the phone-number column in Leads."* | | **Search semantically** over the [vector database](/ai/ai-features/vector-database) | *"Pull the 10 records most relevant to 'unhappy enterprise customers'."* | | **Build & run [automations](/guides/automation)** — create them, edit their [code](/guides/automation/code-automations), store Secrets, read run logs | *"Every Monday at 8:00, email me a summary of new orders."* | ## Read these docs as an agent Every page of this documentation is machine-readable: - **[`/llms.txt`](/llms.txt)** — an index of all pages with descriptions; **[`/llms-full.txt`](/llms-full.txt)** — the full corpus. - **Any page as markdown** — append `/index.md` to a page URL (e.g. `/fields/rollup/index.md`) to get the raw, frontmattered source. - The **Copy Page** button on every page copies its markdown for pasting into a prompt. ## Why the data model works for agents - **Typed fields** — a date is a date, a link resolves to a real record; agents read and write without guessing formats. See [Field types](/guides/fields/custom-field-types-in-boost-space). - **Relational links** — [linked records](/guides/fields/linked-records) let an agent traverse from a company to its deals, with [lookups](/guides/fields/lookup) and [rollups](/guides/fields/rollup) for derived context. - **Safe upserts** — the [key field](/guides/fields/key-column) means writing the same entity twice updates it instead of duplicating it, and [source priority](/guides/working-with-data/api-token-prioritization-data-consolidation) governs conflicts. - **Context where it belongs** — [space descriptions](/guides/spaces/space-settings) tell an agent what a dataset holds; the [vector database](/ai/ai-features/vector-database) retrieves the few records that matter instead of flooding the context window. - **Permissions built in** — tokens are per-user and per-operation; there is no separate security model to configure for agents. ## Prefer code? Everything an agent can do over MCP is also available on the **[REST API](/api-reference)** (OpenAPI at [`/latest.json`](/latest.json), markdown rendition at [`/api-markdown`](/api-markdown)) and the **[typed SDKs](/sdk)**. --- title: Connect via MCP description: >- Connect Claude, ChatGPT, Cursor, or any MCP client to your Boost.space system and let it read and write your data over the Remote MCP Server. --- # Connect via MCP The **Remote MCP Server** lets an AI agent work with your Boost.space system in real time — read and search records, create and update data, build modules and fields, and run Boost.space's AI operations. It runs on Boost.space infrastructure, so there is nothing to host yourself. > **An agent connected over MCP acts with exactly your Boost.space permissions — it can read, > write, and query only the data you can, nothing more.** **MCP is the surface for when an agent decides what to do.** You describe an outcome and it works out the steps. If instead *you* already know the steps and want to write them down, you want the **[SDK](/sdk)** — or the **[REST API](/api-reference)** if your language has no SDK yet. Same data, same permissions; the difference is who is authoring the sequence. ## The fastest way: the Connect AI window Boost.space has a built-in **Connect AI** window — a guided control panel that connects an external agent to your data. It creates the MCP token for you, gives you the connection URL, and shows the exact steps for your chosen client. Open it from the **Connect AI** button on a custom module, or from your user menu → **API / MCP tokens → Create new**. Then: 1. Choose **MCP token** (the default) over an API token. 2. Pick your **AI model** — or choose **Other** and select **OAuth** or **API key**. 3. **Copy the MCP URL** and follow the on-screen steps for that client. 4. Optionally try the example prompts, then finish — your token is created. Prefer to wire it up by hand? Use the steps below. ## What you need Two things, both from your Boost.space instance: 1. Your **connection URL** — copy it from the **Connect AI / MCP token** screen (don't build it by hand) — it looks like `https://mcp.boost.space/v2/{system}/sse`, where `{system}` is your system name. 2. Either an **MCP token** or an **OAuth** sign-in, depending on how your client connects. See **[API tokens and MCP tokens](/ai/mcp/server/token-creation)** for how to create the token and find your URL. > Treat an MCP token like a password — anyone who has it can act on your data through the assistant, > up to the token's permissions. ## Two ways to connect Modern clients support both; pick whichever the client offers. | Method | How it works | Best for | |---|---|---| | **URL + token** | Paste the connection URL and your MCP token into the client's connector settings | Claude, ChatGPT, Cursor, VS Code — any client with a "custom connector / MCP server" field | | **OAuth** | Paste the URL only; the client sends you to a Boost.space sign-in and receives its own token | Clients that support OAuth for remote MCP — no token to copy or store | Both connect to the same server. OAuth avoids handling a token by hand; URL + token works everywhere. Client-specific steps are in **[Common MCP clients](/ai/mcp/server/common-mcp-clients)**. ## What you can do once connected The agent works with your whole data model, not just reads. Within its token's permissions it can: - **Records** — search, read, create, update, and delete records across your spaces, one at a time or up to 500 in one call. - **Structure** — create and change modules, fields, field groups, spaces, statuses, and labels. - **Files, users, teams** — upload and manage files, and read or manage users and teams. - **AI operations** — generate and enrich field values, transform or validate whole columns, and generate module definitions. - **Semantic search** — find the records most relevant to a natural-language query. The tool list is not fixed. Your server advertises the tools for the modules **your** system has active, so two systems can legitimately offer different sets — an agent is better off without warehouse tools on a system that has no warehouses. The live server is the only accurate list, so the way to see yours is to ask: *"what Boost.space tools do you have?"* **Large imports.** An agent changes at most 500 records per call. To push thousands of rows, use the **[REST API](/api-reference)** or an **[SDK](/sdk)**, where your own code runs the import. --- title: MCP clients description: >- Dedicated setup guides for connecting Boost.space to Claude, ChatGPT, Cursor, Claude Code, VS Code, v0, Lovable, and command-line agents. --- # MCP clients Any MCP-compatible client can connect to your Boost.space [Remote MCP server](/ai/mcp/server/for-agents). The pattern is always the same — add a connector, paste your **connection URL** `https://mcp.boost.space/v2/{system}/sse`, authenticate with **OAuth** or an [MCP token](/ai/mcp/server/token-creation) — but each tool has its own place to do it. Pick your client: | Client | Guide | |---|---| | **Claude** (web & desktop) | [Connect Claude](/ai/mcp/clients/claude-ai) | | **ChatGPT** | [Connect ChatGPT](/ai/mcp/clients/chatgpt) | | **Cursor** | [Connect Cursor](/ai/mcp/clients/cursor) | | **Claude Code** | [Connect Claude Code](/ai/mcp/clients/claude-code) | | **VS Code** (Copilot agent mode) | [Connect VS Code](/ai/mcp/clients/vs-code) | | **v0** | [Connect v0](/ai/mcp/clients/v0) | | **Lovable** | [Connect Lovable](/ai/mcp/clients/lovable) | | **CLI agents** (Codex, Gemini) | [Connect CLI agents](/ai/mcp/clients/cli-agents) | | **Anything else** | [Connect any other client](/ai/mcp/clients/other-clients) | The in-app **Connect AI** window walks you through the same setups with your URL and token pre-filled — see [Connect via MCP](/ai/mcp/server/connect-via-mcp). --- title: API tokens and MCP tokens description: >- What API tokens and MCP tokens are, how they differ, how to create them, and how their permissions keep access scoped. --- # API tokens and MCP tokens Boost.space uses two kinds of tokens: **API tokens** (for integrations and the REST API) and **MCP tokens** (for AI agents connecting over MCP). Both authenticate as a [user](/guides/settings/system-roles-users-and-admins) and **can never have more rights than that user**. ## MCP token An MCP token authorizes an **AI agent** to connect to your Boost.space [MCP server](/ai/mcp/server/for-agents). The easiest way to create one is the in-app **Connect AI** window (see [Connect via MCP](/ai/mcp/server/connect-via-mcp)) — it mints the token and gives you the **connection URL** `https://mcp.boost.space/v2/{system}/sse` a client needs. - An MCP token acts as the user who created it — it can never do anything that user can't. - Some clients connect with **OAuth** instead of a token: you paste only the connection URL and sign in. The access model is the same. ## API token An API token authenticates a user with the [REST API](/api-reference) and integrations — the token acts as that user's login for programmatic access. ![Creating an API token](/img/guides/ai-tools-mcp/mcp/token-creation-1.webp) ## Permissions When you create an **API token**, choose a **permission type**: - **Read** — read-only access. - **All** — full access, within the user's own rights. - **Custom** — pick exactly which modules the token can touch, and whether it can **read**, **create**, **edit**, or **delete** in each. Every token is still bounded by the user's own rights — a token can never do more than its owner. To grant different access, create a new token. > Treat any token like a password — anyone who has it can act on your data up to the token's > permissions. ## Which token do I need? | Use case | Token | |---|---| | Build an integration or call the REST API | **API token** | | Connect an AI agent over MCP (Claude, ChatGPT, Cursor, …) | **MCP token** (or OAuth) | Next: **[Connect via MCP](/ai/mcp/server/connect-via-mcp)** · **[Common MCP clients](/ai/mcp/server/common-mcp-clients)** # Connect Claude Claude (web and desktop, on a paid plan) connects to Boost.space as a **custom connector**. [Connect MCP to Claude](https://fast.wistia.net/embed/iframe/uxbo1l1rpi?seo=true\&videoFoam=true) 1. In Boost.space, open the **Connect AI** window and copy your **connection URL** `https://mcp.boost.space/v2/{system}/sse` — see [Connect via MCP](/ai/mcp/server/connect-via-mcp). 2. In Claude, open **Settings → Connectors → Add custom connector**. 3. Paste the connection URL. 4. Authenticate — sign in with **OAuth** if offered, otherwise paste your [MCP token](/ai/mcp/server/token-creation). 5. Open a chat — the Boost.space tools appear in the tool menu. > The agent acts within your Boost.space permissions — the same access as the user who created the token. **Try it:** > "Search my Boost.space for companies without an owner and list the ten biggest ones." See [what an agent can do](/ai/mcp/server/for-agents) once connected. --- title: Claude Code description: >- Connect Claude Code to Boost.space over MCP — one CLI command and the agent can read and write your data from the terminal. --- # Connect Claude Code Add Boost.space to Claude Code with one command: ```bash claude mcp add --transport sse boostspace \ https://mcp.boost.space/v2/{system}/sse \ --header "Authorization: Bearer YOUR_MCP_TOKEN" ``` Replace `{system}` with your system name and `YOUR_MCP_TOKEN` with your [MCP token](/ai/mcp/server/token-creation) — both from the **Connect AI** window ([Connect via MCP](/ai/mcp/server/connect-via-mcp)). Run `/mcp` in a session to confirm the Boost.space tools are connected. > The agent acts within your Boost.space permissions — the same access as the user who created the token. **Try it:** > "Pull the schema of my Tickets space and scaffold an import script for it." See [what an agent can do](/ai/mcp/server/for-agents) once connected. # Connect ChatGPT ChatGPT connects to Boost.space through **Connectors**. [Connect MCP to OpenAI](https://fast.wistia.net/embed/iframe/zfpmt4uchq?seo=true\&videoFoam=true) 1. In Boost.space, open the **Connect AI** window and copy your **connection URL** `https://mcp.boost.space/v2/{system}/sse` — see [Connect via MCP](/ai/mcp/server/connect-via-mcp). 2. In ChatGPT, open **Settings → Connectors** and add a connector. 3. Paste the connection URL. 4. Authenticate with **OAuth** or your [MCP token](/ai/mcp/server/token-creation). 5. Enable the connector in a chat to let ChatGPT use your Boost.space data. > The agent acts within your Boost.space permissions — the same access as the user who created the token. **Try it:** > "Summarize the records added to my Leads space this week and flag any missing emails." See [what an agent can do](/ai/mcp/server/for-agents) once connected. --- title: Cursor description: >- Connect Cursor to Boost.space over MCP — one mcp.json entry and your data is available to the agent while you build. --- # Connect Cursor Cursor reads MCP servers from an `mcp.json` config (**Settings → MCP → Add new server**): ```json { "mcpServers": { "boostspace": { "url": "https://mcp.boost.space/v2/{system}/sse", "headers": { "Authorization": "Bearer YOUR_MCP_TOKEN" } } } } ``` Replace `{system}` with your system name and `YOUR_MCP_TOKEN` with your [MCP token](/ai/mcp/server/token-creation) (get both from the **Connect AI** window — see [Connect via MCP](/ai/mcp/server/connect-via-mcp)), then reload. Boost.space appears in Cursor's MCP tools list. > The agent acts within your Boost.space permissions — the same access as the user who created the token. **Try it:** > "Read the schema of my Products space and generate a typed client for it." See [what an agent can do](/ai/mcp/server/for-agents) once connected. --- title: VS Code description: >- Connect VS Code (Copilot agent mode) to Boost.space over MCP with an mcp.json entry. --- # Connect VS Code VS Code (with Copilot Chat's agent mode) connects via the command palette — **MCP: Add Server → HTTP** — or an `mcp.json` in your workspace: ```json { "servers": { "boostspace": { "type": "http", "url": "https://mcp.boost.space/v2/{system}/sse", "headers": { "Authorization": "Bearer YOUR_MCP_TOKEN" } } } } ``` Replace `{system}` with your system name and `YOUR_MCP_TOKEN` with your [MCP token](/ai/mcp/server/token-creation) — both from the **Connect AI** window ([Connect via MCP](/ai/mcp/server/connect-via-mcp)). > The agent acts within your Boost.space permissions — the same access as the user who created the token. **Try it:** > "List the fields of my Companies space and draft a validation script against them." See [what an agent can do](/ai/mcp/server/for-agents) once connected. --- title: CLI agents (Codex, Gemini) description: >- Connect command-line agents like Codex or Gemini CLI to Boost.space over MCP with a config-file entry. --- # Connect CLI agents Command-line agents (OpenAI **Codex**, **Gemini CLI**, and similar) read MCP servers from a config file. Add an HTTP/SSE entry pointing at your connection URL with a `Bearer` token header — for example in `~/.codex/config.toml`: ```toml [mcp_servers.boostspace] url = "https://mcp.boost.space/v2/{system}/sse" headers = { Authorization = "Bearer YOUR_MCP_TOKEN" } ``` Replace `{system}` with your system name and `YOUR_MCP_TOKEN` with your [MCP token](/ai/mcp/server/token-creation) — both from the **Connect AI** window ([Connect via MCP](/ai/mcp/server/connect-via-mcp)). Other CLIs use the same pattern with their own config format. > The agent acts within your Boost.space permissions — the same access as the user who created the token. **Try it:** > "Export every record from my Deals space created this month as CSV." See [what an agent can do](/ai/mcp/server/for-agents) once connected. # Connect Lovable Building an app in **Lovable**? Connect it to Boost.space so it reads and writes your real data — scoped to your permissions. [Connect MCP to Lovable](https://fast.wistia.net/embed/iframe/b2grgw0n81?seo=true\&videoFoam=true) 1. In Boost.space, open the **Connect AI** window, pick **Lovable**, and follow the on-screen steps — it creates your [MCP token](/ai/mcp/server/token-creation) and shows the exact flow. See [Connect via MCP](/ai/mcp/server/connect-via-mcp). 2. In Lovable, add Boost.space as an **MCP server**: paste your **connection URL** `https://mcp.boost.space/v2/{system}/sse` and authenticate with **OAuth** or the token. 3. Prompt Lovable against your data. > The agent acts within your Boost.space permissions — the same access as the user who created the token. **Try it:** > "Build a customer portal listing each company's open tickets from my Boost.space." See [what an agent can do](/ai/mcp/server/for-agents) once connected. --- title: v0 description: >- Connect v0 to Boost.space over MCP so your generated apps work with live, permission-scoped data. --- # Connect v0 Building UI in **v0**? Connect it to Boost.space so the generated app works against your live data instead of mocks. 1. In Boost.space, open the **Connect AI** window, pick **v0**, and follow the on-screen steps — it creates your [MCP token](/ai/mcp/server/token-creation) and shows the exact flow. See [Connect via MCP](/ai/mcp/server/connect-via-mcp). 2. In v0, add Boost.space as an **MCP server**: paste your **connection URL** `https://mcp.boost.space/v2/{system}/sse` and authenticate with **OAuth** or the token. 3. Ask v0 to build against your data. > The agent acts within your Boost.space permissions — the same access as the user who created the token. **Try it:** > "Build a dashboard over my Deals space: pipeline by stage, top 10 by value." See [what an agent can do](/ai/mcp/server/for-agents) once connected. --- title: Other clients description: >- Any MCP-compatible client can connect to Boost.space — the universal pattern is a connection URL plus OAuth or an MCP token. --- # Connect any other MCP client Every MCP-compatible client connects the same way: 1. Add a new **MCP server / connector** in the client. 2. Paste your Boost.space **connection URL** — `https://mcp.boost.space/v2/{system}/sse`, where `{system}` is your system name (copy it from the **Connect AI** window, see [Connect via MCP](/ai/mcp/server/connect-via-mcp)). 3. Authenticate — **OAuth** where the client supports it, otherwise a Bearer [MCP token](/ai/mcp/server/token-creation) header. If a client accepts only a bare URL with no auth field, use OAuth. Once connected, the agent can read and write your data within the token's permissions — see [what an agent can do](/ai/mcp/server/for-agents). --- title: Overview description: >- The Boost.space REST API — one base URL per tenant, Bearer authentication, and full access to your modules, spaces, records, and fields. --- # API **The Boost.space REST API gives you programmatic access to your whole data model** — modules, spaces, records, and fields — on one base URL per tenant, with Bearer authentication. ![A GET request to /api/space with a Bearer token, and its JSON response](/img/illustrations/api.webp) ## Is the raw API the right surface for you? All three developer surfaces reach the same data with the same permissions. They differ in who is holding the wheel: | Use | When | |---|---| | **REST API** — you are here | You are writing code in a language without an SDK, or you want the exact wire format: raw HTTP, no client in the way | | **[SDK](/sdk)** | You are writing code in TypeScript or Python. Same API, plus typed models, retries, pagination you can iterate, and bulk helpers that chunk for you. Prefer this over hand-rolling HTTP | | **[MCP](/ai/mcp/server/connect-via-mcp)** | An **AI agent** is doing the work and deciding what to do next, rather than you writing the steps out in advance | The dividing line is not capability, it is authorship. Write the steps yourself and you want the SDK. Describe the outcome and let an agent find the steps, and you want MCP. Reach for the raw API when neither fits. ## Quickstart 1. Create an **[API token](/ai/mcp/server/token-creation)** in your profile. 2. Call the API — base URL `https://{system}.boost.space/api`, Bearer auth: ```bash curl https://{system}.boost.space/api/space \ -H "Authorization: Bearer $BS_TOKEN" ``` `{system}` is your system name (e.g. `acme` → `acme.boost.space`). ## What's inside | Resource | What's inside | |---|---| | **[Interactive reference](/api-reference/reference)** | Every public endpoint, with schemas and copy-paste code samples | | **[SDKs](/sdk)** | Typed clients generated from this same spec | | **[Changelog](/changelog/updates/api-changelog)** | What changed in the API, version by version | ## Conventions - **Base URL** is per-tenant: `https://{system}.boost.space/api`. - **Authentication** is a Bearer **[API token](/ai/mcp/server/token-creation)**; a token can never exceed its user's permissions, and its scopes are set per module and per operation. - **Filtering** uses one grammar everywhere: `filter=field operator value`, conditions joined with `;`/`&` (AND) or `|` (OR) — see the [filtering guide](/sdk/guides/filtering) for the full operator set with tested examples. - **Pagination** is `offset`/`limit` with the total in the `X-BoostSpace-FoundRecords` header; **ordering** is `order=field;ASC|DESC`. - **Versioning** — releases from **5.4.0** on are pinned and diffable at `/.json`, which is where the public surface was defined; the current spec is always [`/latest.json`](/latest.json). See the [Changelog](/changelog). ## Machine-readable Built for agents as much as for people: - The current OpenAPI document: [`/latest.json`](/latest.json). - The whole API as Markdown: [`/api-markdown`](/api-markdown), indexed in [`/llms.txt`](/llms.txt). - These docs are agent-readable end to end — see **[Boost.space for AI agents](/ai/mcp/server/for-agents)**. --- title: Overview description: >- Official Boost.space SDKs for TypeScript, Python, PHP, and Go — typed clients generated from the REST API spec. --- # SDK **One typed client for the Boost.space REST API, in four languages.** TypeScript, Python, PHP, and Go are all generated from the same [OpenAPI spec](/api-reference) that powers the API Reference — so the client surface always matches the API. Each ships **74 resources**, fully typed models, and **165 relationship-navigation methods**. ![Your agent turns a request into code on the typed Boost.space SDK, which offers it every method](/img/illustrations/sdk.webp) > Generated from the SDK's own source of truth, so these docs always match the shipped packages. ## Should you use the SDK? **If you are writing code against Boost.space in TypeScript or Python, yes** — there is no reason to hand-roll HTTP. You get the same endpoints plus typed models, automatic retries, pagination you can iterate over instead of managing offsets, filters you compose instead of string-building, and bulk helpers that chunk a large batch and report per-chunk failures. Reach for the **[REST API](/api-reference)** directly when your language has no SDK yet, or when you need the exact wire format. Reach for **[MCP](/ai/mcp/server/connect-via-mcp)** when an AI agent is deciding what to do rather than you writing the steps out. ## Get started in two steps **1. Install** (TypeScript and Python are on the public registries; PHP and Go are coming soon): ```bash npm install @boost-space/sdk # TypeScript pip install boostspace-sdk # Python ``` **2. Make your first call:** ```ts import { BoostSpace } from "@boost-space/sdk"; // `system` is your tenant, e.g. "acme" → https://acme.boost.space/api const bs = new BoostSpace({ token: process.env.BS_TOKEN!, system: "acme" }); const space = await bs.spaces.get(42); ``` Full auth options (tokens, providers, OAuth, MCP) are in **[Authentication](/sdk/guides/authentication)**. ## Guides Concepts that apply across all four languages: | Guide | What's inside | |---|---| | **[Authentication](/sdk/guides/authentication)** | API tokens, token providers, OAuth, MCP | | **[Filtering](/sdk/guides/filtering)** | The full filter grammar with tested examples | | **[Ordering & pagination](/sdk/guides/ordering-pagination)** | Sort grammar and Paginator idioms | | **[Errors & retries](/sdk/guides/errors-retries)** | Typed errors and automatic retries | | **[Record handles](/sdk/guides/record-handles)** | Lazy `ref` handles, caching, call costs | | **[Relations & expand](/sdk/guides/relations-expand)** | Relationship navigation and expansion | | **[Delta sync & bulk](/sdk/guides/delta-sync-bulk)** | Change feeds and bulk operations | | **[Testing & mocking](/sdk/guides/testing-mocking)** | Test against the SDK safely | ## Reference One page per resource — Records, Fields, Files, Labels, Modules, Spaces, Users, and more — generated from the spec: **[SDK API reference](/sdk/reference)**. ## What every SDK guarantees - **Bearer authentication** with your API token - **Automatic retries** with backoff - **Header-driven pagination** (`X-BoostSpace-FoundRecords`), exposed as native iteration - **Typed errors** carrying both the HTTP status and the internal Boost.space `code` Base URL is per-tenant: `https://{system}.boost.space/api` (`system` = your system name). ## SDK vs. REST | Use… | When | |---|---| | **An [SDK](/sdk/guides/authentication)** | You're in TypeScript, Python, PHP, or Go — get types, retries, pagination, and relationship helpers | | **The [REST API](/api-reference)** | Any other language — copy-paste code samples per endpoint | Packages: [npm](https://www.npmjs.com/package/@boost-space/sdk) · [PyPI](https://pypi.org/project/boostspace-sdk/) · [SDK changelog](/changelog/updates/sdk-changelog). --- title: "Authentication" --- # Authentication Boost.space authenticates every request with an HTTP **Bearer** token in the `Authorization` header. The base URL is per-tenant: pass `system` (→ `https://{system}.boost.space/api`) or a full `baseUrl`/`base_url`. ## 1. Static API token Created in the user profile; authorizes requests as that user. ```python bs = BoostSpace("api-token", system="acme") ``` ```ts const bs = new BoostSpace({ token: "api-token", system: "acme" }); ``` ```php $bs = new BoostSpace('api-token', system: 'acme'); ``` ```go bs := boostspace.NewClient("api-token", boostspace.WithSystem("acme")) ``` ## 2. Token provider (resolved per request) `token` also accepts a **callable** that is called before each request — so a short-lived token is always current: ```python bs = BoostSpace(lambda: current_access_token(), system="acme") # sync or async ``` ```ts new BoostSpace({ token: () => currentAccessToken(), system: "acme" }); ``` ```php new BoostSpace(fn () => currentAccessToken(), system: 'acme'); ``` ```go boostspace.NewClient("", boostspace.WithSystem("acme"), boostspace.WithTokenProvider(func(ctx context.Context) (string, error) { return current(ctx) })) ``` ## 3. OAuth2 (and MCP tokens) The API exposes a full OAuth2 flow: `GET /auth/oauth/authorize` → `POST /auth/oauth/token` (`grant_type=authorization_code` then `refresh_token`) → a short-lived `access_token` + `refresh_token` + `expires_in`, plus `revoke` and `token-info`. > **MCP tokens are ordinary OAuth2 access tokens.** An MCP client is just an > OAuth2 client registered with `mcp=true` (dynamic client registration); there > is no separate token type or header — the same flow and the same > `OAuth2Session` apply. `OAuth2Session` runs the flow and refreshes proactively (60 s before expiry), and is itself a token provider: ```python from boostspace.runtime import OAuth2Session session = OAuth2Session("client-id", "client-secret", system="acme", refresh_token=stored) # or: session.exchange_code(code, redirect_uri=...) bs = BoostSpace(session, system="acme") # token kept fresh ``` ```ts const session = new OAuth2Session({ clientId, clientSecret, system: "acme", refreshToken: stored }); const bs = new BoostSpace({ token: session.provider(), system: "acme" }); ``` ```php $session = new OAuth2Session('client-id', 'client-secret', system: 'acme', refreshToken: $stored); $bs = new BoostSpace($session->provider(), system: 'acme'); ``` ```go session := boostspace.NewOAuth2Session("client-id", "client-secret", boostspace.OAuth2WithSystem("acme"), boostspace.OAuth2WithRefreshToken(stored)) bs := boostspace.NewClient("", boostspace.WithSystem("acme"), boostspace.WithTokenProvider(session.Provider())) ``` `OAuth2Session` exposes `exchangeCode`/`exchange_code`, `refresh`, and `token()`, plus the current `accessToken`/`refreshToken`/`expiresAt` so you can persist and restore them. --- title: "Delta sync & bulk operations" --- # Delta sync & bulk operations ## Delta sync — records changed since a timestamp `records` supports incremental sync directly on `list`: pass `updated_since` (a Unix timestamp) and the paginator streams only the records changed at or after that moment, so you don't re-pull the whole dataset. Pair it with `list_deleted` to also learn which records were removed since the same point. ```python since = "1704067200" # Unix timestamp of your last sync for record in bs.records.list(updated_since=since): # streams changed records reindex(record) for deleted_id in bs.records.list_deleted(updated_since=since): drop(deleted_id) ``` ```ts for await (const r of bs.records.list({ updatedSince: 1704067200 })) { reindex(r); } for await (const id of bs.records.listDeleted({ updatedSince: 1704067200 })) { drop(id); } ``` > `list_deleted` returns just the deleted record IDs (not full models), so a sync > can prune its local copy without a second lookup. ## Bulk with chunking Bulk is not a separate method — **the verb is polymorphic and the argument shape decides**: `delete(42)` deletes one record, `delete([1, 2])` deletes many in one request; `update(42, data)` vs `update([rec1, rec2])` likewise. (Go has no overloads, so the list shape is `DeleteMany` / `UpdateMany` there.) For large inputs the `*Chunked` variant splits the array into chunks and reports **per-chunk** outcomes instead of failing all-or-nothing: ```python result = bs.records.update_chunked(batch, chunk_size=100) print(result.succeeded, result.failed) # BulkResult: successes + per-chunk errors for err in result.errors: print(err.chunk_index, err.error) ``` ```ts const result = await bs.records.updateChunked(batch, 100); ``` ```go result, _ := bs.Records.UpdateManyChunked(ctx, batch, 100) ``` A plain bulk `update([records])` is a single request (all-or-nothing); `updateChunked` trades atomicity for resilience + progress on big batches. Each chunk is one API call — see the method's `Cost:` line. --- title: "Errors & retries" --- # Errors & retries ## Typed errors A non-2xx response maps to a typed error carrying the HTTP status, the API's error `code` (integer), the message, and the request URL: | HTTP | Error type | |------|-----------| | 400 / 422 | `ValidationError` | | 401 | `UnauthorizedError` | | 403 | `ForbiddenError` | | 404 | `NotFoundError` | | 409 | `ConflictError` | | 429 | `RateLimitError` | | 5xx | `ServerError` | All extend a common base (`BoostSpaceApiError` / `APIError`), so you can catch broadly or narrowly: ```python from boostspace import NotFoundError, BoostSpaceApiError try: bs.spaces.ref(999999).get() except NotFoundError: ... except BoostSpaceApiError as e: print(e.http_status, e.code, e.message) ``` ```ts try { await bs.spaces.ref(999999).get(); } catch (e) { if (e instanceof NotFoundError) { /* … */ } } ``` ```go _, err := bs.Spaces.Ref(999999).Get(ctx) var nf *boostspace.NotFoundError if errors.As(err, &nf) { /* … */ } ``` > The error **`code` is an integer** — the HTTP status for generic errors, or a > specific internal code (e.g. 4002 missing field, 4005 not found, 4031 2FA > required) for finer cases. Don't compare it to strings. ## Retries The runtime retries automatically, but only when it is **safe**: - **429** — always retried (rejected before processing), honouring `Retry-After`. - **5xx / network errors** — retried only for **idempotent** methods (GET/PUT/DELETE/HEAD/OPTIONS). A **POST is never retried**, so you can't get a duplicate create. - Backoff is exponential with jitter; `maxRetries` defaults to 3 and is configurable at construction. Observability hooks (`onRequest`/`onResponse`/`onError`) fire once per logical request (retries are internal) and can inject headers (e.g. trace context). --- title: "Filtering" --- # Filtering **Use the `Filter` builder — you shouldn't have to know the grammar.** It composes a valid filter from readable helpers (`eq`, `gt`, `like`, `in`, `and`, `or`) and handles operators, escaping and grouping for you. The raw DSL below is the reference for power users and for reading what the builder produces. ## Filter builder (recommended) ```python from boostspace import Filter bs.spaces.list(filter=Filter.equals("color", "#4A90D9").and_(Filter.greater_than_or_equal("id", 3))) bs.spaces.list(filter=Filter.any_of(Filter.equals("name", "Acme"), Filter.equals("name", "Globex"))) bs.spaces.list(filter=Filter.contains("name", "acme")) # ~ %acme% ``` ```ts import { Filter } from "@boost-space/sdk"; bs.spaces.list({ filter: Filter.equals("color", "#4A90D9").and(Filter.greaterThanOrEqual("id", 3)).build() }); bs.spaces.list({ filter: Filter.contains("name", "acme").build() }); ``` ```php use BoostSpace\Sdk\Runtime\Filter; $bs->spaces->list(filter: (string) Filter::equals('color', '#4A90D9')->and(Filter::greaterThanOrEqual('id', 3))); ``` ```go bs.Spaces.List(ctx, boostspace.ListParams{ Filter: boostspace.FilterEquals("color", "#4A90D9").And(boostspace.FilterGreaterThanOrEqual("id", "3")).String(), }) ``` Readable helpers, one per operator: `equals`, `notEquals`, `greaterThan`, `greaterThanOrEqual`, `lessThan`, `lessThanOrEqual`, `in`, `isNull`, and `like`/`notLike` (raw `%` control). Plus **wildcard shortcuts so you never type `%`**: `contains` (→ `~ %v%`), `startsWith` (→ `~ v%`), `endsWith` (→ `~ %v`). Combine with `and`/`or` (OR nested in AND is parenthesised automatically). A plain string is still accepted anywhere a filter is expected, so the raw DSL remains an escape hatch. ## Raw grammar (reference) Every `list` endpoint accepts a `filter` string in the Boost.space filter DSL. The SDK URL-encodes it for you — you never encode `>`, `;`, `|` or `%` yourself. ``` filter = condition ( (";" | "&" | "|") condition )* condition = field operator value ``` - **`;` or `&`** join conditions with **AND**. - **`|`** joins with **OR**. - Parentheses group: `(a|b);c` = *(a OR b) AND c*. ### Operators | Operator | Meaning | Example | |----------|---------|---------| | `=` | equals (empty value also matches NULL) | `status=1` | | `!=` | not equals | `status!=1` | | `>` `>=` `<` `<=` | numeric / date comparison | `id>3` | | `~` | LIKE — `%` is the wildcard (empty matches NULL/empty) | `name~%acme%` | | `!~` | NOT LIKE | `name!~%test%` | | `...` | IN a comma-separated set | `id...3,5,7` | > These **nine** operators are the whole grammar (from the API's `FormulaOperator`). > There is **no user-facing "NOT IN"** — negate with `!=` or compose with `!~`. > IN takes a comma-separated list after `...` (`id...3,5,7`). The SDK > URL-encodes the whole expression (`~`, `%`, `...`, `|`, spaces) for you — the > builder produces the raw string, the HTTP layer encodes it. Verified live: > `Filter.in_("id",[3,5,7])` → `id...3,5,7` → rows 3,5,7; `not_like("name","%a%")` > → `name!~%a%`. ## Verified examples Run live against the seeded API (`GET /space`), results are record IDs: | Filter | Result | |--------|--------| | `id>3` | `5,6,7,8` | | `id>=3;id<=6` | `3,5,6` (range, AND) | | `name~%a%` | `1,2,3,5,6` (LIKE) | | `id=1\|id=7` | `1,7` (OR) | ## Per language ```python bs.spaces.list(filter="id>=3;id<=6") # Python ``` ```ts bs.spaces.list({ filter: "id>=3;id<=6" }); // TypeScript ``` ```php $bs->spaces->list(filter: 'id>=3;id<=6'); // PHP ``` ```go bs.Spaces.List(ctx, boostspace.ListParams{Filter: "id>=3;id<=6"}) // Go ``` > The full grammar lives in the API's shared `filter` parameter description, so > it also appears in every `list` method's generated doc comment and in > `sdk-catalog.json`. --- title: "Ordering & pagination" --- # Ordering & pagination ## Ordering **Use the `Order` builder — you shouldn't have to know the `field;DIRECTION` grammar.** (Planned; entity-handles phase 4.) ```python from boostspace import Order bs.spaces.list(order=Order.by("name", "ASC")) # name;ASC bs.spaces.list(order=Order.by("color", "ASC").by("id", "DESC")) # color;ASC,id;DESC ``` ```ts bs.spaces.list({ order: Order.by("color", "ASC").by("id", "DESC") }); ``` ```php $bs->spaces->list(order: (string) Order::by('color', 'ASC')->thenBy('id', 'DESC')); ``` ```go bs.Spaces.List(ctx, boostspace.ListParams{Order: boostspace.OrderBy("color", "ASC").By("id", "DESC").String()}) ``` A plain string is still accepted, so the raw grammar below stays an escape hatch. ## Raw grammar (reference) `order` is a comma-separated list of `field;DIRECTION` pairs (note the **semicolon** between field and direction, comma between pairs): ``` order = field ";" ("ASC"|"DESC") ( "," field ";" ("ASC"|"DESC") )* ``` - DIRECTION defaults to **DESC** when omitted (`order=id` = `order=id;DESC`). - Multiple keys sort primary, then secondary. Verified live (`GET /space`, IDs shown): | Order | Result | |-------|--------| | `id;ASC` | `1,2,3,5,6,7,8` | | `id;DESC` | `8,7,6,5,3,2,1` | | `name;ASC` | `1,6,2,7,5,8,3` | | `color;ASC,id;DESC` | `3,2,1,8,7,6` (by color, then id desc) | > Common mistake: a **space** (`order=id ASC`) is *not* the separator — the > direction is dropped and you get the default DESC. Use `order=id;ASC`. ## Pagination - `offset` — zero-based index of the first record (default 0). - `limit` — page size (default 100). - The **total match count** is not in the body; it comes from the `X-BoostSpace-FoundRecords` response header. The SDK surfaces it on the page. You rarely page by hand — every `list` returns a **paginator** that fetches pages lazily as you iterate: ```python for space in bs.spaces.list(order="name;ASC"): # streams all pages print(space.id) page = bs.spaces.list(limit=50).page() # one page + total print(page.items, page.found_records) ``` ```ts for await (const s of bs.spaces.list({ order: "name;ASC" })) { /* … */ } const page = await bs.spaces.list({ limit: 50 }).page(); ``` ```php foreach ($bs->spaces->list(order: 'name;ASC') as $s) { /* … */ } $page = $bs->spaces->list(limit: 50)->page(); // ['items'=>…, 'found'=>…] ``` ```go it := bs.Spaces.List(ctx, boostspace.ListParams{Order: "name;ASC"}) for it.Next(ctx) { c := it.Value(); _ = c } ``` One API call per page — see each `list` method's `Cost:` line. --- title: "Record handles (`ref`)" --- # Record handles (`ref`) One rule makes the whole surface guessable: > **`bs.records` is a collection. `bs.records.ref(42)` is a record handle. > A record's relation is again a collection.** ## What `ref` is `ref(id)` returns a lightweight handle to **one** record. It is **lazy** — it makes **no API call** until you ask for something. You can also pass a model you already have, which seeds the handle's cache. ```python c = bs.records.ref(42) # 0 API calls — just a reference c = bs.records(42) # Python sugar for .ref(42) rec = c.get() # 1 call — fetch + cache c.field_values() # 0 calls if cached, else 1 ``` ```ts const c = bs.records.ref(42); // .ref() everywhere (PHP/TS/Go); Python also bs.records(42) ``` ```php $c = $bs->records->ref(42); ``` ```go c := bs.Records.Ref(42) // or Ref(existingModel) ``` ## What a handle can do | Method | Cost | Notes | |--------|------|-------| | `get()` | 1 | fetch and cache the record | | `update(data)` | 1 | update and re-cache | | `delete()` | 1 | delete by id | | `field_values()` | 0 cached / 1 | field values keyed by field name | | `expand([...])` | 1 per relation | eager-load related records (phase 3) | | `()` e.g. `c.space()` | 1 (0 if cached) | follow a foreign key to the related record | | `()` e.g. `c.labels()` | — | a **relation-collection** (see relations-expand.md) | ## Why a handle and not `of()` The earlier `of(entity)` navigator required you to fetch the model first and read backwards. `ref` reads forward ("record 42 → its labels"), works from a bare id without a fetch, and groups everything about one record under one autocomplete. `of()` remains as a `@deprecated` alias during the transition. Models stay **pure data** — no hidden I/O on a model object. The handle holds the cache and every method documents its API-call cost. --- title: "Relations & expand" --- # Relations & expand The SDK infers relationships from the spec (foreign-key fields and nested list endpoints) and generates navigation for both directions. ## belongsTo — follow a foreign key A record that carries a `*Id` field can follow it to the related record: ```python space = bs.records.ref(42).space() # Record.spaceId → Space (or None) ``` Costs 1 API call (0 if the record is already cached, +1 to load it if not). Returns the related record or `null`/`None` when the FK is empty. ## hasMany — a related collection A nested list endpoint (`/record/{id}/label`) becomes a **relation-collection** on the handle — itself a paginator, so it iterates lazily: ```python for label in bs.records.ref(42).labels(): # streams the record's labels ... bs.records.ref(42).labels().all() # materialise ``` Where the API exposes a verified link/unlink pair for a relation, that collection additionally gains `attach(idOrModel)` / `detach(idOrModel)` (reading "record 42's labels: attach 7"). These verbs appear only on relations backed by such a pair; the read-mostly public relations above expose iterate / `all` / `page` only. ## expand — eager-load several relations `expand` fetches named **belongsTo** relations up front and returns a typed composite, so you avoid a round-trip per relation in your own code: ```python c = bs.records.ref(42).expand(["space", "created_by"]) c.space # already loaded ``` ## Honest limits The API has **no server-side `expand`/`include`** — expand issues one request per relation (concurrently where the language allows: TS `Promise.all`, async-Python `asyncio.gather`; sequential elsewhere). So expand is convenience, not a way around N+1. hasMany collections stay lazy for the same reason. Active mutation *through* a model is deliberately not offered — models are pure data. --- title: "Testing & mocking" --- # Testing & mocking Every client accepts an injected transport, so you can unit-test code that uses the SDK **without a live API** — using each language's standard mocking tool. No network, fully deterministic. ## Python — `httpx.MockTransport` ```python import httpx from boostspace import BoostSpace def handler(request: httpx.Request) -> httpx.Response: return httpx.Response(200, json={"id": 1, "name": "Mock Inc"}) bs = BoostSpace("token", system="acme", http_client=httpx.Client(transport=httpx.MockTransport(handler))) assert bs.spaces.get(1).name == "Mock Inc" ``` ## TypeScript — a mock `fetch` ```ts const bs = new BoostSpace({ token: "t", system: "acme", fetch: async () => new Response(JSON.stringify({ id: 1, name: "Mock Inc" }), { status: 200, headers: { "content-type": "application/json" } }), }); ``` ## PHP — Guzzle `MockHandler` ```php use GuzzleHttp\{Client, HandlerStack}; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\Psr7\Response; $http = new Client(['handler' => HandlerStack::create(new MockHandler([ new Response(200, [], json_encode(['id' => 1, 'name' => 'Mock Inc'])), ]))]); $bs = new BoostSpace('t', system: 'acme', http: $http); ``` ## Go — a custom `RoundTripper` ```go rt := roundTripFunc(func(r *http.Request) (*http.Response, error) { body := `{"id":1,"name":"Mock Inc"}` return &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body)), Header: http.Header{}}, nil }) bs := boostspace.NewClient("t", boostspace.WithSystem("acme"), boostspace.WithHTTPClient(&http.Client{Transport: rt})) ``` The injected transport still gets the SDK's base URL + auth applied, so your handler sees exactly the request the SDK would send in production. Each language's test suite includes a mock-transport test as a worked example. ## Fixtures — sample model instances Rather than hand-write a full payload for every mock response, use the generated fixture factory: it returns an instance of a resource model with its **required** fields pre-filled. One factory per resource model. ```python from boostspace import fixtures space = fixtures.space(name="Acme") # overrides merged in ``` ```ts const space = fixtures.space({ name: "Acme" }); // spread overrides ``` ```php $space = \BoostSpace\Sdk\Fixtures::space(); // then mutate public props $space->name = 'Acme'; ``` ```go space := boostspace.FixtureSpace() // then mutate the struct space.Name = "Acme" ``` Combine the two: return `fixtures.space(...)` (serialised) from your mock handler to get a valid response body with almost no boilerplate. Fixtures fill only required fields (deterministic sample values); set anything else the test cares about via overrides / mutation. --- title: "SDK API reference" description: "Generated reference for every Boost.space SDK resource." --- One page per resource. See also the [guides](/sdk/guides). - [AIFeatures](/sdk/reference/AIFeatures) — Boost.space AIFeatures API — 22 operations, model `ColumnDataTransform`. - [Authentication](/sdk/reference/Authentication) — Boost.space Authentication API — 15 operations, model `OAuth2Client`. - [Categories](/sdk/reference/Categories) — Boost.space Categories API — 2 operations, model `Category`. - [FieldGroups](/sdk/reference/FieldGroups) — Boost.space FieldGroups API — 5 operations, model `FieldGroup`. - [Fields](/sdk/reference/Fields) — Boost.space Fields API — 13 operations, model `Field`. - [Files](/sdk/reference/Files) — Boost.space Files API — 17 operations, model `File`. - [Labels](/sdk/reference/Labels) — Boost.space Labels API — 16 operations, model `Label`. - [Menus](/sdk/reference/Menus) — Boost.space Menus API — 5 operations, model `Menu`. - [Modules](/sdk/reference/Modules) — Boost.space Modules API — 5 operations, model `Module`. - [Records](/sdk/reference/Records) — Boost.space Records API — 11 operations, model `Record`. - [Spaces](/sdk/reference/Spaces) — Boost.space Spaces API — 6 operations, model `Space`. - [Statuses](/sdk/reference/Statuses) — Boost.space Statuses API — 9 operations, model `Status`. - [Teams](/sdk/reference/Teams) — Boost.space Teams API — 3 operations, model `Team`. - [Users](/sdk/reference/Users) — Boost.space Users API — 18 operations, model `User`. - [ValueMetrics](/sdk/reference/ValueMetrics) — Boost.space ValueMetrics API — 2 operations, model `ValueMetric`. - [VectorDatabase](/sdk/reference/VectorDatabase) — Boost.space VectorDatabase API — 3 operations. --- title: "AIFeatures" description: "Boost.space AIFeatures API — 22 operations, model `ColumnDataTransform`." --- > Auto-generated from the OpenAPI spec. Method names shown are the manifest > (canonical) names; per-language casing is applied by each SDK. **Record handle:** `ref(id)` → a lazy handle to one ColumnDataTransform (get/update/delete, field values, related records). See [record handles](/sdk/guides/record-handles). ## `createAiColumnDataTransform` `POST /ai/column-data-transform/{entityId}` Create a column data transform config | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | | | `body` | body | yes | | **Returns:** `ColumnDataTransform` · **Cost:** 1 API call. ## `createAiColumnDataValidationResult` `POST /ai/column-data-validation-result` Create a column data validation result | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `ColumnDataValidationResult` · **Cost:** 1 API call. ## `createColumnDataValidation` `POST /ai/column-data-validation` Create a column data validation config | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `ColumnDataValidation` · **Cost:** 1 API call. ## `createValidateCalculationFunction` `POST /validate-calculation-function` Validate a field calculation formula — Validates a field calculation formula against the supplied parameters. Returns a success flag and an error message if validation fails. | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `void` · **Cost:** 1 API call. ## `deleteAiColumnDataTransform` `DELETE /ai/column-data-transform/{entityId}` Delete a column data transform config | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data transform config | **Returns:** `any` · **Cost:** 1 API call. ## `deleteAiColumnDataValidation` `DELETE /ai/column-data-validation/{entityId}` Delete a column data validation config | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation config | **Returns:** `any` · **Cost:** 1 API call. ## `deleteAiColumnDataValidationResult` `DELETE /ai/column-data-validation-result/{entityId}` Delete a column data validation result | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation result config | **Returns:** `any` · **Cost:** 1 API call. ## `executeAiColumnDataValidation` `POST /ai/column-data-validation/{entityId}/execute` Execute a column data validation on demand | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation config | | `body` | body | yes | | **Returns:** `void` · **Cost:** 1 API call. ## `executeColumnDataTransform` `POST /column-data-transform/{entityId}/execute` Execute a column data transform on demand — Applies a saved column data transform rule to a batch of record IDs, rewriting each record's custom field value according to the configured AI prompt. Requires sufficient AI token balance. | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation config | | `body` | body | yes | | **Returns:** `void` · **Cost:** 1 API call. ## `generateCustomField` `POST /ai/generate-custom-field` Generate a value for a custom field using AI — Generates a value for a custom field using AI based on the provided prompt and module context. Requires sufficient AI token balance. | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `any` · **Cost:** 1 API call. ## `generateModules` `POST /ai/generate-custom-modules` Generate module definitions using AI — Generates module definitions using AI from a single prompt. Requires sufficient AI token balance. | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `any` · **Cost:** 1 API call. ## `getAiColumnDataTransform` `GET /ai/column-data-transform/{entityId}` Get a column data transform config | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data transform config | **Returns:** `ColumnDataTransform` · **Cost:** 1 API call. ## `getAiColumnDataValidation` `GET /ai/column-data-validation/{entityId}` Get a column data validation config | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation config | **Returns:** `ColumnDataValidation` · **Cost:** 1 API call. ## `getAiColumnDataValidationResult` `GET /ai/column-data-validation-result/{entityId}` Get a column data validation result | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation result config | **Returns:** `ColumnDataValidationResult` · **Cost:** 1 API call. ## `getFieldGenerate` `GET /field/generate/{fieldId}` Generate a value for a field using AI — Uses AI to generate values for one or more fields on a given entity. entityId may be a single ID or a JSON-encoded array. Requires edit permissions on the entity and sufficient AI token balance. | Parameter | In | Required | Description | |---|---|---|---| | `fieldId` | path | yes | A JSON-encoded list of IDs or a single field ID. | | `entityModule` | query | yes | Module of field value | | `entityId` | query | yes | Id of field value | **Returns:** `void` · **Cost:** 1 API call. ## `listAiColumnDataTransform` `GET /ai/column-data-transform` List column data transform configs | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `listAiColumnDataValidation` `GET /ai/column-data-validation` List column data validation configs | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `listAiColumnDataValidationResults` `GET /ai/column-data-validation-result` List column data validation results | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `previewColumnDataTransform` `POST /column-data-transform/{entityId}/preview` Preview a column data transform without saving — Performs a one-time transformation on a single preview object using a custom prompt, without saving any configuration. Useful for testing prompts before creating a transform rule. | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation config | | `body` | body | yes | | **Returns:** `void` · **Cost:** 1 API call. ## `updateAiColumnDataTransform` `PUT /ai/column-data-transform/{entityId}` Update a column data transform config | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data transform config | | `body` | body | yes | | **Returns:** `ColumnDataTransform` · **Cost:** 1 API call. ## `updateAiColumnDataValidationResult` `PUT /ai/column-data-validation-result/{entityId}` Update a column data validation result | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation result config | | `body` | body | yes | | **Returns:** `ColumnDataValidationResult` · **Cost:** 1 API call. ## `updateColumnDataValidation` `PUT /ai/column-data-validation/{entityId}` Update a column data validation config | Parameter | In | Required | Description | |---|---|---|---| | `entityId` | path | yes | ID of Ai column data validation config | | `body` | body | yes | | **Returns:** `ColumnDataValidation` · **Cost:** 1 API call. --- title: "Authentication" description: "Boost.space Authentication API — 15 operations, model `OAuth2Client`." --- > Auto-generated from the OpenAPI spec. Method names shown are the manifest > (canonical) names; per-language casing is applied by each SDK. **Record handle:** `ref(id)` → a lazy handle to one OAuth2Client (get/update/delete, field values, related records). See [record handles](/sdk/guides/record-handles). ## `authorizeAuthOauth` `GET /auth/oauth/authorize` OAuth2 authorization endpoint — OAuth2 Authorization Endpoint (Authorization Code Flow) | Parameter | In | Required | Description | |---|---|---|---| | `response_type` | query | yes | Must be 'code' for authorization code flow | | `client_id` | query | yes | OAuth2 client ID | | `redirect_uri` | query | yes | Registered redirect URI | | `state` | query | no | Optional state parameter for CSRF protection | | `scope` | query | no | Optional space-separated scopes | **Returns:** `void` · **Cost:** 1 API call. ## `createAuthOauthClient` `POST /auth/oauth/client` Create OAuth2 client — Registers a new OAuth2 client. Requires clientName and redirectUris (HTTPS only, max 5, localhost allowed). Returns auto-generated clientId and clientSecret (secret shown only once). | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `OAuth2Client` · **Cost:** 1 API call. ## `createAuthOauthToken` `POST /auth/oauth/token` OAuth2 token endpoint — Exchanges an authorization code for an access/refresh token pair (grant_type: authorization_code) or refreshes an expired access token (grant_type: refresh_token). Returns access_token, token_type: Bearer, expires_in (seconds), and refresh_token. | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `any` · **Cost:** 1 API call. ## `createUserToken` `POST /auth/{userId}/token` Create an API token — Creates a new private API token for the user with optional per-module CRUD permissions. The token value is returned only once in this response. | Parameter | In | Required | Description | |---|---|---|---| | `userId` | path | yes | ID of user | | `body` | body | yes | Token to be created | | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `Token` · **Cost:** 1 API call. ## `deleteAuthOauthClient` `DELETE /auth/oauth/client/{clientId}` Delete OAuth2 client — Revokes the OAuth2 client and immediately invalidates all tokens issued to it. | Parameter | In | Required | Description | |---|---|---|---| | `clientId` | path | yes | ID of OAuth2 client | **Returns:** `void` · **Cost:** 1 API call. ## `deleteUserToken` `DELETE /auth/{userId}/token/{tokenId}` Delete an API token | Parameter | In | Required | Description | |---|---|---|---| | `userId` | path | yes | ID of user | | `tokenId` | path | yes | ID of token | **Returns:** `any` · **Cost:** 1 API call. ## `getAuthOauthClient` `GET /auth/oauth/client/{clientId}` Get OAuth2 client — Handle OAuth2 client CRUD operations Route: auth/oauth/client[/<subResourceId>] | Parameter | In | Required | Description | |---|---|---|---| | `clientId` | path | yes | ID of OAuth2 client | **Returns:** `OAuth2Client` · **Cost:** 1 API call. ## `getOauthTokenInfo` `GET /auth/oauth/token-info` OAuth2 token info endpoint — Validates an access token and returns its metadata: client_id, scope array, and exp (expiration timestamp). Returns an OAuth error if the token is invalid or expired. | Parameter | In | Required | Description | |---|---|---|---| | `token` | query | yes | Access token | **Returns:** `any` · **Cost:** 1 API call. ## `getUserToken` `GET /auth/{userId}/token/{tokenId}` Get an API token by ID | Parameter | In | Required | Description | |---|---|---|---| | `userId` | path | yes | ID of user | | `tokenId` | path | yes | ID of token | **Returns:** `Token` · **Cost:** 1 API call. ## `listAuthOauthClient` `GET /auth/oauth/client` List OAuth2 clients | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `listUserTokens` `GET /auth/{userId}/token` List API tokens | Parameter | In | Required | Description | |---|---|---|---| | `userId` | path | yes | ID of user | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `renewAuthOauth` `POST /auth/oauth/renew` Renew access token using refresh token — Exchanges a refresh_token for a new access_token and refresh_token pair, invalidating the previous refresh token. | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `any` · **Cost:** 1 API call. ## `revokeAuthOauth` `POST /auth/oauth/revoke` OAuth2 token revocation endpoint — Revokes an access or refresh token. Returns {revoked: boolean} without disclosing whether the token previously existed. | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `any` · **Cost:** 1 API call. ## `updateAuthOauthClient` `PUT /auth/oauth/client/{clientId}` Update OAuth2 client — Updates client name, redirect URIs, or scopes. Include regenerateSecret: true in the request body to rotate the clientSecret. | Parameter | In | Required | Description | |---|---|---|---| | `clientId` | path | yes | ID of OAuth2 client | | `body` | body | yes | | **Returns:** `OAuth2Client` · **Cost:** 1 API call. ## `updateUserToken` `PUT /auth/{userId}/token/{tokenId}` Update an API token | Parameter | In | Required | Description | |---|---|---|---| | `userId` | path | yes | ID of user | | `tokenId` | path | yes | ID of token | | `body` | body | yes | | **Returns:** `any` · **Cost:** 1 API call. --- title: "Categories" description: "Boost.space Categories API — 2 operations, model `Category`." --- > Auto-generated from the OpenAPI spec. Method names shown are the manifest > (canonical) names; per-language casing is applied by each SDK. **Record handle:** `ref(id)` → a lazy handle to one Category (get/update/delete, field values, related records). See [record handles](/sdk/guides/record-handles). ## `get` `GET /category/{id}` Get a category by ID | Parameter | In | Required | Description | |---|---|---|---| | `id` | path | yes | Category ID | **Returns:** `Category` · **Cost:** 1 API call. ## `list` `GET /category` List all categories | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). --- title: "FieldGroups" description: "Boost.space FieldGroups API — 5 operations, model `FieldGroup`." --- > Auto-generated from the OpenAPI spec. Method names shown are the manifest > (canonical) names; per-language casing is applied by each SDK. **Record handle:** `ref(id)` → a lazy handle to one FieldGroup (get/update/delete, field values, related records). See [record handles](/sdk/guides/record-handles). ## `create` `POST /field-group` Create a field group | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `FieldGroup` · **Cost:** 1 API call. ## `delete` `DELETE /field-group/{fieldGroupId}` Delete a field group | Parameter | In | Required | Description | |---|---|---|---| | `fieldGroupId` | path | yes | ID of Element group | **Returns:** `any` · **Cost:** 1 API call. ## `get` `GET /field-group/{fieldGroupId}` Get a field group by ID | Parameter | In | Required | Description | |---|---|---|---| | `fieldGroupId` | path | yes | ID of Element group | **Returns:** `FieldGroup` · **Cost:** 1 API call. ## `list` `GET /field-group` List field groups | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `update` `PUT /field-group/{fieldGroupId}` Update a field group | Parameter | In | Required | Description | |---|---|---|---| | `fieldGroupId` | path | yes | ID of Element group | | `body` | body | yes | | **Returns:** `FieldGroup` · **Cost:** 1 API call. --- title: "Fields" description: "Boost.space Fields API — 13 operations, model `Field`." --- > Auto-generated from the OpenAPI spec. Method names shown are the manifest > (canonical) names; per-language casing is applied by each SDK. ## `bulkUpdateFieldOrder` `PUT /field/order/` Reorder field inputs within a group | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `list` · **Cost:** 1 API call. ## `bulkUpdate` `PUT /field` Bulk update fields | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `void` · **Cost:** 1 API call. ## `create` `POST /field` Create a field | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `void` · **Cost:** 1 API call. ## `delete` `DELETE /field/{fieldId}` Delete a field | Parameter | In | Required | Description | |---|---|---|---| | `fieldId` | path | yes | ID of field | **Returns:** `any` · **Cost:** 1 API call. ## `get` `GET /field/{fieldId}` Get a field definition | Parameter | In | Required | Description | |---|---|---|---| | `fieldId` | path | yes | ID of field | **Returns:** `void` · **Cost:** 1 API call. ## `listFieldGroupInputs` `GET /field-group/{groupId}/input` List fields of a group | Parameter | In | Required | Description | |---|---|---|---| | `groupId` | path | yes | ID of field group | | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `void` · **Cost:** 1 API call. ## `listFieldPositions` `GET /field/position` List field group positions **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `listFieldPositionsDeprecated` `GET /custom-field/position` [Deprecated] Use /field/position — Deprecated alias kept for backward compatibility after the `custom-field` module was renamed to `field`. Responses carry an RFC 9745 `Deprecation` header and a successor `Link` header; migrate to the canonical `GET /field/position`. | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `list` `GET /field` List fields | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `listFieldsBySpace` `GET /field/by-space/{spaceId}` List fields available in the given spaces — Lists field definitions available in the specified spaces. Pass space IDs as a comma-separated spaces query parameter (takes precedence) or as a path parameter. | Parameter | In | Required | Description | |---|---|---|---| | `spaceId` | path | yes | ID of space which fields to get | | `spaces` | query | no | Array of space IDs which fields to get (separated by comma) - if set, takes precedence before spaceId parameter | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `listFieldsBySpaceDeprecated` `GET /custom-field/by-space/{spaceId}` [Deprecated] Use /field/by-space/{spaceId} — Deprecated alias kept for backward compatibility after the `custom-field` module was renamed to `field`. Responses carry an RFC 9745 `Deprecation` header and a successor `Link` header; migrate to the canonical `GET /field/by-space/{spaceId}`. | Parameter | In | Required | Description | |---|---|---|---| | `spaceId` | path | yes | ID of space which fields to get | | `spaces` | query | no | Array of space IDs which fields to get (separated by comma) - if set, takes precedence before spaceId parameter | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `listFieldsOf` `GET /field/of/{module}/{entityId}` List fields defined for a specific entity type | Parameter | In | Required | Description | |---|---|---|---| | `module` | path | yes | Module of which fields to get | | `entityId` | path | yes | Id of entity which fields to get | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `update` `PUT /field/{fieldId}` Update a field | Parameter | In | Required | Description | |---|---|---|---| | `fieldId` | path | yes | ID of field | | `body` | body | yes | | **Returns:** `void` · **Cost:** 1 API call. --- title: "Files" description: "Boost.space Files API — 17 operations, model `File`." --- > Auto-generated from the OpenAPI spec. Method names shown are the manifest > (canonical) names; per-language casing is applied by each SDK. **Record handle:** `ref(id)` → a lazy handle to one File (get/update/delete, field values, related records). See [record handles](/sdk/guides/record-handles). ## `delete` `DELETE /file/{fileId}` Delete an attached file | Parameter | In | Required | Description | |---|---|---|---| | `fileId` | path | yes | ID of file | **Returns:** `any` · **Cost:** 1 API call. ## `deleteRecord` `DELETE /record/{recordId}/file/{fileId}` Delete record's file | Parameter | In | Required | Description | |---|---|---|---| | `recordId` | path | yes | Record ID | | `fileId` | path | yes | ID of file | **Returns:** `any` · **Cost:** 1 API call. ## `deleteSpace` `DELETE /space/{spaceId}/file/{fileId}` Delete an attached file | Parameter | In | Required | Description | |---|---|---|---| | `spaceId` | path | yes | ID of space | | `fileId` | path | yes | ID of file | **Returns:** `any` · **Cost:** 1 API call. ## `download` `GET /file/{fileId}/download` Download a file — Serves the file with an attachment Content-Disposition header and the original filename, triggering a browser download dialog. | Parameter | In | Required | Description | |---|---|---|---| | `fileId` | path | yes | ID of file | | `download` | query | no | Set to true to trigger a browser download dialog | **Returns:** `binary (bytes)` · **Cost:** 1 API call. ## `fileSpace` `GET /space/{spaceId}/file/` List attached files | Parameter | In | Required | Description | |---|---|---|---| | `spaceId` | path | yes | ID of space | | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `get` `GET /file/{fileId}` Get a file record by ID | Parameter | In | Required | Description | |---|---|---|---| | `fileId` | path | yes | ID of file | **Returns:** `File` · **Cost:** 1 API call. ## `getRecord` `GET /record/{recordId}/file/{fileId}` Get record's file | Parameter | In | Required | Description | |---|---|---|---| | `recordId` | path | yes | Record ID | | `fileId` | path | yes | ID of file | **Returns:** `File` · **Cost:** 1 API call. ## `getSpace` `GET /space/{spaceId}/file/{fileId}` Get an attached file | Parameter | In | Required | Description | |---|---|---|---| | `spaceId` | path | yes | ID of space | | `fileId` | path | yes | ID of file | **Returns:** `File` · **Cost:** 1 API call. ## `checkRecordFileUpload` `GET /record/{recordId}/file` Get record's file upload status | Parameter | In | Required | Description | |---|---|---|---| | `recordId` | path | yes | Record ID | | `resumableIdentifier` | query | yes | Reusmable identifier to check if part is uploaded | **Returns:** `any` · **Cost:** 1 API call. ## `checkSpaceFileUpload` `GET /space/{spaceId}/file` Get file upload status | Parameter | In | Required | Description | |---|---|---|---| | `spaceId` | path | yes | ID of space | | `resumableIdentifier` | query | yes | Reusmable identifier to check if part is uploaded | **Returns:** `any` · **Cost:** 1 API call. ## `list` `GET /file/` List file records | Parameter | In | Required | Description | |---|---|---|---| | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `listRecord` `GET /record/{recordId}/file/` List record's connected files | Parameter | In | Required | Description | |---|---|---|---| | `recordId` | path | yes | Record ID | | `filter` | query | no | Filter expression to narrow results. Format: `field operator value`. Multiple conditions are joined with `;` or `&` (AND) or `\|` (OR). Conditions can be grouped with parentheses. Supported operators: `=` (equals; also matches NULL when value is empty), `!=` (not equals), `>`, `>=`, `<`, `<=`, `~` (LIKE, use `%` as wildcard; empty value matches NULL/empty), `!~` (NOT LIKE), `...` (IN set, comma-separated: `statusId...1,2,3`). OR across values for one field: `status=(active\|pending)`. Examples: `filter=name=Acme`, `filter=created>=2024-01-01;assigneeId=`, `filter=name~%smith%;statusId...1,2,3`, `filter=(status=active\|status=pending)&spaceId=5`. | | `offset` | query | no | Zero-based index of the first record to return. Use together with `limit` for pagination. Example: `offset=20&limit=10` returns records 21–30. | | `limit` | query | no | Maximum number of records to return. Use together with `offset` for pagination. | | `order` | query | no | Sort order for results. Comma-separated list of `field;DIRECTION` pairs. Direction is `ASC` or `DESC` (default `DESC` when omitted). Example: `order=name;ASC` or `order=id;ASC,name;DESC`. | **Returns:** `list` · **Cost:** 1 API call per page (lazy paginator). ## `show` `GET /file/{fileId}/show` Stream file inline for browser preview — Streams the file inline for browser preview. Add base64=true to receive the content as a base64-encoded JSON string instead of raw bytes. | Parameter | In | Required | Description | |---|---|---|---| | `fileId` | path | yes | ID of file | | `show` | query | no | Set to true to stream the file inline | | `base64` | query | no | Set to true to receive file content as a base64-encoded JSON string instead of raw bytes | **Returns:** `binary (bytes)` · **Cost:** 1 API call. ## `update` `PUT /file/{fileId}` Update a file record | Parameter | In | Required | Description | |---|---|---|---| | `fileId` | path | yes | ID of file | | `body` | body | yes | | **Returns:** `File` · **Cost:** 1 API call. ## `updateRecordFileWeight` `PUT /record/{recordId}/file-weight` Update record file weight(s) | Parameter | In | Required | Description | |---|---|---|---| | `recordId` | path | yes | ID of record | | `body` | body | yes | | **Returns:** `any` · **Cost:** 1 API call. ## `updateSpace` `PUT /space/{spaceId}/file/{fileId}` Update an attached file | Parameter | In | Required | Description | |---|---|---|---| | `spaceId` | path | yes | ID of space | | `fileId` | path | yes | ID of file | | `body` | body | yes | | **Returns:** `File` · **Cost:** 1 API call. ## `upload` `POST /file` Upload and register a file — Uploads a file from base64-encoded data. Accepts an optional sizes array for thumbnail generation. Validates MIME type and size limits. | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | | **Returns:** `File` · **Cost:** 1 API call. --- title: "Labels" description: "Boost.space Labels API — 16 operations, model `Label`." --- > Auto-generated from the OpenAPI spec. Method names shown are the manifest > (canonical) names; per-language casing is applied by each SDK. **Record handle:** `ref(id)` → a lazy handle to one Label (get/update/delete, field values, related records). See [record handles](/sdk/guides/record-handles). ## `bulkDelete` `DELETE /label` Bulk delete labels | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | Labels - array of IDs to be deleted | **Returns:** `list` · **Cost:** 1 API call. ## `bulkUpdate` `PUT /label` Bulk update labels | Parameter | In | Required | Description | |---|---|---|---| | `body` | body | yes | Label - array of Label records to be updated | **Returns:** `list