# Building Agents Source: https://docs.bondata.ai/guide/agents/building-agents Create Agents with filters, actions, Mentions, and trigger settings This guide covers the full Agent builder - filters, actions, field mapping with Mentions, trigger configuration, and execution modes. ## Key concepts | Concept | Description | | --------------- | --------------------------------------------------------------------------- | | **Integration** | A connected external system (Salesforce, Snowflake, CSV, etc.) | | **Filter** | A condition that selects records (e.g., "Email is empty") | | **Action** | What BonData does for each matching record (create, update, notify, export) | | **Task** | One action for one record. 20 matching records = 20 tasks | | **Bond** | A link between fields in different systems, used for cross-system filters | ## Create an Agent Go to **Agents** in the sidebar, then click **Create New Agent**. Give it a name and optional description. Add filter nodes to specify which records the Agent should act on. **Filter logic:** * **AND** - chain multiple filter nodes sequentially (use **Then +**) * **OR** - add conditions within the same node (use **+ Add condition**) * **Field comparison** - compare fields across systems (e.g., HubSpot "Company Name" ≠ Salesforce "Account Name") Use **Filter Insights** (button on the filter's right side) to see how many records match. Requires saving the Agent first. Available actions: * **Create Record** - in any connected system * **Update Record** - modify fields on matching records * **Slack notification** - post to a channel * **Generate CSV / Google Sheet** - export matching data * **HTTP Request** - call an external API * **Automatic** - tasks execute immediately * **Manual** - tasks queue for individual approval Click **Activate** to start the Agent on your defined schedule. ## Mentions: field mapping between systems **Mentions** let you dynamically reference a field from one system when creating or updating records in another. ### Basic usage 1. In an Action config, click **Mention** 2. Select the source integration and object 3. Choose the field BonData inserts that field's value into the target action for each matching record. **Example:** Importing a CSV into Salesforce - mention the CSV's "Account Name" column in the Salesforce Account "Name" field. Each row creates a new account using that row's values. ### Conditional Mentions Transform values before writing them to the target system. **Example:** A CSV has an "OptedOut" column with values `0`, `1`, or `null`. Salesforce needs "Yes" or "No": * If OptedOut = 1 → "Yes" * Else → "No" ### Default values Set a fallback for when the source field is empty. This prevents blank fields in the target system. ## Trigger settings Access trigger settings from the top-left of the Agent editor. ### Trigger behavior | Mode | Behavior | | -------------------- | --------------------------------------------------------------------------------------- | | **Change** (default) | Tasks only generate for new or changed records that match filters | | **Always** | Every run creates tasks for all matching records, regardless of whether they've changed | With **Always** mode: if 20 accounts match on Monday, a daily alert shows all 20 each day. A new match on Tuesday shows 21 on Tuesday. Use **Change** mode to see only new matches. ### Run frequency * Default: every 15 minutes (when Agent is set to automatic) * Customizable to any interval, including cron expressions * All times are in **UTC** ## Save, Test, Run * **Save** - persist your configuration * **Test** - simulate the Agent without triggering real actions * **Run** - activate the Agent on your schedule New Agents may need a brief loading period before first execution. BonData must fetch both metadata and data for the entities involved. Check [Monitoring & Troubleshooting](/guide/agents/monitoring-troubleshooting) for details. ## FAQ Yes. Each matching record can trigger multiple tasks (e.g., update a record AND send a Slack notification). Yes. Filters and Mentions can reference any connected system. Check the Task logs for affected records, then revert changes in the source system. BonData doesn't store your full dataset. ## Node reference For a detailed guide to every node type - including Data Normalization, Find Duplicates, AI Enrichment, Web Search, and more - see the [Nodes Overview](/guide/nodes/overview) reference. ## Best practices * **Start simple** - one filter, one action, one field at a time * **Use Test mode** - validate before activating * **Review periodically** - data fields and business rules change * **Watch task volumes** - unexpected spikes may indicate overly broad filters # Failure Alerts Source: https://docs.bondata.ai/guide/agents/failure-alerts Get notified when an Agent node fails Failure alerts automatically notify you when an Agent node encounters an error. Each alert includes the failed Agent, relevant record IDs, success/failure counts, and diagnostic details. ## Set up a failure alert Go to **Agents** and click on the Agent you want to monitor. Hover over the node you want alerts for and click the **shield icon**. When the shield is enabled, an **Error Route** appears on the node. Click **+** on the Error Route and select an alert action (e.g., Slack Message). Configure the Slack Message node as you normally would. Two dynamic fields are available: | Field | Content | | ---------------- | ------------------------------------------------------- | | **Node Summary** | High-level overview of the failure | | **Task Results** | Detailed execution data (error messages, response info) | Drag mentions from Node Summary or Task Results into your message, just like any other mention. Save the Agent and activate it to apply the alert configuration. ## Viewing alerts Once configured: 1. **Task List** - hover over the task list (top right) to see tasks generated by the Agent, including alert messages 2. **Task Details** - click any task to expand the full detail view 3. **Slack** - view the alert directly in your configured channel ## Example An Agent creates Salesforce contacts. One node maps the **Full Name** field - but Salesforce requires **First Name** and **Last Name** separately. The record creation is rejected. With a failure alert configured, a Slack message fires immediately with the error details, so you can fix the field mapping. Use **Node Summary** for quick alerts and **Task Results** when you need full error details for debugging. # Introduction to Agents Source: https://docs.bondata.ai/guide/agents/introduction Automate workflows across your connected systems Agents are automated workflows that monitor your data, evaluate conditions, and take action across connected systems. They replace manual data tasks with reliable, repeatable automation. ## What Agents do * **Automate repetitive work** - data updates, exports, notifications * **Maintain data quality** - find and fix inconsistencies across systems * **Migrate data** - move records between systems without storing them in BonData * **Send alerts** - notify teams about critical changes or required actions ## Agent types ### Automation Agents Monitor data changes and trigger actions in real time. **Examples:** Notify accounting about overdue invoices. Prioritize support tickets from low-NPS accounts. Escalate cases that exceed SLA. ### Migration Agents Move data between systems with field mapping. **Examples:** Import Salesforce accounts from a CSV. Migrate closed HubSpot deals to Salesforce. Sync CRM data with your warehouse. ### Data Quality Agents Identify and resolve data inconsistencies. **Examples:** Find contacts without email addresses. Detect mismatched records across CRMs. Track data completeness thresholds. ## How it works Select a data source and entity to monitor. Define conditions that identify records needing action. If your filter references a different integration than your data source, a Bond node appears automatically to link the systems. Choose what happens when conditions are met - create records, update fields, send notifications, or generate exports. * **Save** - persist your changes * **Test** - simulate the Agent without triggering live actions * **Run** - activate the Agent on your chosen schedule ## Next steps Detailed guide to filters, Mentions, trigger settings, and execution modes. Ready-made Agent templates across finance, CRM, support, and more. # Monitoring & Troubleshooting Source: https://docs.bondata.ai/guide/agents/monitoring-troubleshooting Track Agent execution, manage tasks, and resolve issues ## Agent Dashboard Access the dashboard via the **three-dots menu** next to the Activate button, then select **Agent Dashboard**. ### Key metrics | Metric | Description | | -------------------- | ---------------------------------- | | **Agent Schedule** | Scheduled time and next run | | **Executions** | Total number of runs | | **Average Duration** | Mean runtime across all executions | | **Total Tasks** | Cumulative tasks generated | Select individual runs to review results, or click **View Results** for a detailed breakdown. ## Report The Report page shows execution-level data: | Field | Description | | ------------------------- | --------------------------- | | **Run At / Completed At** | Start and finish timestamps | | **Run By** | Who triggered the run | | **Status** | Success or failure | | **Number of Results** | Records matching filters | ## Tasks Each matched record generates a separate task. Monitor: * **Status** - Success, Failed, or Pending * **Error messages** - permission issues, invalid data, field mismatches ## Data load status Before an Agent can run, both metadata and data must be loaded for the relevant entities. ### Verify load status 1. Go to **Integrations** and find the relevant entity 2. Check that **Data Status** shows **Done** 3. Check that **MetaData Status** shows **Done** ### Trigger a manual reload If data has changed significantly: 1. Click the **three-dots menu** next to the Test button 2. Select **Load Metadata** - wait for completion 3. Select **Load Data** to fetch recent updates ## Troubleshooting | Problem | Solution | | ------------------------------ | ------------------------------------------------------------ | | Too many tasks generated | Narrow your filter conditions | | Tasks failing with data errors | Check field mapping, data types, and integration permissions | | Agent not running | Verify data/metadata load status is "Done" | | Unexpected task volume spike | Review filter logic for overly broad conditions | # Sample Use Cases Source: https://docs.bondata.ai/guide/agents/sample-use-cases Ready-made Agent templates for common workflows Use these as starting points for your own Agents. Each includes conditions, actions, and the systems involved. *** ## Finance ### Overdue invoice alerts Track overdue invoices and notify the right teams. **Conditions:** Billing System > Invoice: Status = Overdue **Actions:** * **Salesforce > Update Record** - set `Invoice_Status__c = Overdue` on the related Account * **Slack > Send Message** - post to #accounting: "Invoice \[Number] for \[Account Name] is overdue" *** ## CRM ### CSV to Salesforce import Create Salesforce accounts from a CSV upload. **Conditions:** CSV > Row: New\_Account = Yes **Actions:** * **Salesforce > Create Account** - map Account Name, Industry from CSV columns. Use a conditional Mention to transform OptOut values (`0→No`, `1→Yes`, `null→No`) ### HubSpot to Salesforce migration Create Salesforce opportunities from closed HubSpot deals. **Conditions:** HubSpot > Deal: Stage = Closed Won **Actions:** * **Salesforce > Create Opportunity** - map Deal Name → Opportunity Name, Close Date, Amount. Set fallback values for empty fields *** ## Data quality ### Missing email detection Find contacts without email addresses and notify their owners. **Conditions:** CRM > Contact: Email = not set **Actions:** * **Slack > Send Message** - "Contact \[Full Name] has no email. Owner: \[Owner Email]" * **Generate CSV** - export Contact Name, Owner, Last Activity Date for bulk review *** ## Customer health ### Low NPS ticket prioritization Alert when low-NPS accounts have open support tickets. **Conditions:** * Salesforce > Account: NPS\_\_c \< 50 * Salesforce > Case: Status = Open **Actions:** * **Slack > Send Message** - "Account \[Account Name] (NPS: \[Score]) has open case \[Case Number]" * **Generate CSV** (optional) - weekly summary of all low-NPS accounts with open cases ### High-touch account ticket overload Flag when high-touch customers have too many open tickets. **Conditions:** * Salesforce > Account: AccountType\_\_c = High Touch * Intercom > Ticket: Status = Open * Count(Open Tickets) > 5 **Actions:** * **Salesforce > Update Record** - set `Open_High_Priority_Tickets__c` to the count of open tickets *** ## Bug tracking ### Bug resolved - ready for QA Notify QA when a Jira bug is marked resolved. **Conditions:** Jira > Issue: Type = Bug, Status changed = Resolved **Actions:** * **Slack > Send Message** - "Bug \[Issue Key] resolved. Ready for QA. Assigned: \[Assignee]" ### Critical SLA breach Escalate when critical tickets exceed SLA. **Conditions:** Salesforce > Case: Priority = Critical, Status = Open, CreatedDate > 1 day ago **Actions:** * **Slack > Send Message** - "Case \[Case Number] open >1 day. Customer: \[Account Name]" * **Salesforce > Create Record** - Escalation record assigned to the escalation team *** ## Sales ### Upsell opportunity detection Identify satisfied, high-usage accounts without existing opportunities. **Conditions:** * Salesforce > Account: Customer\_Satisfaction\_\_c >= 80 * Salesforce > Account: UsageScore\_\_c >= 75 * Salesforce > Account: Is\_Existing\_Opportunity\_\_c = False **Actions:** * **Salesforce > Create Opportunity** - "\[Account Name] Upsell", Stage: Prospecting, Close Date: Today + 30 days * **Slack > Send Message** - "Upsell opportunity created for \[Account Name]. Satisfaction: \[Score], Usage: \[Score]" # Understanding Bonds Source: https://docs.bondata.ai/guide/bonds/understanding-bonds How BonData connects data across your systems Bonds define how data in one system relates to data in another - matching and linking records that describe the same customer, product, or supplier. This is entity resolution, the core of master data management, and it's the foundation for a single trusted view and every cross-system workflow in BonData. ## Bonds vs. Suggested Bonds | | Description | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | **Bonds** | Confirmed connections between systems. Specify which fields are linked and how records match. | | **Suggested Bonds** | AI-generated recommendations. BonData analyzes metadata and hashed data to find potential relationships, each with a confidence score. | ## The Bonds page Navigate to **Bonds** in the sidebar to manage all your data relationships. ### Active tab Shows all confirmed bonds with: * Source and target integrations and fields * The **Default** field used for matching * **Bond Type** - probability-based or compounded ### Suggested tab Shows AI-discovered connections with: * **Matching Values** - confidence score * **Actions** - approve or reject via the three-dots menu ## Create a Bond manually You can define custom relationships between any two systems. On the Bonds page, click **Add Bond** (top right). Pick two systems, then choose which fields to link. Add multiple field pairs for complex matching (e.g., match only when both First Name and Last Name align). Choose **exact match** or **partial match**. For partial matches, set a confidence threshold (e.g., 90–100%) to handle typos and minor differences. Manual bonds work exactly like confirmed bonds - they appear in the Active tab and are available for use in Agents. ## Data Map The Data Map (**Data > Data Map**) provides a visual representation of all your bonds. Click any entity to open a drawer with its active and suggested bonds. You can approve suggestions directly from here. ## Filtering Use the search and filter panel on the left to narrow down by system, entity, or bond type. ## Data security BonData does not store raw data - only metadata, connection details, and hashed values. Data is accessed only when executing Agents. The platform is GDPR and SOC II compliant. # AI Chat Source: https://docs.bondata.ai/guide/chat/ai-chat Your AI-powered data assistant - analyze, fix, and automate directly from a conversation BonData's AI Chat is a conversational interface that connects directly to your data. Ask questions, run analyses, fix data quality issues, build pipelines, and more - all through natural language. Click **Chat** in the sidebar to get started. Type your question in the input field, or use one of the quick action buttons. Use **@** to mention specific Agents or integrations for context. ## What Chat can do Chat is not just a Q\&A tool - it's a full data assistant that can take action across your connected systems. | Capability | Example | | ------------------------ | ----------------------------------------------------------------- | | **Analyze data** | "Show me the data distribution across my integrations" | | **Find duplicates** | "Can you share a list of duplications in my Salesforce contacts?" | | **Fix data quality** | "Find and fix missing email fields in my CRM" | | **Build pipelines** | "Create an Agent that syncs new Salesforce leads to Snowflake" | | **Run analytics** | "What's my total revenue by region this quarter?" | | **Generate charts** | "Visualize data volume by table" | | **Explain workflows** | "What does my lead routing Agent do?" | | **Suggest improvements** | "How can I improve my data quality across systems?" | Quick action buttons help you get started: * **Add a new trigger to this workflow** - modify an existing Agent * **Explain what this workflow does** - get a plain-language breakdown of an Agent * **Find data quality issues** - scan your data for problems * **Suggest improvements** - get recommendations based on your setup ## Chat modes Switch between two modes using the selector at the bottom of the chat input. | Mode | Purpose | | ----------- | ----------------------------------------------------------------------------- | | **Agent** | Takes action - builds Agents, fixes data, creates records, modifies workflows | | **Analyst** | Read-only analysis - queries data, generates charts, summarizes findings | Use **Analyst** mode when you want to explore your data safely without making changes. Switch to **Agent** mode when you're ready to act on the results. ## Conversation history All conversations are saved in the left panel. Click any previous chat to pick up where you left off. Chat retains full context - including charts, summaries, and action results. Chat works best when your integrations and entities are set up. The more data sources you connect, the more Chat can do for you. # Dashboards Source: https://docs.bondata.ai/guide/dashboards/dashboards Group charts onto a single page, each one running its own query A dashboard is a set of charts arranged on a grid. Each chart holds its own SQL query and runs it when the dashboard opens, so the numbers reflect whatever your integrations hold at that moment. Nothing is stored as a snapshot. Dashboards belong to a project. Click **Dashboards** in the sidebar to see the ones in the project you're working in. ## Create a dashboard Click **New Dashboard** and give it a name. The description is optional and appears under the title. You can also describe one in **Chat**. Switch to **Analyst** mode and say what you want to see — for example, *"a revenue dashboard with monthly trend, top products, and a breakdown by region"*. BonData writes the queries, picks chart types, runs each query to check it returns rows, and saves the dashboard. Anything it produces can be edited afterwards. ## Add a chart Click **Add Widget** to open the chart editor. 1. Write a query and click **Run**. Reference your data as `"Integration".Entity` — for example `"Demo Shop".orders`. The columns it returns are listed under **Result Columns**. 2. Choose a chart type. 3. Drag columns from **Result Columns** into the chart's slots. A pie takes a **Category** and a **Value**; a bar takes an **X-Axis** and a **Y-Axis**. 4. Set the value format: currency, percentage or number, decimal places, and compact notation (1.2K / 1.2M). The preview updates as you go. To change a chart without writing SQL, use **Edit with AI** and describe the change. ## Chart types | Type | Use it for | | --------------------- | --------------------------------------------------------------------------- | | **KPI** | A single number, optionally with a trend arrow or sparkline | | **Trend** | A measure over time | | **Bar** | Comparing categories, vertical or horizontal | | **Combo** | Two measures on shared axes, such as orders as bars and customers as a line | | **Pie** | Share of a total, as a pie or donut | | **Funnel** | Drop-off through sequential stages | | **Gauge** | One value against a range | | **Table** | Sortable rows with per-column formatting | | **Pivot** | One dimension cross-tabulated against another | | **Scatter** | Relationship between two measures | | **Heatmap** | Density across two dimensions | | **Treemap** | Nested proportions | | **Histogram** | Distribution of one measure | | **Radar** | Several measures compared on one shape | | **Text**, **Divider** | Headings and separators | ### Turn a KPI into a trend tile Return one row per period — a month column and a value column — and drag the date column into the KPI's **X-Axis** slot. The tile then shows the latest period's value, a sparkline of the series, and the change against either the first period or the previous one. Give the tile some extra height so the sparkline has room. ## Move and resize charts Drag a chart by its header to move it. Drag its bottom-right corner to resize it. The grid is 12 columns wide, and the layout saves as you go. Layout is saved per dashboard, not per person. Rearranging affects everyone who opens it. ## Dashboard filters Dashboard filters sit above the charts and apply to every chart whose query uses them, so one control moves the whole page. A date range, a region, or a customer segment are typical. Click **Add filter** and describe what you want to filter by. BonData creates the filter and adds it to the relevant queries. Once a dashboard has at least one filter, the button becomes **Manage filters**, where you can rename them, reorder them, and set defaults. A filter only affects charts whose query references it. If a chart doesn't move when you change a filter, that chart isn't wired to it — ask AI to add it. ## Chart filters Individual charts have their own **Filter** button. Pick from the values already present in that chart, or drag across a time axis to narrow to a range. Chart filters aren't saved and apply only to the chart you're looking at. Use them to inspect something; use a dashboard filter when you want it to persist. ## Chart actions Hover a chart and open the **⋮** menu. | Action | Result | | ---------------- | --------------------------------------------- | | **Edit** | Opens the chart editor | | **Edit with AI** | Describe the change in plain language | | **Expand** | Full-screen view | | **Duplicate** | Copies the chart onto the same dashboard | | **Refresh** | Re-runs the query, ignoring any cached result | | **Download CSV** | Exports the rows behind the chart | | **Delete** | Removes the chart | The **``** button beside the menu shows the chart's query and lets you edit it directly. ## Export a dashboard **Download PDF** captures the dashboard as it appears on screen, including charts below the fold. **Ask AI** opens Chat beside the dashboard, so you can ask about what you're looking at or change charts and watch them re-render. The **⋯** menu holds **Manage Filters**, **Duplicate Dashboard**, and **Delete Dashboard**. ## Further reading * [AI Chat](/guide/chat/ai-chat) — building and editing dashboards from a conversation * [Connecting your integrations](/guide/getting-started/connecting-integrations) — the sources charts query * [Bondata Cloud](/guide/data-warehouse/bondata-cloud) — where queried data is stored # Bondata Cloud Source: https://docs.bondata.ai/guide/data-warehouse/bondata-cloud Query and explore your integration data in BonData's built-in data warehouse Every integration you connect to BonData automatically syncs its data into a structured data warehouse. **Bondata Cloud** is the built-in warehouse that comes with your account - no setup required. You can browse all synced entities, see how data is organized into RAW and SILVER layers, and run SQL queries directly from the platform. ## How data flows into the warehouse When you connect an integration and activate entities, BonData creates two layers of tables for each entity: | Layer | Purpose | Naming pattern | | ---------- | -------------------------------------------------------------- | ---------------------------------------------------- | | **RAW** | Unprocessed data exactly as it comes from the source | `raw_{app}_{integration_id}_{entity}` | | **SILVER** | Cleaned, validated, and schema-aligned version of the RAW data | `silver_{app}_{integration_id}_{entity_id}_{entity}` | RAW tables are created automatically when data is first fetched. SILVER tables are generated shortly after by a background refinement process that validates types, resolves enums, and computes primary keys. All tables are stored in a tenant-specific schema (e.g., `BONDATA_YourCompany`), keeping your data isolated from other accounts. ## Entities tab Go to **Data > Data Warehouse** in the sidebar, then select your warehouse. The **Entities** tab shows every integration and its entities, along with the corresponding RAW and SILVER table names. Use this view to: * See which entities have been synced and are queryable * Verify that both RAW and SILVER tables exist for an entity * Check object counts per table * Quickly find the exact table name you need for a SQL query ## SQL Editor Switch to the **SQL Editor** tab to query your warehouse data directly. The editor includes a table browser, syntax highlighting, autocomplete, and a results panel. ### Writing queries * Write standard SQL `SELECT` statements in the editor * Press **Cmd/Ctrl + Enter** to execute * Click any table name in the left sidebar to auto-generate a `SELECT * FROM "table" LIMIT 100` query * Results display up to 1,000 rows - a warning appears if results are truncated ### Table browser The left panel lists all available tables grouped by type (RAW and SILVER). Use the search bar to filter by name. Click a table to preview its data instantly. ### Export results Download query results as a CSV file using the export button in the results panel. The SQL Editor is read-only - you can query data but not modify it. This keeps your source data safe while giving you full flexibility to explore. ## Choosing a warehouse for an integration By default, integration data is stored in Bondata Cloud. If your organization has connected external warehouses (PostgreSQL or Snowflake), you can choose where each integration's data is stored. During integration setup, expand the **Advanced** section at the bottom of the configuration dialog. Under **Data Warehouse**, select the target warehouse from the dropdown. The warehouse selection applies to all entities within that integration. Choose the warehouse before activating entities - changing it later requires re-syncing. ## Supported warehouses In addition to the built-in Bondata Cloud, you can connect your own data warehouse as a storage target. ### Available now | Warehouse | Auth methods | | -------------- | -------------------------------------------- | | **PostgreSQL** | Basic (host, port, database, user, password) | | **Snowflake** | Basic, Key Pair, OAuth2, Token | ### Coming soon | Warehouse | Status | | --------------------------- | -------------- | | **BigQuery** | In development | | **Databricks** | In development | | **Azure Synapse Analytics** | In development | To add a warehouse connection, go to **Data > Data Warehouse** and click **Add Warehouse**. Once active, it will appear as an option when configuring integrations. ## What's next Add a data source and start syncing entities. Control which datasets are active in your warehouse. # Step 2: Connecting Your Integrations Source: https://docs.bondata.ai/guide/getting-started/connecting-integrations Add data sources to BonData and configure entities BonData connects to 100+ systems - CRMs, databases, warehouses, project management tools, support platforms, spreadsheets, and more. No custom integration code required. ## Connect a data source Go to **Data > Integrations** in the sidebar. Under **Add Data Source**, find and click the integration you want. Use the search bar to filter. Follow the on-screen instructions. Most integrations support **OAuth** or **API key** authentication. Use credentials with the right level of access: * **Read-only** - sufficient for monitoring and reporting * **Read/write** - required if you plan to create or update records via Agents Expand the **Advanced** section at the bottom of the configuration dialog. Under **Data Warehouse**, select where this integration's data should be stored. By default, data goes to **Bondata Cloud** - the built-in warehouse included with your account. If your organization has connected external warehouses (PostgreSQL or Snowflake), they'll appear here as well. You can connect the same system multiple times - for example, separate Salesforce sandbox and production environments, or multiple Snowflake connections with different permissions. ## Add entities An **entity** is a table, object, or dataset within your connected system (e.g., a Salesforce object, a database table, or a CSV file). ### SaaS integrations For systems like Salesforce, standard objects are included automatically. To add custom objects: 1. Click **New** at the top of the entity list 2. Search for the object name 3. Click **Add** ### Databases, sheets, and CSVs Click **New** to browse tables, upload CSV files, or provide a Google Sheets / SharePoint link. Each entity needs a **primary key**. BonData auto-detects fields that are both present in all rows and unique. You can also combine multiple fields into a composite key (e.g., First Name + Last Name + Company). ## What's next See how BonData discovers connections between your systems. # Step 4: Setting Up Your First Agent Source: https://docs.bondata.ai/guide/getting-started/first-agent Build your first automated workflow in BonData Agents are automated workflows that act on data across your connected systems. Each Agent defines **conditions** (when to act) and **actions** (what to do). ## Agent types | Type | Purpose | | -------------- | --------------------------------------------------------------------------------------------- | | **Automation** | Trigger actions based on data conditions (missing fields, threshold breaches, status changes) | | **Migration** | Move data between systems with field mapping, without storing it in BonData | ## Build your first Agent Go to **Agents** in the sidebar and click **Create New**. Give it a clear name (e.g., "Accounts Missing Owner") and an optional description. Click **+** to add your first node - always a **Get Data** node. Select the integration, entity, and fields to monitor. Click **+ > Flow Basics** and select **Simple Filter**. Set the entity, field, operator, and value. **Filter logic:** * **AND** - Add another Simple Filter from the **Then +** option * **OR** - Add a condition to the existing node from **+ Add condition** Choose what happens when conditions match: Available actions: * Create or update records * Send Slack or email alerts * Generate a CSV * Send an HTTP request Use **Mentions** to dynamically insert values from one system into another. Click the mention button and select the source field. You can also use: * **Conditional Mentions** - Apply transformations (e.g., if value is 1 → "Yes", else → "No") * **Default values** - Fallback when the source field is empty * **Automatic** - tasks run immediately * **Manual** - tasks queue for your approval ## Test before going live Click **Test** (top right) to simulate the Agent without performing any actions. Task previews appear in the right panel. ## Activate your Agent * **Run once** - executes a single time * **Schedule** - runs on a recurring frequency (e.g., every 15 minutes, or a custom cron expression) * **Off (default)** - won't create duplicate tasks for the same matched record * **On** - creates new tasks every run regardless Click **Apply** to start the Agent. ## Monitor your Agent * **Task list** - right panel shows upcoming and completed tasks * **Agent Dashboard** - access via the three-dots menu next to Activate Track task statuses (Running, Pending, Failed, Success), view results for individual nodes, and drill into specific task outputs. ## Learn more Deep dive into filters, Mentions, and trigger settings. Real-world Agent templates for common workflows. # Step 1: Logging In Source: https://docs.bondata.ai/guide/getting-started/logging-in Sign in to BonData to start connecting your systems ## Sign in 1. Go to [app.bondata.ai](https://app.bondata.ai/) 2. Sign in with your **Google** or **Microsoft** account That's it. Once authenticated, you'll land on the BonData dashboard. If your organization uses SSO, check with your IT admin for the correct sign-in method. ## What's next Add your first data source and start unifying your data. # Step 3: Review and Confirm Bonds Source: https://docs.bondata.ai/guide/getting-started/review-bonds Review the connections BonData discovers between your systems After setup completes, BonData generates a virtual map of your systems and their connections. You can find it under **Data > Data Map** in the sidebar. ## The Data Map The map shows all systems and their relationships - including connections that don't exist as direct integrations. BonData's AI analyzes metadata and hashed data to surface relationships you may not have known about. ## Review suggested Bonds Toggle **Show Suggestions** on the map, or go to the **Suggested Bonds** section directly. These are connections BonData has identified based on how your data and metadata align across systems. Each suggestion has a **probability score** - BonData's confidence that the connection is accurate. Use these scores to decide: * **Confirm** - the connection is valid * **Reject** - the connection doesn't apply ## Filter and navigate Use the search and filter panel on the left to focus on specific systems or entities. Clicking an entity on the map opens a drawer with its **Active Bonds** (confirmed) and **Suggested Bonds** (pending review). ## Data security BonData does not store your raw data. It only keeps metadata, connection details, and hashed values. Data is accessed only when needed to run an Agent. The platform is GDPR and SOC II compliant. ## What's next Create an automated workflow across your connected systems. # Welcome to BonData Source: https://docs.bondata.ai/guide/getting-started/welcome The next-generation master data platform - connect your systems, let AI resolve and unify your records, and keep one trusted view of your data without moving it BonData is a next-generation master data management (MDM) platform. It connects your business systems, uses AI to resolve and unify records into a single trusted view of every customer, product, and supplier, and continuously stewards that data - all without copying it into a central hub or writing code. Connect any data source, let AI match and unify records across systems, and deploy Agents that keep your master data clean and consistent - in days, not the months a legacy MDM program takes. ## Core Concepts BonData is built around three foundational ideas: Connect any data source - CRMs, databases, warehouses, support tools, spreadsheets, cloud storage, and more. BonData supports **100+ integrations** out of the box, with no engineering required. Your data stays where it is. BonData never moves or stores your raw data. BonData's AI matches and virtually links records across systems - the entity resolution at the heart of MDM - assigning a confidence score to every connection instead of relying on brittle, hand-written match rules. These connections - called **Bonds** - unify your records into a trusted view and are the foundation for everything you build in BonData. Build **Agents** - automated workflows that steward your master data: deduplicate, fill in missing fields, enrich records, sync changes, and send alerts across all your connected systems. Use the visual workflow builder to go from idea to automation without writing code. ## What you can do Match and link records across systems into one trusted view of each customer, product, and supplier. Find and fix duplicates, missing fields, and mismatched records - automatically. Use LLMs from OpenAI, Anthropic, Gemini, and others to classify, normalize, and enrich your data at scale. Move records between systems with field mapping and full control over what gets synced. Explore all your synced data in BonData Cloud with the built-in SQL editor. Ask questions, run analyses, and build workflows - all through a natural language AI assistant. ## Security and compliance BonData does not store your raw data - only metadata, connection details, and hashed values. Data is accessed only when executing Agents. Audited controls for security, availability, and confidentiality. Full compliance with European data protection regulations. Certified information security management. ## Get started Sign in with your Google or Microsoft account to get started. Add a data source and start unifying your data. Learn how BonData discovers and manages relationships across your systems. Create an automated workflow in minutes using the visual builder. # Managing Integration Entities Source: https://docs.bondata.ai/guide/integrations/managing-entities Control which data from your connected systems is available in BonData An **entity** is any distinct dataset within a connected system - a Salesforce object, a database table, a CSV file, or a Google Sheet. Managing entities lets you control exactly which data BonData works with. ## View your entities 1. Go to **Data > Integrations** in the sidebar 2. Click on any connected integration 3. The left panel lists all active entities ## Add entities ### SaaS integrations Standard objects (e.g., Salesforce Accounts, Contacts) are included by default. To add custom objects: 1. Click **New** at the top of the entity list 2. Search for the object 3. Click **Add** ### Databases, CSVs, and sheets Each entity requires a **primary key**. BonData auto-detects fields that are both available across all rows and unique. You can combine multiple fields into a composite key (e.g., First Name + Last Name + Company). ## Activation time After adding an entity, BonData fetches its metadata. This typically completes within **15 minutes**, after which the entity is fully available for use in Bonds and Agents. ## Best practices * **Review periodically** - Remove entities you no longer need to keep things clean * **Be selective** - Only add entities relevant to your workflows * **Check permissions** - Ensure your integration credentials have access to the entities you're adding # Create Record Source: https://docs.bondata.ai/guide/nodes/actions/create-record-node Create new records in a connected external system Creates new records in a connected integration. Use it to push data from your workflow into external systems - for example, creating Salesforce Accounts from a CSV import, or generating Linear issues from flagged records. ## Configuration | Setting | Description | | --------------- | -------------------------------------------------------------------------- | | **Integration** | The target system to create records in (e.g., Salesforce, HubSpot, Linear) | | **Entity** | The entity type to create (e.g., Account, Contact, Issue) | | **Title** | A human-readable description of the action (shown in task logs) | | **Fields** | Map target fields to values using **Mentions** to reference upstream data | ## How It Works Choose which integration and entity to create records in. Define field mappings - for each target field, use **Mentions** to set the value from upstream data. Records are created automatically or queued for manual approval, depending on the Agent's execution mode. ## Output Each created record generates one task in the Agent's task log. By default, all matching records are batched into a single create action. To create one record per input row, add a [Group By](/guide/nodes/transform/group-by-node) node before this node, grouped by the primary key field. ## Example Import CSV contacts into Salesforce: 1. Use **Get Data** to load a CSV file 2. Add a **Create Record** node targeting Salesforce Contact 3. Map fields: `FirstName` → CSV.First Name, `LastName` → CSV.Last Name, `Email` → CSV.Email ## Best Practices * Use a **Group By** node before this action to create one record per input row * Start with manual approval to verify records are created correctly * Use clear **Title** descriptions so task logs are easy to scan ## Related Nodes * **[Update Record](/guide/nodes/actions/update-record-node)** - modifies existing records instead of creating new ones * **[Group By](/guide/nodes/transform/group-by-node)** - controls batching so each input row creates a separate record # Export to CSV Source: https://docs.bondata.ai/guide/nodes/actions/export-csv-node Export workflow data to a CSV file or Google Sheet Exports data from your workflow to a CSV file. Optionally send it to a connected integration (email, Slack, Google Sheets) or use it as input for an Upload File node. ## Configuration | Setting | Description | | ----------------- | ---------------------------------------------------------------------------------------------------------------------- | | **Title** | Name for the export | | **Fields** | Columns to include - each with a **value** (field expression or Mention) and **column name** (display name in the CSV) | | **Order by** | Optional field to sort rows by | | **Reverse order** | Sort descending if enabled | | **Platform** | Optional integration to send the CSV to (e.g., Slack, email) | | **Recipient** | Recipients for the delivery (email addresses, Slack channels) | | **Message** | Optional message to include with the delivery | ### Grouping Options | Setting | Description | | ------------------------------- | ----------------------------------------------------------------- | | **Group by entity / field** | Generate separate CSV files per group (e.g., one file per region) | | **Row group by entity / field** | Aggregate rows within each group | ## How It Works Use **+ Add Column** to add fields. For each column, set the source value (using **Mentions**) and the display name. Select a field to sort by and choose ascending or descending order. Select a platform and recipients to automatically deliver the CSV, or leave blank to use the file in downstream nodes. ## Output Produces a CSV file that can be: * Delivered to recipients via the configured platform * Passed to a downstream [Upload File](/guide/nodes/actions/upload-file-node) node for cloud storage * Downloaded from the Agent's task log ## Example Generate a weekly account summary CSV: 1. Get Data from Salesforce Accounts 2. Add an Export to CSV node 3. Add columns: Account Name, Industry, Revenue, Last Activity Date 4. Sort by Revenue (descending) 5. Deliver via Slack to `#weekly-reports` ## Best Practices * Use **Group by** to generate separate files when data should be split (e.g., one file per sales rep) * Name columns clearly - these are the headers your recipients will see * Sort by the most important field for quick scanning ## Related Nodes * **[Private Export](/guide/nodes/actions/private-export-node)** - exports to BonData's internal storage for download * **[Upload File](/guide/nodes/actions/upload-file-node)** - upload the generated CSV to S3 or other cloud storage # HTTP Request Source: https://docs.bondata.ai/guide/nodes/actions/http-request-node Call an external API or webhook with custom HTTP requests Sends custom HTTP requests to external APIs or webhooks. Use it to integrate with third-party services, trigger external workflows, or push data to systems without a dedicated BonData integration. ## Configuration | Setting | Description | | ----------- | ----------------------------------------------------------------------------------------------------------------- | | **URL** | Target URL - supports **Mentions** for dynamic values (e.g., `https://api.example.com/{{Salesforce.Account.Id}}`) | | **Method** | HTTP method: **POST** (default), GET, PUT, DELETE, or PATCH | | **Body** | Request body as key-value pairs, sent as JSON - values support **Mentions** | | **Headers** | Custom HTTP headers (e.g., Authorization, Content-Type) | | **Title** | A human-readable description of the action | ## How It Works Enter the target endpoint. Use **Mentions** to include record values in the URL. Select the appropriate method for your API (POST for creating, PUT for updating, etc.). Add key-value pairs for the request body and any required headers (e.g., API keys). ## Output The HTTP request is sent when the Agent runs. The response is logged in the task log. By default, all matching records are batched into a single request. To send one request per record, add a [Group By](/guide/nodes/transform/group-by-node) node before this node, grouped by the primary key field. ## Example Trigger a webhook when new leads are created: 1. Filter for new leads 2. Add an HTTP Request node 3. URL: `https://hooks.example.com/new-lead` 4. Method: POST 5. Body: `name` → `{{Salesforce.Lead.Name}}`, `email` → `{{Salesforce.Lead.Email}}` ## Best Practices * Use **Group By** before this node for per-record requests * Store API keys in headers rather than in the URL * Test with a single record before enabling automatic execution * Use POST for creating resources, PUT/PATCH for updating, DELETE for removing ## Related Nodes * **[Web Search](/guide/nodes/enrichment/web-search-node)** - searches the web rather than calling a specific API * **[Create Record](/guide/nodes/actions/create-record-node)** - creates records using a native integration (no custom HTTP needed) # Private Export Source: https://docs.bondata.ai/guide/nodes/actions/private-export-node Export matching records to a downloadable file in your private storage Exports matching records to a downloadable file in your private storage. Useful for generating reports, sharing data snapshots, or archiving results. ## Configuration | Setting | Description | | ---------------------------- | ---------------------------------------------------------------------------------- | | **Make publicly accessible** | Toggle to generate a shareable public link | | **Title** | Display name in the Exports list | | **Description** | Optional context for the export | | **Columns** | Select which fields to include. Use Mentions to pull values from any upstream node | ## How It Works Set a title and optional description for easy identification. Choose which fields to include using **Mentions** to reference upstream data. Toggle **Make publicly accessible** if you need a shareable link. ## Output Exports are available under **Exports** in the sidebar after the Agent runs. ## Best Practices * Include only the columns needed to keep exports clean and focused * Use descriptive titles so exports are easy to find later * Only enable public access when sharing externally is necessary ## Related Nodes * **[Export to CSV](/guide/nodes/actions/export-csv-node)** - exports data to a CSV file or Google Sheet * **[Upload File](/guide/nodes/actions/upload-file-node)** - uploads files to a connected cloud storage integration # Send Email Source: https://docs.bondata.ai/guide/nodes/actions/send-email-node Send email notifications via a connected email provider Sends emails via a connected email service provider (SendGrid, Gmail, Mailchimp, etc.). Use it for automated notifications, alerts, order confirmations, or any email triggered by workflow data. ## Configuration | Setting | Description | | -------------------- | ------------------------------------------------------------- | | **Integration** | The connected email provider | | **Subject** | Email subject line - supports **Mentions** for dynamic values | | **Message Template** | Email body - supports **Mentions** for dynamic values | | **To Emails** | Recipient email address(es) | | **CC Emails** | CC recipients (optional) | | **BCC Emails** | BCC recipients (optional) | | **From Email** | Sender address (uses integration default if empty) | | **Content Type** | **text/plain** (default) or **text/html** for rich formatting | ### Template Options | Setting | Description | | ---------------------- | ------------------------------------------------------------ | | **Template ID** | Provider-specific template ID (SendGrid) or slug (Mailchimp) | | **Template Variables** | Key-value mapping of template variables | ## How It Works Choose your connected email integration. Write the subject and body using **Mentions** to inject record values dynamically. Enter To, CC, and BCC addresses. Recipients can also use **Mentions** (e.g., send to each contact's email). ## Output Emails are sent when the Agent runs. Each send is logged as a task. By default, all matching records are combined into a single email (field values concatenated). To send one email per record, add a [Group By](/guide/nodes/transform/group-by-node) node before this node, grouped by the primary key field. ## Example Send a personalized alert when a deal closes: 1. Filter for opportunities with Stage = "Closed Won" 2. **Group By** → Opportunity.Id 3. **Send Email** * To: `{{Salesforce.Opportunity.OwnerEmail}}` * Subject: `Deal closed: {{Salesforce.Opportunity.Name}}` * Body: `Congratulations! {{Salesforce.Opportunity.Name}} closed for ${{Salesforce.Opportunity.Amount}}.` ## Best Practices * Use **Group By** before this node to send per-record emails * Use **text/html** content type for rich formatting with links and tables * Use **Template ID** for consistent branding with provider-managed templates * Test with a small dataset before enabling automatic execution ## Related Nodes * **[Slack](/guide/nodes/actions/slack-node)** - send chat notifications instead of email * **[Teams](/guide/nodes/actions/teams-node)** - send Microsoft Teams notifications instead of email * **[Group By](/guide/nodes/transform/group-by-node)** - control email batching (one per record vs. batch) # Slack Source: https://docs.bondata.ai/guide/nodes/actions/slack-node Post notifications and alerts to Slack channels Sends messages to one or more Slack channels. Use it to alert your team about matching records, workflow results, or data quality issues. ## Configuration | Setting | Description | | --------------- | ------------------------------------------------------------------------ | | **Integration** | Your connected Slack integration | | **Title** | Message header/title template - supports **Mentions** for dynamic values | | **Message** | Message body template - supports **Mentions** for dynamic values | | **Channel** | One or more Slack channels to post to (e.g., `#alerts`, `#data-quality`) | ## How It Works Choose your connected Slack workspace. Compose the title and body using **Mentions** to inject record values dynamically. Select which Slack channels should receive the notification. ## Output A Slack message is posted to the specified channels when the Agent runs. By default, all matching records are combined into a single message (field values concatenated). To send one message per record, add a [Group By](/guide/nodes/transform/group-by-node) node before this node, grouped by the primary key field. ## Example Alert the sales team about new high-value opportunities: 1. Filter for opportunities above \$100K 2. Add a Slack node targeting `#sales-alerts` 3. Title: `New high-value opportunity` 4. Message: `{{Salesforce.Opportunity.Name}} - ${{Salesforce.Opportunity.Amount}}` ## Best Practices * Use **Group By** before this node to control message granularity (one per record vs. batch) * Keep messages concise - include key details, not every field * Use dedicated channels for automated alerts to avoid noise in general channels ## Related Nodes * **[Teams](/guide/nodes/actions/teams-node)** - send notifications to Microsoft Teams instead of Slack * **[Send Email](/guide/nodes/actions/send-email-node)** - send email notifications instead of chat messages # Teams Source: https://docs.bondata.ai/guide/nodes/actions/teams-node Post notifications and messages to Microsoft Teams channels or chats Sends messages to Microsoft Teams channels or chats. Use it to alert your team about workflow results, data quality issues, or important record changes. ## Configuration | Setting | Description | | -------------------- | ----------------------------------------------------------- | | **Integration** | Your connected Microsoft Teams integration | | **Title** | Message title (shown as the notification header) | | **Message Template** | Message body - supports **Mentions** for dynamic values | | **Channel Type** | **Channel** (team channel) or **Chat** (direct/group chat) | | **Team Name** | The team containing the channel (required for Channel type) | | **Channel Name** | The channel to post to (required for Channel type) | | **Auto Send** | Send automatically without manual approval when enabled | ## How It Works Choose your connected Microsoft Teams workspace. Select whether to post to a team channel or a direct chat, then specify the team and channel names. Compose the title and body using **Mentions** to inject record values dynamically. ## Output A Teams message is posted to the specified channel or chat when the Agent runs. By default, all matching records are combined into a single message (field values concatenated). To send one message per record, add a [Group By](/guide/nodes/transform/group-by-node) node before this node, grouped by the primary key field. ## Example Alert the ops team about failed syncs: 1. Filter for sync records with Status = "Failed" 2. **Teams** node: * Channel: General in "Operations" team * Title: `Sync failures detected` * Message: `{{Integration.Entity.Name}} failed at {{Integration.Entity.LastSyncDate}}` ## Best Practices * Use **Group By** before this node to control message granularity * Keep messages concise with only the essential details * Use dedicated channels for automated alerts to reduce noise * Enable **Auto Send** only after verifying messages look correct ## Related Nodes * **[Slack](/guide/nodes/actions/slack-node)** - send to Slack channels instead of Teams * **[Send Email](/guide/nodes/actions/send-email-node)** - send email notifications instead of chat messages # Update Record Source: https://docs.bondata.ai/guide/nodes/actions/update-record-node Write enriched or computed values back to records in a connected integration Writes data back to a connected integration. Use it to update existing records with enriched, normalized, or computed values. ## Configuration | Setting | Description | | ----------------------- | ------------------------------------------------------------------------------- | | **Entity** | The target entity to update (e.g., Salesforce Account) | | **Description** | A human-readable summary using Mentions (shown in task logs) | | **Fields to Update** | Map target fields to source values using Mentions | | **Do it automatically** | Toggle to execute immediately when the Agent runs, or queue for manual approval | ## How It Works Choose which entity's records to update in the connected integration. Use **+ Add Column** to add field mappings. For each field, select the target field and use **Mentions** to set the value from upstream data. Toggle **Do it automatically** to execute immediately, or leave it off to queue tasks for manual approval. ## Output Each matched record creates one task. Tasks are visible in the Agent's task log after execution. ## Best Practices * Start with **manual approval** to verify updates before enabling automatic execution * Use a clear **Description** with Mentions so task logs are easy to scan * Map only the fields that need updating - avoid overwriting unchanged data ## Related Nodes * **[Create Record](/guide/nodes/actions/create-record-node)** - creates new records instead of updating existing ones * **[Get Data](/guide/nodes/data/get-data-node)** - fetches the records that Update Record will modify # Upload File Source: https://docs.bondata.ai/guide/nodes/actions/upload-file-node Upload files to S3 or other cloud storage integrations Uploads files generated by upstream nodes (e.g., Export to CSV) to a connected S3 storage integration. Use it to archive reports, deliver data exports, or store generated files. ## Configuration | Setting | Description | | -------------------- | --------------------------------------------------------------------------------------- | | **Integration** | Your connected S3 integration | | **Destination Path** | Target path in S3 - supports **Mentions** for dynamic paths (e.g., `reports/{{date}}/`) | | **Attachments** | Files from upstream nodes to upload | | **Title** | A human-readable description of the action | Each attachment specifies: | Setting | Description | | ---------------- | ---------------------------------------- | | **Display Name** | Human-readable name for the file | | **Field Name** | The field containing the file data | | **Node ID** | The upstream node that produced the file | | **MIME Type** | File content type (e.g., `text/csv`) | ## How It Works Place an [Export to CSV](/guide/nodes/actions/export-csv-node) node before this one to generate the file. Set the S3 path where the file should be uploaded. Use **Mentions** for dynamic paths. Choose which upstream file outputs to upload. ## Output The file is uploaded to the specified S3 path when the Agent runs. The upload is logged as a task. ## Example Archive weekly reports to S3: 1. **Export to CSV** → generate a weekly account report 2. **Upload File** → upload to `s3://reports/weekly/accounts-{{date}}.csv` ## Best Practices * Use dynamic paths with **Mentions** to organize files by date, region, or category * Pair with [Export to CSV](/guide/nodes/actions/export-csv-node) for the most common use case * Verify S3 permissions are correctly configured on the integration ## Related Nodes * **[Export to CSV](/guide/nodes/actions/export-csv-node)** - generates the CSV file to upload * **[Private Export](/guide/nodes/actions/private-export-node)** - exports to BonData's internal storage instead of S3 # Code Execution Source: https://docs.bondata.ai/guide/nodes/code/code-execution-node Run custom Python code to transform or process workflow data Runs custom Python code in a secure, isolated sandbox to transform your workflow data. The code executes in an E2B sandboxed environment. Use when you need custom Python logic that cannot be expressed with Transform formulas or SQL expressions. Common use cases: complex string parsing with regex, conditional logic across multiple fields, statistical calculations (percentiles, z-scores), custom classification with multiple rules, pivot/unpivot operations, or row-level deduplication with custom logic. Prefer the [Transform](/guide/nodes/transform/transform-node) node for simple operations like upper(), concat(), or arithmetic - it's faster and doesn't require sandbox execution. ## Configuration | Setting | Description | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Code** | Python code to execute. Must call `load_data()` to get a pandas DataFrame and `save_data(df)` to write the result | | **Description** | Human-readable description of what the code does. Important for non-technical users who view the workflow | | **Result Fields** | New columns the code creates. Each has a name and type (`str`, `int`, `float`, `bool`, `date`, `datetime`). Must match the columns your code adds to the DataFrame | | **Timeout** | Max execution time in seconds (default: 60, range: 5–300). Increase for large datasets | | **Row Limit** | Max rows to process (default: 100,000, range: 1–250,000). Table is sliced if larger | | **Virtual Object Name** | Namespace prefix for output fields (default: `code_execution`). Output columns are named as `{virtual_object_name}.{field_name}` | ## How It Works Your code uses two helper functions: * **`load_data()`** - returns a pandas DataFrame with all columns using human-readable names (e.g., `email`, `revenue`, `company_name`) * **`save_data(df)`** - saves the modified DataFrame back. **Must be called** or the node fails New columns added to the DataFrame automatically become virtual fields available to downstream nodes. You must declare these in **Result Fields** so downstream nodes can reference them. Call `load_data()` to get a pandas DataFrame. Transform it, add new columns, then call `save_data(df)`. Declare every new column your code creates, along with its data type. These must match the columns you actually add to the DataFrame. Configure timeout and row limit to prevent runaway execution. Start small while testing. ## Output The transformed DataFrame, with any new columns available as **Mentions** in downstream nodes. ### Pre-installed Packages `pandas`, `numpy`, `scipy`, `scikit-learn`, `pyarrow`, `rapidfuzz`, plus Python stdlib: `re`, `json`, `datetime`, `math`, `statistics`, `collections`, `itertools` No pip install. No file system access outside `/tmp`. No network access. ## Examples ### Extract email domains Pull the domain from an email field: ```python theme={null} df = load_data() df['domain'] = df['email'].str.split('@').str[1] save_data(df) ``` Result fields: `domain` (str) ### Revenue-per-employee scoring Calculate a score and classify companies into tiers: ```python theme={null} df = load_data() df['score'] = df['revenue'] / df['employees'] df['tier'] = df['score'].apply(lambda x: 'enterprise' if x > 100 else 'smb') save_data(df) ``` Result fields: `score` (float), `tier` (str) ### Percentile-based health score Rank accounts across multiple dimensions: ```python theme={null} df = load_data() df['health_score'] = ( df['revenue'].rank(pct=True) * 0.4 + df['contact_count'].rank(pct=True) * 0.3 + df['activity_score'].rank(pct=True) * 0.3 ) save_data(df) ``` Result fields: `health_score` (float) ### Conditional logic across multiple fields Classify leads based on combined criteria: ```python theme={null} import re df = load_data() def classify_lead(row): if row['revenue'] > 1000000 and row['employees'] > 500: return 'enterprise' elif row['revenue'] > 100000: return 'mid-market' elif re.search(r'\.edu$', str(row['email'])): return 'education' else: return 'smb' df['segment'] = df.apply(classify_lead, axis=1) save_data(df) ``` Result fields: `segment` (str) ### Deduplication with custom logic Keep the most complete record per email: ```python theme={null} df = load_data() # Score completeness (count of non-null fields per row) df['completeness'] = df.notna().sum(axis=1) # Keep the most complete record per email df = df.sort_values('completeness', ascending=False).drop_duplicates(subset=['email'], keep='first') df = df.drop(columns=['completeness']) save_data(df) ``` Result fields: none (same columns, fewer rows) ## Best Practices * Always call both `load_data()` and `save_data(df)` - the node fails without them * Column names in the DataFrame are human-readable (e.g., `email`, `revenue`, not internal IDs) * Add new columns by assigning to the DataFrame (e.g., `df['new_col'] = ...`) * Declare every new column in **Result Fields** so downstream nodes can use them * Start with a small **Row Limit** while testing, then increase for production runs * Use the **Description** field to explain what the code does for non-technical team members ## Related Nodes * **[Transform](/guide/nodes/transform/transform-node)** - simpler formula/SQL transforms without writing Python * **[Query](/guide/nodes/query/query-node)** - run SQL directly against the data warehouse * **[Regex Pattern](/guide/nodes/transform/regex-pattern-node)** - pattern matching without custom code # Bond Node Source: https://docs.bondata.ai/guide/nodes/combine/bond-node Combine data across entities by creating relationships based on shared keys The Bond node is a powerful tool for combining data across entities. It works similarly to a join operation in SQL, allowing you to relate two datasets based on a shared key. ## What is a Bond? A Bond creates a relationship between two entities by matching fields that represent the same identifier. It: * Connects two entities (e.g., Subscriptions and Charge Stations) * Matches them using a shared field (e.g., Charge Station ID) * Produces a virtual, in-memory table combining both datasets ## Core Concept: Matched vs Unmatched When a Bond runs, every record falls into one of two categories: * **Matched** - records where a relationship was successfully found * **Unmatched** - records where no corresponding match exists This distinction is central to how the Bond behaves and what data is passed downstream. ## How It Works In the UI: 1. **Select two entities:** * Source (left): e.g., Subscriptions * Destination (right): e.g., Charge Stations 2. **Define the relationship:** * `Subscriptions.Charge Station ID` ↔ `Charge Stations.Charge Station ID` 3. The Bond evaluates all records and splits them into: * Matched pairs * Unmatched records (from either side) If you are not seeing the Bond you are after, you can create it by clicking **+ Create Custom Bond**. ## Bond Outputs The Bond node exposes multiple outputs: * **Matched** → records that successfully joined * **Unmatched** → records that did not find a match This allows you to: * Continue analysis on valid relationships * Investigate missing or inconsistent data separately ## Advanced: Controlling Match Behavior In the **Advanced** tab, you can define exactly how matched and unmatched records are handled. ### 1. Match & Track (Default) * **Matched:** Source records with a bond * **Unmatched:** Source records without a bond Best for standard enrichment use cases and tracking which source records failed to match. ### 2. Keep All Source Keeps all source records, regardless of match. Destination data is added when available. Equivalent to a **Left Join** in SQL. ### 3. Keep All Destination Keeps all destination records, regardless of match. Equivalent to a **Right Join** in SQL. ### 4. Keep Everything Keeps all records from both sides. Equivalent to a **Full Outer Join** in SQL. ### 5. Only Unmatched Source Returns source records without matches. Useful for finding missing relationships and data quality checks. ### 6. Only Unmatched Destination Returns destination records without matches. Useful for identifying unused or orphaned entities. ### 7. Only Unmatched from Both Focuses strictly on mismatches - records that failed to bond across both sides. Best for debugging joins and auditing data consistency. ### When to Use Each Mode | Goal | Recommended Mode | | -------------------------- | -------------------------- | | Standard enrichment | Match & Track | | Keep all subscriptions | Keep All Source | | Analyze all data | Keep Everything | | Find missing links | Only Unmatched Source | | Audit destination coverage | Only Unmatched Destination | ## Probability Matching (Optional) The **Probability Matching** toggle allows the Bond to use probabilistic logic: * Instead of exact matches, it can match records based on similarity using scoring thresholds * Useful for fuzzy matching (e.g., names, partial IDs) and imperfect or inconsistent datasets * If disabled, only exact matches are considered ## Example ### Scenario You want to enrich subscriptions with charge station data. ### Configuration * **Source:** Subscriptions * **Destination:** Charge Stations * **Match:** Charge Station ID ### Result * **Matched output:** Subscriptions with valid charge station info * **Unmatched output:** Subscriptions missing or referencing invalid stations ## Best Practices * Use **Matched** output for primary workflows * Use **Unmatched** output for debugging and QA * Choose join behavior intentionally - don't default blindly * Validate key fields (IDs should align in format and meaning) * Use probability matching only when necessary ## Related Nodes * **[Merge Node](/guide/nodes/combine/merge-node)** - joins two datasets side-by-side into a flattened table, rather than creating entity relationships * **[Union Node](/guide/nodes/combine/union-node)** - stacks rows vertically instead of combining columns # Merge Node Source: https://docs.bondata.ai/guide/nodes/combine/merge-node Combine two datasets into a single flattened table by aligning on shared fields The Merge node combines two data streams in your workflow by matching records based on field values - similar to a join in SQL. While the Bond node creates relationships between entities, the Merge node produces a fully flattened dataset. Records that match are combined into a single row with fields from both inputs. ## Basic Example **Input 1** | ID | Name | | -- | ---- | | 1 | Dan | | 2 | Yael | **Input 2** | ID | Age | | -- | --- | | 1 | 30 | | 2 | 25 | **Result (Match field: ID)** | ID | Name | Age | | -- | ---- | --- | | 1 | Dan | 30 | | 2 | Yael | 25 | ## How it works ### Connect two inputs Drag two data streams into the Merge node. These can come from any upstream nodes in your workflow - Get Data, Filter, another Merge, etc. ### Choose the match fields Specify which fields to join on between the two inputs (e.g., Account ID from Input 1 = Account ID from Input 2). You can add multiple field pairs to create a composite key - records must match on **all** mapped fields. | Setting | Description | | ----------------- | ------------------------------------------------- | | **Input 1 Field** | The field from the first data stream to match on | | **Input 2 Field** | The field from the second data stream to match on | ### Resolve conflicts If both inputs carry the same entity, pick whether to keep the data from **Input 1** or **Input 2**. | Setting | Description | | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Entity Preferences** | Per-entity setting that controls which input's columns to keep when both inputs carry the same entity | | **Virtual Preferences** | Per-virtual-column setting that controls which input's data to keep when both inputs carry the same virtual column. Defaults to Input 1 if not specified | ### Choose a join type (optional) Under the **Advanced** tab, select a join type to control which records appear in the output. The default is **Match & Track**. | Join Type | SQL Equivalent | Description | | ------------------------------ | --------------- | ------------------------------------------------------------- | | **Match & Track** | Inner Join | Only records with matches in both inputs (default) | | **Keep All Source** | Left Join | All records from Input 1, matched with Input 2 where possible | | **Keep All Destination** | Right Join | All records from Input 2, matched with Input 1 where possible | | **Keep Everything** | Full Outer Join | All records from both inputs, matched where possible | | **Only Unmatched Source** | Left Excluding | Only Input 1 records that have **no** match in Input 2 | | **Only Unmatched Destination** | Right Excluding | Only Input 2 records that have **no** match in Input 1 | | **Only Unmatched from Both** | Full Excluding | Records from either input that have **no** match in the other | The Merge node joins two data streams that are already flowing through your workflow. To pull in new data from a connected integration based on a Bond, use the Get Data node instead. ## Output The Merge node produces two output streams: | Output | Description | | ------------- | ------------------------------------------------------ | | **Matched** | Records that successfully joined across the two inputs | | **Unmatched** | Records that did not find a match in the other input | Both outputs are available as inputs to downstream nodes in your workflow. ## Example with join types **Input 1 (Subscriptions)** | ID | Name | | -- | ---- | | 1 | Dan | | 2 | Yael | | 3 | Noa | **Input 2 (Ages)** | ID | Age | | -- | --- | | 1 | 30 | | 2 | 25 | **Match Field:** `ID` ### Match & Track (Inner Join) **Matched:** | ID | Name | Age | | -- | ---- | --- | | 1 | Dan | 30 | | 2 | Yael | 25 | **Unmatched:** | ID | Name | | -- | ---- | | 3 | Noa | ### Keep All Source (Left Join) | ID | Name | Age | | -- | ---- | ---- | | 1 | Dan | 30 | | 2 | Yael | 25 | | 3 | Noa | null | ### Keep Everything (Full Outer Join) | ID | Name | Age | | -- | ---- | ---- | | 1 | Dan | 30 | | 2 | Yael | 25 | | 3 | Noa | null | (+ any unmatched from Input 2 if present) ## Merge vs Bond | Feature | Bond | Merge | | ------------ | ------------------------ | -------------------------- | | **Purpose** | Create relationships | Combine datasets | | **Output** | Linked records | Flattened table | | **Behavior** | Join-like (logical) | Join + materialize | | **Use case** | Enrichment & exploration | Final dataset construction | ## Best Practices * Always verify your match fields - IDs should align exactly * Use multiple fields if a single key is not unique * Resolve conflicts intentionally - don't default blindly * Check **Unmatched** output to catch missing data * Choose merge mode based on your goal: * **Analysis** → Keep Everything * **Clean dataset** → Match & Track * **Debugging** → Unmatched modes ## Related Nodes * **[Bond Node](/guide/nodes/combine/bond-node)** - creates logical relationships between entities rather than producing a flattened table * **[Union Node](/guide/nodes/combine/union-node)** - stacks rows vertically instead of joining side-by-side # Union Node Source: https://docs.bondata.ai/guide/nodes/combine/union-node Combine multiple datasets by stacking rows into a single table The Union node stacks rows from two data streams vertically into a single output - like appending one spreadsheet below another. Unlike Merge (which joins data side-by-side), Union appends data vertically. It can optionally deduplicate records based on mapped fields. ## Basic Example **Input 1** | ID | Name | | -- | ---- | | 1 | Dan | | 2 | Yael | **Input 2** | ID | Name | | -- | ---- | | 3 | Ron | | 4 | Noa | **Result (Union)** | ID | Name | | -- | ---- | | 1 | Dan | | 2 | Yael | | 3 | Ron | | 4 | Noa | ## How it works ### Connect two inputs Drag two data streams into the Union node. These can come from any upstream nodes in your workflow. ### Choose a union type Select how the rows from both inputs should be combined. | Union Type | SQL Equivalent | Description | | ------------ | -------------- | ----------------------------------------------------------------------------------- | | **All** | `UNION ALL` | Keep all rows from both inputs - simple concatenation (default) | | **Distinct** | `UNION` | Deduplicate rows based on the mapped fields, keeping one row per unique combination | ### Configure dedup settings (optional) When using **Distinct** mode, configure which fields define uniqueness and which input wins on duplicates. **Dedup Key** - select which fields from each input correspond to each other. These field pairs define uniqueness for deduplication. You can add multiple fields for a composite key (e.g., `ID` + `Date`). | Setting | Description | | ----------------- | --------------------------------------------------- | | **Input 1 Field** | A field from the first data stream | | **Input 2 Field** | The corresponding field from the second data stream | **Priority** - when duplicates are found, controls which input's row is kept. | Priority | Description | | ---------------- | ------------------------------------------------------------- | | **Input 1 wins** | Keep the row from Input 1 when a duplicate is found (default) | | **Input 2 wins** | Keep the row from Input 2 when a duplicate is found | Field mappings are required when using Distinct mode. In All mode they are optional - rows are simply stacked. ## Output The Union node produces a single output stream containing the combined rows from both inputs. The output is available as an input to any downstream node in your workflow. ## Example with Deduplication **Input 1** | ID | Name | | -- | ---- | | 1 | Dan | | 2 | Yael | **Input 2** | ID | Name | | -- | ---- | | 2 | Yael | | 3 | Ron | **Configuration:** Distinct, Dedup Key: `ID`, Priority: Input 1 wins **Result:** | ID | Name | | -- | ---- | | 1 | Dan | | 2 | Yael | | 3 | Ron | ## All vs Distinct When using **All**, if both tables contain the same record, the result will include it **twice**: | ID | Name | | -- | ---- | | 1 | Dan | | 1 | Dan | When using **Distinct**, duplicates are removed based on the dedup key, keeping only one row per unique combination. ## Union vs Merge vs Bond | Feature | Bond | Merge | Union | | ------------------ | -------------- | ------------------- | ------------------ | | **Purpose** | Relate data | Combine columns | Stack rows | | **Structure** | Linked | Flattened | Appended | | **SQL Equivalent** | Join (logical) | Join (materialized) | UNION / UNION ALL | | **Use Case** | Enrichment | Final dataset | Combining datasets | ## Best Practices * Ensure inputs have compatible schemas (same fields and meaning) * Use **All** when you want full data coverage and duplicates are acceptable * Use **Distinct** when you need a clean dataset and duplicate records must be removed * Carefully define dedup keys and priority rules ## Common Pitfalls * **Mismatched columns** - same name but different meaning across inputs * **Missing dedup key** - leads to incorrect duplicate removal * **Over-aggressive deduplication** - can cause data loss ## Related Nodes * **[Merge Node](/guide/nodes/combine/merge-node)** - joins two datasets side-by-side rather than stacking vertically * **[Bond Node](/guide/nodes/combine/bond-node)** - creates logical relationships between entities # Basic Condition Source: https://docs.bondata.ai/guide/nodes/condition/basic-condition-node Branch the workflow into TRUE and FALSE paths based on field conditions Splits your workflow into two branches - **True** and **False** - based on whether records match the configured conditions. Use it to route records down different paths for different processing. ## Configuration | Setting | Description | | -------------- | -------------------------------------------------------------------- | | **Conditions** | One or more conditions comparing a field to a static value | | **Logical** | **OR** (any condition matches - default) or **AND** (all must match) | Each condition specifies: | Setting | Description | | ------------ | ------------------------------------------------------------------------------- | | **Field** | The field to evaluate | | **Operator** | Comparison operator (equals, not equals, greater than, contains, is null, etc.) | | **Value** | The static value to compare against | ## How It Works Add one or more conditions that compare field values against static values. Select **OR** to branch on any matching condition, or **AND** to require all conditions. Connect nodes to the **True** output for matching records, and to the **False** output for non-matching records. ## Output | Output | Description | | --------- | ---------------------------------------------- | | **True** | Records where the conditions evaluate to true | | **False** | Records where the conditions evaluate to false | Both outputs can connect to any downstream node, creating independent processing paths. ## Example Route high-value accounts to a different enrichment path: * Condition: Revenue **greater than** 100000 * **True path** → AI Enrichment → Update Record * **False path** → Export to CSV for review ## Best Practices * Use clear, specific conditions to avoid ambiguous routing * Always connect both True and False outputs - unconnected branches mean lost records * For field-to-field comparisons, use [Field Comparison Condition](/guide/nodes/condition/field-comparison-condition-node) instead * For routing to more than two paths, use [Router Condition](/guide/nodes/condition/router-condition-node) ## Related Nodes * **[Field Comparison Condition](/guide/nodes/condition/field-comparison-condition-node)** - branches by comparing two fields instead of field vs. static value * **[Router Condition](/guide/nodes/condition/router-condition-node)** - routes records to multiple named paths, not just True/False * **[Simple Filter](/guide/nodes/filter/simple-filter-node)** - removes non-matching records instead of branching # Field Comparison Condition Source: https://docs.bondata.ai/guide/nodes/condition/field-comparison-condition-node Branch the workflow by comparing values between two fields Branches your workflow into **True** and **False** paths based on comparing one field's value against another field's value. Unlike Basic Condition (which compares against static values), this node compares fields dynamically at runtime. ## Configuration | Setting | Description | | --------------- | ----------------------------------------------------------------------- | | **Left Field** | The first field to compare | | **Operator** | Comparison operator (equals, not equals, greater than, less than, etc.) | | **Right Field** | The second field to compare against | ## How It Works Choose the first field - this can be from any entity or virtual field in your workflow. Select how to compare the two fields (equals, greater than, etc.). Choose the second field to compare against. ## Output | Output | Description | | --------- | -------------------------------------------------------------- | | **True** | Records where the comparison is true (e.g., field A > field B) | | **False** | Records where the comparison is false | ## Example Route records where HubSpot and Salesforce have different company names: * **Left Field:** HubSpot.Company.Name * **Operator:** not equals * **Right Field:** Salesforce.Account.Name * **True path** → flag for data quality review * **False path** → records are consistent, continue normally ## Best Practices * Use this node when comparing two dynamic values - use [Basic Condition](/guide/nodes/condition/basic-condition-node) for static value comparisons * Ensure compared fields have compatible types (don't compare a string to a number) * This is especially useful for cross-system data validation ## Related Nodes * **[Basic Condition](/guide/nodes/condition/basic-condition-node)** - branches based on field vs. static value comparison * **[Router Condition](/guide/nodes/condition/router-condition-node)** - routes to multiple paths based on different conditions * **[Simple Filter](/guide/nodes/filter/simple-filter-node)** - filters records instead of branching # Router Condition Source: https://docs.bondata.ai/guide/nodes/condition/router-condition-node Route records to multiple named paths based on different conditions Routes records to any number of output paths based on configurable conditions. Unlike Basic Condition (which only splits into True/False), Router lets you define multiple named branches - each with its own set of conditions. ## Configuration | Setting | Description | | --------- | ------------------------------------------------------------ | | **Paths** | One or more named output paths, each with its own conditions | Each path specifies: | Setting | Description | | -------------- | ------------------------------------------------------------------------------- | | **Name** | Display name for this path (optional) | | **Logical** | **AND** (all conditions must match - default) or **OR** (any condition matches) | | **Conditions** | One or more conditions comparing a field to a static value | ## How It Works Add one or more output paths. Each path represents a different routing destination. For each path, define the conditions that determine which records are sent there. Connect different processing nodes to each path output. ## Output Each path creates a separate output. Records matching a path's conditions are sent to that output. A record can match multiple paths and will be sent to **all** matching outputs. Records that don't match any path are not routed. ## Example Route contacts by region for different processing: * **Path 1 "North America":** Region **equals** "NA" * **Path 2 "Europe":** Region **equals** "EU" * **Path 3 "Asia Pacific":** Region **equals** "APAC" Each path connects to region-specific enrichment and notification workflows. ## Best Practices * Name your paths clearly - they appear as labels on the workflow canvas * Be aware that records can match multiple paths (this is useful for cross-cutting concerns) * For simple two-way branching, [Basic Condition](/guide/nodes/condition/basic-condition-node) is simpler * Conditions within each path are combined with the path's logic (AND/OR) ## Related Nodes * **[Basic Condition](/guide/nodes/condition/basic-condition-node)** - simpler True/False branching for two-way decisions * **[Field Comparison Condition](/guide/nodes/condition/field-comparison-condition-node)** - branches based on field-to-field comparison * **[Simple Filter](/guide/nodes/filter/simple-filter-node)** - removes non-matching records instead of routing # Get Data Source: https://docs.bondata.ai/guide/nodes/data/get-data-node Fetch records from a connected integration as the starting point for your workflow The starting point for every Agent. Fetches records from a connected integration. Select the integration, entity, and fields you want to work with. All downstream nodes operate on the records returned by Get Data. ## Configuration | Setting | Description | | --------------- | ------------------------------------------------------------------------- | | **Integration** | The connected system to pull data from (e.g., Salesforce, Snowflake, CSV) | | **Entity** | The specific object or table to query (e.g., Account, Contact, Order) | | **Fields** | Which fields to include in the output | ## How It Works Choose which connected system to pull data from. Pick the object or table you want to work with. Choose which fields to include. These become available as **Mentions** in all downstream nodes. Narrow the dataset with conditions before passing it downstream. See [Building Agents](/guide/agents/building-agents) for details on filter configuration. ## Output A set of records from the selected integration, with the chosen fields available as Mentions for all downstream nodes. ## Best Practices * Select only the fields you need - smaller datasets process faster * Use filters to narrow the dataset early rather than filtering downstream * Every workflow needs at least one Get Data node as its entry point ## Related Nodes * **[Simple Filter](/guide/nodes/filter/simple-filter-node)** - filter the records returned by Get Data * **[Bond Node](/guide/nodes/combine/bond-node)** - combine Get Data output with another entity # AI Enrichment Source: https://docs.bondata.ai/guide/nodes/enrichment/ai-enrichment-node Send each record through an LLM prompt to generate new data fields Sends each record through an LLM prompt to generate new data fields. Use it to classify records, extract insights, estimate values, or enrich records with AI-generated content. ## Configuration | Setting | Description | | --------------------- | ------------------------------------------------------------------------------------- | | **Integration** | The LLM provider (Gemini, OpenAI, Anthropic) | | **Prompt Template** | The instruction sent to the LLM. Use **Mentions** to inject record values dynamically | | **Data Fields** | Additional structured data sent alongside the prompt | | **Result Field Name** | The name of the output field that stores the LLM's response | | **Temperature** | Controls response creativity (0 = deterministic, 1 = creative) | | **Model** | The specific model to use (e.g., Gemini 2.5 Flash Lite) | | **Limit** | Maximum number of requests to process | ## How It Works Choose a provider, model, and temperature setting. Write the instruction for the LLM. Use **Mentions** to inject record values (e.g., `{{Account Name}}`, `{{Industry}}`). Choose a name for the output field where the LLM's response will be stored. ## Output A new field (named by **Result Field Name**) is added to each record containing the LLM's response. This field becomes available as a **Mention** in all downstream nodes. ## Example Enrich Salesforce Accounts with employee count estimates: 1. Set the prompt to instruct the LLM to return an employee count 2. Use Mentions to pass `Account Name`, `Industry`, and `Employees` as context 3. Set the result field to `num_employees` 4. The enriched field becomes available as a Mention in downstream nodes ## Best Practices * Be specific in your prompt template - vague prompts produce inconsistent results * Use low temperature (0–0.2) for factual extraction, higher for creative tasks * Set a **Limit** when testing to avoid processing the entire dataset * Include relevant context fields in **Data Fields** to improve LLM accuracy ## Related Nodes * **[Data Normalization](/guide/nodes/transform/data-normalization-node)** - uses an LLM to clean existing fields rather than generating new ones * **[Web Search](/guide/nodes/enrichment/web-search-node)** - enriches records with live web data instead of LLM-generated content # Dictionary Lookup Source: https://docs.bondata.ai/guide/nodes/enrichment/dictionary-lookup-node Map field values using inline or entity-based lookup dictionaries Maps values from a source field to new values using a lookup dictionary - similar to VLOOKUP in spreadsheets. Supports inline key-value pairs, entity-based dictionaries, and fuzzy matching. ## Configuration | Setting | Description | | ----------------------- | --------------------------------------------------------------------------------------------- | | **Source Field** | The field to use as the lookup key | | **Dictionary Source** | **Inline** (key-value pairs defined in the node) or **Entity** (from a connected integration) | | **Result Field Name** | Name for the output field (default: `lookup_result`) | | **Default Value** | Value to use when no match is found | | **Match Mode** | How to match keys (see below) | | **Case Sensitive** | Whether matching is case-sensitive (default: off) | | **Virtual Object Name** | Namespace prefix for output fields (default: `dictionary_lookup`) | ### Inline Dictionary | Setting | Description | | ----------- | ----------------------- | | **Entries** | List of key-value pairs | ### Entity Dictionary | Setting | Description | | ----------------------------- | ---------------------------------------------- | | **Dictionary Key Field** | Field in the reference entity to match against | | **Dictionary Value Field(s)** | Field(s) to return from matching rows | | **Dictionary Filter Field** | Optional field for filtering/grouping lookups | ### Match Modes | Mode | Description | | --------------- | ----------------------------------------------------------- | | **Exact** | Key must match exactly (default) | | **Fuzzy** | Uses similarity scoring with configurable threshold (0-100) | | **Fuzzy Top N** | Returns top N fuzzy candidates | | **Regex** | Dictionary keys are regex patterns - first match wins | | **Substring** | Longest matching substring wins | | **Collect All** | Joins all matching values from a filtered group | ### Fuzzy Matching Options | Setting | Description | | --------------------- | -------------------------------------------------------------- | | **Fuzzy Threshold** | Minimum similarity score (0-100, default: 70) | | **Fuzzy Scorer** | Scoring algorithm: **WRatio** (default) or **Token Set Ratio** | | **Noise Words** | Words to strip before matching | | **Normalize Umlauts** | Normalize German umlauts (ä→ae, etc.) | | **Substring Boost** | Boost substring matches to score 95 | ## How It Works Choose which field contains the values to look up. Use inline key-value pairs for simple mappings, or reference an entity for larger dictionaries. Use **Exact** for clean data, **Fuzzy** for messy data, or **Regex** for pattern-based mapping. ## Output A new field containing the matched dictionary value. For entity mode with multiple value fields, multiple columns are returned (like a multi-column VLOOKUP). ## Examples ### Inline: Map country codes to names * Source Field: Country Code * Dictionary Source: Inline * Entries: `US → United States`, `GB → United Kingdom`, `DE → Germany` * Default: "Unknown" ### Entity: Fuzzy company name matching * Source Field: Company Name * Dictionary Source: Entity (reference list of canonical company names) * Match Mode: Fuzzy * Threshold: 80 * Noise Words: "Inc, LLC, Ltd, Corp" ## Best Practices * Use **Inline** for small, static dictionaries (\< 50 entries) * Use **Entity** for large or frequently updated dictionaries * Start with a higher fuzzy threshold (80+) and lower gradually if needed * Use **Noise Words** to strip common suffixes before fuzzy matching (e.g., company suffixes) * Use **Collect All** mode when you need to aggregate all matching values ## Related Nodes * **[Reference Lookup](/guide/nodes/enrichment/reference-lookup-node)** - looks up matching rows and formats as text * **[Transform](/guide/nodes/transform/transform-node)** - use CASE expressions for simple value mapping without a dictionary * **[Find Duplicates](/guide/nodes/enrichment/find-duplicates-node)** - fuzzy matching across records rather than against a dictionary # Find Duplicates Source: https://docs.bondata.ai/guide/nodes/enrichment/find-duplicates-node Detect duplicate records using fuzzy matching and configurable thresholds Detects duplicate records using fuzzy matching and configurable thresholds. Outputs two paths: **All Records** and **Deduplicated** - so you can handle duplicates and clean records differently. ## Configuration tab | Setting | Description | | ------------------------ | --------------------------------------------------------------------------------------------------------- | | **Preset Configuration** | Choose a starting point - **Conservative** (95%), **Balanced** (92%), **Aggressive** (88%), or **Custom** | | **Auto-merge threshold** | Records scoring above this are merged automatically | | **Review threshold** | Records between review and auto-merge thresholds need manual review | | **Fields to Compare** | Select fields and set comparison type (**Fuzzy** or **Exact**) and weight | ## Rules & Performance tab | Setting | Description | | ------------------------ | ---------------------------------------------------------------------------------------------------------- | | **Blocking Keys** | Only compare records that share a blocking key value - dramatically improves performance on large datasets | | **Must-Match Rules** | Records must match on these fields to be considered duplicates | | **Must-Not-Match Rules** | Records matching on these fields are never considered duplicates | ## Advanced tab **Normalization Options** - applied before comparison: * Trim & lowercase * Remove punctuation * Unicode normalize * Ignore company suffixes (e.g., "Inc", "LLC") * Phone normalize (E.164) * Address normalize **Safety Rails** - prevent unintended mass merges: | Setting | Description | | -------------------- | ----------------------------------------------------- | | **Dry run** | Simulate without actually merging | | **Max cluster size** | Prevents one bad key from merging hundreds of records | | **Max total merges** | Stops after N merges for gradual rollout | ## Output Two output paths: * **All Records** - every record with duplicate scores attached * **Deduplicated** - clean dataset with duplicates removed ## Best Practices * Start with the **Balanced** preset and adjust thresholds based on results * Use **Blocking Keys** for large datasets - comparing every record pair is expensive * Enable **Dry run** first to preview results before committing merges * Set **Max total merges** for gradual rollout on critical data ## Related Nodes * **[Bond Node](/guide/nodes/combine/bond-node)** - matches records across different entities, not within the same dataset * **[Data Normalization](/guide/nodes/transform/data-normalization-node)** - clean field values before duplicate detection for better accuracy # Reference Lookup Source: https://docs.bondata.ai/guide/nodes/enrichment/reference-lookup-node Look up matching rows from a reference entity and format as text Looks up matching rows from a reference entity and formats the results as a text field. Useful for enriching records with context from another dataset - for example, attaching related notes, activities, or linked records as formatted text. ## Configuration | Setting | Description | | ----------------------- | -------------------------------------------------------------------- | | **Key Field** | Field in the reference entity to match against | | **Source Field** | Lookup key from your workflow data | | **Display Fields** | Fields from the reference entity to include in the output | | **Limit** | Maximum matching rows to return per record (default: 5) | | **Result Field Name** | Name for the output field (default: `reference_result`) | | **Format Template** | Template for formatting each matching row (e.g., `{Name}: {Amount}`) | | **Case Sensitive** | Key matching case sensitivity (default: off) | | **Virtual Object Name** | Namespace prefix (default: `reference_lookup`) | ### Exclusion Options | Setting | Description | | ------------------------ | ------------------------------------------------- | | **Exclude Field** | Field in reference entity for exclusion filtering | | **Exclude Source Field** | Source field providing the exclusion value | ## How It Works Choose which entity to look up matching rows from. Map the key field (in the reference entity) to the source field (in your workflow data). Select which fields from matching rows should appear in the output. Write a template using `{FieldName}` placeholders to control how matching rows are formatted. ## Output A text field containing formatted matching rows from the reference entity. This is especially useful as input for AI Enrichment prompts or reports. ## Example Enrich accounts with their recent support tickets: * **Key Field:** Zendesk.Ticket.AccountId * **Source Field:** Salesforce.Account.Id * **Display Fields:** Subject, Status, Created Date * **Format Template:** `{Subject} ({Status}) - {Created Date}` * **Limit:** 3 Result: each account gets a text field like: ``` Login issue (Open) - 2024-01-15 Billing question (Closed) - 2024-01-10 Feature request (Pending) - 2024-01-08 ``` ## Best Practices * Set a reasonable **Limit** - too many matching rows creates very long text fields * Use **Format Template** for clean, readable output * Use the **Exclusion** options to skip irrelevant matches (e.g., exclude the record itself) * Reference Lookup output works well as input to [AI Enrichment](/guide/nodes/enrichment/ai-enrichment-node) prompts ## Related Nodes * **[Dictionary Lookup](/guide/nodes/enrichment/dictionary-lookup-node)** - maps values using key-value pairs rather than returning formatted text * **[AI Enrichment](/guide/nodes/enrichment/ai-enrichment-node)** - feed Reference Lookup output into an LLM prompt for analysis * **[Bond Node](/guide/nodes/combine/bond-node)** - creates relationships between entities (structured join vs. text lookup) # Synccentric Lookup Source: https://docs.bondata.ai/guide/nodes/enrichment/synccentric-lookup-node Enrich ASINs with Amazon product metadata via Synccentric Enriches records with Amazon product metadata by looking up ASINs through the Synccentric API. Use it to add product titles, descriptions, categories, prices, EANs, and images to your workflow data. ## Configuration | Setting | Description | | ----------------------- | -------------------------------------------------------------------------------------- | | **Integration** | Your connected Synccentric integration | | **Source Field** | Field containing ASINs to look up | | **Lookup Mode** | **Quick** (10 per batch, synchronous - default) or **Bulk** (up to 1000, asynchronous) | | **Locale** | Amazon marketplace: DE, US, UK, etc. (default: DE) | | **Output Fields** | Product fields to return (title, description, category, EAN, price, images, etc.) | | **Limit** | Maximum ASINs to process (default: 1000) | | **Virtual Object Name** | Namespace prefix (default: `synccentric_lookup`) | ## How It Works Choose which field contains the Amazon ASINs to look up. Use **Quick** for small batches with instant results, or **Bulk** for large datasets with async processing. Choose which product data fields to include in the enrichment. ## Output New columns are added for each selected output field, containing the product metadata from Synccentric. ## Example Enrich a product catalog with Amazon data: 1. **Get Data** from a CSV with ASINs 2. **Synccentric Lookup** → Source: ASIN column, Output: title, price, category, EAN 3. **Export to CSV** with enriched product data ## Best Practices * Use **Quick** mode for datasets under 100 ASINs * Use **Bulk** mode for larger datasets - it's more efficient but results are async * Set the correct **Locale** to get pricing and availability for the right marketplace ## Related Nodes * **[Dictionary Lookup](/guide/nodes/enrichment/dictionary-lookup-node)** - generic value mapping for non-ASIN lookups * **[Web Search](/guide/nodes/enrichment/web-search-node)** - search the web for product information not available via Synccentric # Web Search Source: https://docs.bondata.ai/guide/nodes/enrichment/web-search-node Search the web for each record and store results as a new field Performs a web search for each record using Exa and stores the results as a new field. Use it to find company websites, news articles, LinkedIn profiles, or any public information. ## Configuration | Setting | Description | | --------------------- | ------------------------------------------------------------------------------------ | | **Search Query** | The search query. Use `{{field_name}}` or **Mentions** to make it dynamic per record | | **Search Type** | **Auto** (high quality, \~1s latency), **Keyword**, or **Neural** | | **Number of Results** | How many results to return per query (max 100) | | **Result Field Name** | The field name where search results are stored | | **Filters** | Narrow results by domain, date, or other criteria | | **Contents** | Control what's extracted from each result | ## How It Works Compose the query using **Mentions** to make it dynamic per record (e.g., `{{Company Name}} official website`). Select **Auto** for best quality, **Keyword** for exact term matching, or **Neural** for semantic search. Optionally filter by domain or date, choose how many results to return, and name the output field. ## Output A new field containing the search results is added to each record. The field becomes available as a **Mention** in all downstream nodes. ## Best Practices * Use **Mentions** to make queries dynamic per record * Set domain filters to focus results (e.g., only `linkedin.com` for profile lookups) * Start with a small number of results per query and increase if needed * Use **Neural** search for conceptual queries, **Keyword** for exact terms ## Related Nodes * **[AI Enrichment](/guide/nodes/enrichment/ai-enrichment-node)** - enrich records using LLM-generated content instead of web data * **[HTTP Request](/guide/nodes/actions/http-request-node)** - call a specific API endpoint rather than performing a web search # Or Filter Source: https://docs.bondata.ai/guide/nodes/filter/or-filter-node Combine multiple filter conditions with OR logic to select matching records Filters records based on multiple conditions combined with OR or AND logic. Similar to Simple Filter, but designed for workflows where you need explicit control over how conditions are combined. ## Configuration | Setting | Description | | -------------- | -------------------------------------------------------------------- | | **Conditions** | One or more filter conditions | | **Logical** | **OR** (any condition matches - default) or **AND** (all must match) | Each condition specifies: | Setting | Description | | ------------ | ------------------------------------------------------------------------------------------ | | **Field** | The field to evaluate | | **Operator** | Comparison operator (equals, not equals, greater than, less than, contains, is null, etc.) | | **Value** | The static value to compare against | ## How It Works Add one or more conditions, each comparing a field against a static value. Choose **OR** to pass records matching any condition, or **AND** to require all conditions. ## Output Records matching the condition logic pass through. Non-matching records are excluded. ## Example Find contacts who are either in Sales or Marketing: * Condition 1: Department **equals** "Sales" * Condition 2: Department **equals** "Marketing" * Logic: **OR** Result: contacts in either department flow downstream. ## Best Practices * Use OR logic when you need to match any of several values for the same field * For field-to-field comparisons, use the [Field Comparison Condition](/guide/nodes/condition/field-comparison-condition-node) instead * Chain with other filter nodes for complex multi-step filtering ## Related Nodes * **[Simple Filter](/guide/nodes/filter/simple-filter-node)** - equivalent filtering with the same condition operators * **[Basic Condition](/guide/nodes/condition/basic-condition-node)** - branches into TRUE/FALSE paths instead of excluding records # Simple Filter Source: https://docs.bondata.ai/guide/nodes/filter/simple-filter-node Filter records by field conditions using AND/OR logic Filters records based on field values and conditions. Use it to narrow your dataset to only the records that match your criteria - for example, accounts missing an email, contacts in a specific region, or deals above a certain value. ## Configuration | Setting | Description | | -------------- | ------------------------------------------------------------------------------------- | | **Conditions** | One or more filter conditions to apply | | **Logic** | **AND** (all conditions must match) or **OR** (any condition matches) - default is OR | Each condition specifies: | Setting | Description | | ------------ | ------------------------------------- | | **Field** | The field to evaluate | | **Operator** | Comparison operator (see table below) | | **Value** | The static value to compare against | ### Supported Operators | Operator | Description | | ------------------------- | ------------------------------------- | | **equals** | Exact match | | **not equals** | Does not match | | **greater than** | Numeric/date comparison | | **greater than or equal** | Numeric/date comparison | | **less than** | Numeric/date comparison | | **less than or equal** | Numeric/date comparison | | **contains** | Field value includes the text | | **not contains** | Field value does not include the text | | **starts with** | Field value begins with the text | | **ends with** | Field value ends with the text | | **is null** | Field has no value | | **is not null** | Field has a value | ## How It Works Click **+ Add condition** to define what records should match. Each condition compares a field against a static value. Select **AND** to require all conditions, or **OR** to match any condition. To combine AND and OR logic, chain multiple filter nodes sequentially - each node applies its own logic independently. ## Output Records that match the filter conditions pass through to downstream nodes. Records that don't match are excluded. Use **Filter Insights** (button on the filter's right side) to preview how many records match before running the Agent. Requires saving the Agent first. ## Example Find Salesforce Accounts missing a website: * **Field:** Website * **Operator:** is null * **Logic:** OR (single condition) Result: only accounts where the Website field is empty flow downstream. ## Best Practices * Place filters early in your workflow to reduce the dataset before expensive operations * Use **Filter Insights** to verify your conditions match the expected number of records * Chain filters for complex AND + OR combinations * For comparing fields against other fields (not static values), use the [Field Comparison Condition](/guide/nodes/condition/field-comparison-condition-node) instead ## Related Nodes * **[Or Filter](/guide/nodes/filter/or-filter-node)** - similar filtering with explicit OR logic across conditions * **[Basic Condition](/guide/nodes/condition/basic-condition-node)** - branches into TRUE/FALSE paths instead of just filtering * **[Router Condition](/guide/nodes/condition/router-condition-node)** - routes records to multiple paths based on different conditions # Nodes Overview Source: https://docs.bondata.ai/guide/nodes/overview Reference guide for every node type available in the workflow builder Agents are built by chaining **nodes** together in a visual workflow. Each node performs a specific operation - fetching data, transforming fields, detecting duplicates, enriching with AI, or taking action. Click **+** on any node to open the node picker and search for the one you need. *** ## Node Categories Fetch records from connected integrations Join, merge, or union datasets together Narrow records by field conditions Branch your workflow based on conditions Reshape, aggregate, sort, and clean data Enrich records with AI, web search, or lookups Run SQL queries or custom code Create, update, export, or notify Annotations and workflow helpers *** ## All Nodes | Node | Category | Description | | ------------------------------------------------------------------------------------ | ---------- | ----------------------------------------------------------------- | | [Get Data](/guide/nodes/data/get-data-node) | Data | Fetch records from a connected integration | | [Bond](/guide/nodes/combine/bond-node) | Combine | Create relationships between entities using shared keys | | [Merge](/guide/nodes/combine/merge-node) | Combine | Join two datasets side-by-side into a flattened table | | [Union](/guide/nodes/combine/union-node) | Combine | Stack rows from two datasets vertically | | [Simple Filter](/guide/nodes/filter/simple-filter-node) | Filter | Filter records by field conditions with AND/OR logic | | [Or Filter](/guide/nodes/filter/or-filter-node) | Filter | Combine multiple filter conditions with OR logic | | [Basic Condition](/guide/nodes/condition/basic-condition-node) | Condition | Branch the workflow based on a simple true/false condition | | [Field Comparison Condition](/guide/nodes/condition/field-comparison-condition-node) | Condition | Branch based on comparing field values | | [Router Condition](/guide/nodes/condition/router-condition-node) | Condition | Route records to different paths based on multiple conditions | | [Data Normalization](/guide/nodes/transform/data-normalization-node) | Transform | Use an LLM to clean and standardize field values | | [Transform](/guide/nodes/transform/transform-node) | Transform | Apply rule-based transformations to fields | | [Aggregation](/guide/nodes/transform/aggregation-node) | Transform | Compute summary statistics across records | | [Sort](/guide/nodes/transform/sort-node) | Transform | Order records by field values | | [Group By](/guide/nodes/transform/group-by-node) | Transform | Group records by field values | | [Split Group](/guide/nodes/transform/split-group-node) | Transform | Split grouped records back into individual rows | | [Head/Tail](/guide/nodes/transform/head-tail-node) | Transform | Take the first or last N records | | [Regex Pattern](/guide/nodes/transform/regex-pattern-node) | Transform | Extract or replace text using regular expressions | | [AI Enrichment](/guide/nodes/enrichment/ai-enrichment-node) | Enrichment | Send records through an LLM prompt to generate new fields | | [Find Duplicates](/guide/nodes/enrichment/find-duplicates-node) | Enrichment | Detect duplicates with fuzzy matching and configurable thresholds | | [Web Search](/guide/nodes/enrichment/web-search-node) | Enrichment | Search the web for each record using Exa | | [Dictionary Lookup](/guide/nodes/enrichment/dictionary-lookup-node) | Enrichment | Map field values using a lookup dictionary | | [Reference Lookup](/guide/nodes/enrichment/reference-lookup-node) | Enrichment | Look up values from a reference dataset | | [Synccentric Lookup](/guide/nodes/enrichment/synccentric-lookup-node) | Enrichment | Look up records in Synccentric | | [Query](/guide/nodes/query/query-node) | Query | Run SQL queries against your data | | [Code Execution](/guide/nodes/code/code-execution-node) | Code | Run custom code to transform or process records | | [Update Record](/guide/nodes/actions/update-record-node) | Actions | Write values back to records in a connected integration | | [Create Record](/guide/nodes/actions/create-record-node) | Actions | Create new records in a connected system | | [Export to CSV](/guide/nodes/actions/export-csv-node) | Actions | Export data to a CSV file or Google Sheet | | [Private Export](/guide/nodes/actions/private-export-node) | Actions | Export records to a downloadable file | | [Send Email](/guide/nodes/actions/send-email-node) | Actions | Send email notifications via SendGrid | | [HTTP Request](/guide/nodes/actions/http-request-node) | Actions | Call an external API | | [Slack](/guide/nodes/actions/slack-node) | Actions | Post notifications to a Slack channel | | [Teams](/guide/nodes/actions/teams-node) | Actions | Post notifications to Microsoft Teams | | [Upload File](/guide/nodes/actions/upload-file-node) | Actions | Upload files to cloud storage | | [Sticky Note](/guide/nodes/utility/sticky-note-node) | Utility | Add annotations to your workflow canvas | # Query Source: https://docs.bondata.ai/guide/nodes/query/query-node Run custom SQL queries against your data warehouse Executes a custom SQL query against your connected data warehouse and uses the results as a data source in your workflow. Use it when you need to pull data using complex SQL that goes beyond what Get Data provides. ## Configuration | Setting | Description | | ----------------------- | ------------------------------------------------------------ | | **Query** | SQL SELECT statement to execute against the data warehouse | | **DWH Auth ID** | Data warehouse authentication ID (default: 0) | | **Result Fields** | Expected result columns and types (auto-detected if omitted) | | **Virtual Object Name** | Namespace prefix for output fields (default: `query`) | ### Result Field Types | Type | Description | | ------------ | -------------- | | **str** | String/text | | **int** | Integer | | **float** | Decimal number | | **bool** | Boolean | | **date** | Date | | **datetime** | Date and time | ## How It Works Write a SELECT statement using your DWH's SQL syntax. Reference tables with bare names, schema-qualified names (`"schema"."table"`), or fully qualified names. Specify expected output columns and their types. If omitted, BonData auto-detects them from the query results. The query results become the starting point for your workflow, available as **Mentions** in downstream nodes. ## Output A dataset containing the query results. Each column becomes available as a **Mention** in downstream nodes, named as `{virtual_object_name}.{column_name}`. The Query node acts as a workflow starting point - it does not have an input. Only SELECT statements are supported. ## Example Pull a custom report from Snowflake: ```sql theme={null} SELECT account_id, account_name, SUM(revenue) as total_revenue, COUNT(DISTINCT contact_id) as contact_count FROM accounts JOIN contacts ON accounts.id = contacts.account_id WHERE created_at > '2024-01-01' GROUP BY account_id, account_name HAVING SUM(revenue) > 10000 ``` ## Best Practices * Use Query when you need JOINs, aggregations, or complex WHERE clauses that Get Data doesn't support * Specify **Result Fields** explicitly for predictable downstream behavior * Keep queries efficient - add WHERE clauses to limit the dataset size * Test your query directly in your DWH console before using it in a workflow ## Related Nodes * **[Get Data](/guide/nodes/data/get-data-node)** - simpler data fetching without writing SQL * **[Code Execution](/guide/nodes/code/code-execution-node)** - run Python code for transformations that SQL can't express * **[Transform](/guide/nodes/transform/transform-node)** - apply SQL expressions to data already in the workflow # Aggregation Source: https://docs.bondata.ai/guide/nodes/transform/aggregation-node Compute summary statistics like SUM, AVG, COUNT across grouped data Computes aggregation functions (SUM, AVG, COUNT, MIN, MAX, etc.) over grouped data. Typically used after a [Group By](/guide/nodes/transform/group-by-node) node to calculate summaries per group. ## Configuration | Setting | Description | | ----------------------- | ----------------------------------------------------------- | | **Aggregations** | Formula-based aggregation mappings (optional) | | **SQL Aggregations** | SQL-based aggregation mappings (optional) | | **Virtual Object Name** | Namespace prefix for output fields (default: `aggregation`) | ### Formula Aggregations | Setting | Description | | -------------- | -------------------------------------------------------------------------------- | | **Field Name** | Name for the aggregated field | | **Formula** | Aggregation expression using `SUM()`, `AVG()`, `COUNT()`, `MIN()`, `MAX()`, etc. | ### SQL Aggregations | Setting | Description | | ------------------ | --------------------------------- | | **Field Name** | Name for the aggregated field | | **SQL Expression** | DuckDB SQL aggregation expression | ## How It Works Place a [Group By](/guide/nodes/transform/group-by-node) node before this one to define how records should be grouped. Add one or more aggregation fields. Each computes a summary value across the records in each group. The aggregated fields become available as **Mentions** in downstream nodes. ## Output New aggregated columns are added, computed per group. Output fields are named `{virtual_object_name}.{field_name}`. ## Example Calculate total revenue and deal count per industry: 1. **Group By** → Industry 2. **Aggregation:** * `total_revenue` = `SUM({{Salesforce.Account.Revenue}})` * `deal_count` = `COUNT({{Salesforce.Account.Id}})` * `avg_deal_size` = `AVG({{Salesforce.Account.Revenue}})` ## Best Practices * Always place a **Group By** node before this node - aggregation without grouping produces a single result for the entire dataset * Nested functions and mathematical operations are supported (e.g., `SUM(field) / COUNT(field)`) * Use SQL aggregations for complex expressions ## Related Nodes * **[Group By](/guide/nodes/transform/group-by-node)** - required before Aggregation to define groups * **[Transform](/guide/nodes/transform/transform-node)** - compute per-row fields (not aggregations) * **[Split Group](/guide/nodes/transform/split-group-node)** - remove grouping after aggregation # Data Normalization Source: https://docs.bondata.ai/guide/nodes/transform/data-normalization-node Use an LLM to clean, standardize, and transform field values Uses an LLM to normalize and transform field values. Ideal for cleaning messy data - standardizing addresses, formatting names, converting units, or restructuring free-text fields. ## Configuration | Setting | Description | | ------------------- | -------------------------------------------------------------------------------------------------- | | **LLM Integration** | The AI provider to use (e.g., Gemini, OpenAI, Anthropic) | | **Field Mappings** | Connect input fields on the left to output fields on the right. Draw lines to define relationships | ## How It Works Select the fields from your data that need normalization (e.g., `BillingStreet`, `BillingCity`). Map each input to a normalized output field (e.g., `BillingStreet_Normalized`). The LLM processes each record and writes cleaned values to the output fields. ## Output Normalized output fields become available as **Mentions** in all downstream nodes. ## Example Standardize addresses across a Salesforce Account dataset: 1. Map `BillingStreet`, `BillingCity`, `BillingState` as inputs 2. Create normalized output fields for each 3. The LLM cleans formatting inconsistencies (e.g., "123 Main St." → "123 Main Street") ## Best Practices * Use specific, descriptive output field names to avoid confusion downstream * Test with a small batch first to verify the LLM produces the expected format * Choose the right LLM - faster models for simple formatting, stronger models for complex transformations ## Related Nodes * **[AI Enrichment](/guide/nodes/enrichment/ai-enrichment-node)** - uses an LLM prompt to generate new data rather than cleaning existing fields * **[Transform](/guide/nodes/transform/transform-node)** - applies rule-based transformations without an LLM * **[Regex Pattern](/guide/nodes/transform/regex-pattern-node)** - extracts or replaces text using regular expressions # Group By Source: https://docs.bondata.ai/guide/nodes/transform/group-by-node Group records by field values to control downstream processing and aggregation Groups records by a field value. This controls how downstream action nodes process records - creating one action per group instead of one batch for all records. It's also required before [Aggregation](/guide/nodes/transform/aggregation-node) to define what to aggregate over. ## Configuration | Setting | Description | | --------- | --------------------- | | **Field** | The field to group by | ### Common grouping strategies | Group by | Effect | | ------------------------------------------- | ----------------------- | | **Primary key** (e.g., Contact.Id) | One action per record | | **Category field** (e.g., Account.Industry) | One action per category | ## How It Works Select the field that defines how records should be grouped (e.g., group by Account ID, Region, or Status). Action nodes after this will create one action per group. Aggregation nodes will compute summaries per group. ## Output The data itself is unchanged - Group By only sets grouping metadata. Downstream nodes use this metadata to process records in groups rather than as a single batch. Without a Group By node, action nodes (Slack, Email, Create Record, etc.) produce a single batch action for all records, with field values concatenated. Add Group By to control granularity. ## Example Send one Slack message per account (instead of one batch message): 1. **Group By** → Salesforce.Account.Id 2. **Slack** → message template with account details Without Group By, Slack would send one message listing all accounts. ## Best Practices * Group by **primary key** when you need per-record actions (updates, notifications, record creation) * Group by **category field** when you need per-category summaries or actions * Always use Group By before action nodes if you want per-record behavior * Use [Split Group](/guide/nodes/transform/split-group-node) later in the workflow to remove grouping ## Related Nodes * **[Aggregation](/guide/nodes/transform/aggregation-node)** - compute summary statistics per group (SUM, AVG, COUNT) * **[Split Group](/guide/nodes/transform/split-group-node)** - remove grouping to return to single-batch processing * **[Sort](/guide/nodes/transform/sort-node)** - order records within groups # Head/Tail Source: https://docs.bondata.ai/guide/nodes/transform/head-tail-node Limit the dataset to the first or last N records Keeps only the first N or last N records from the dataset. Use it after sorting to get "top N" results, or to limit the size of data flowing downstream. ## Configuration | Setting | Description | | --------- | ----------------------------------------------------------------- | | **Value** | Number of records to keep (must be greater than 0) | | **Mode** | **Head** (first N records - default) or **Tail** (last N records) | ## How It Works Enter the number of records to keep. Select **Head** for the first N records or **Tail** for the last N. ## Output The first or last N records from the input. If the dataset has fewer records than the specified value, all records are kept. ## Example Get the top 10 accounts by revenue: 1. **Sort** → Revenue (descending) 2. **Head/Tail** → Value: 10, Mode: Head Result: only the 10 highest-revenue accounts flow downstream. ## Best Practices * Always **Sort** before Head/Tail if the order matters - without sorting, Head/Tail returns arbitrary records * Use Head to sample data during testing (e.g., limit to 5 records before an AI Enrichment node) * Use Tail to get the most recent records when data is sorted by date ## Related Nodes * **[Sort](/guide/nodes/transform/sort-node)** - order records before limiting with Head/Tail * **[Simple Filter](/guide/nodes/filter/simple-filter-node)** - filter by conditions rather than position # Regex Pattern Source: https://docs.bondata.ai/guide/nodes/transform/regex-pattern-node Classify, extract, detect, or multi-label records using regular expressions Applies regex patterns to field values for classification, extraction, detection, or multi-labeling. Use it to categorize records, pull out structured data from text, or flag records matching specific patterns. ## Configuration | Setting | Description | | ----------------------- | ------------------------------------------------------------------------- | | **Mode** | Operation mode: **Classify**, **Extract**, **Detect**, or **Multi-Label** | | **Input Field** | The field to apply regex patterns to | | **Case Insensitive** | Ignore case when matching (default: enabled) | | **Virtual Object Name** | Namespace prefix for output fields (default: `regex_pattern`) | ### Mode-specific settings **Classify** - first matching pattern assigns a label: | Setting | Description | | --------------------- | --------------------------------------------------- | | **Rules** | Ordered list of `{label, pattern, exclude_pattern}` | | **Output Field Name** | Name for the label column | | **Default Value** | Label when no pattern matches | **Extract** - capture groups pull out structured data: | Setting | Description | | ------------------- | ---------------------------------------------------------- | | **Extract Pattern** | Regex with capture groups | | **Extract Groups** | Map each group to `{group_index, output_field, cast_type}` | **Detect** - single pattern produces a boolean: | Setting | Description | | --------------------- | --------------------------- | | **Rules** | Single pattern rule | | **Output Field Name** | Name for the boolean column | **Multi-Label** - each pattern produces an independent boolean: | Setting | Description | | --------- | ------------------------------------------------------------------- | | **Rules** | List of `{label, pattern}` - each creates a separate boolean column | ## How It Works Select the operation that fits your use case - classification, extraction, detection, or multi-labeling. Choose which field to apply patterns to. Write regex patterns. For Classify and Multi-Label, add multiple rules with labels. ## Output Depends on the mode: * **Classify:** a single label column with the first matching category * **Extract:** one column per capture group, optionally cast to specific types * **Detect:** a single boolean column * **Multi-Label:** one boolean column per rule ## Examples ### Classify products by name * Mode: **Classify** * Input: Product Name * Rules: * Label "Electronics" → pattern `phone|laptop|tablet` * Label "Clothing" → pattern `shirt|pants|jacket` * Default: "Other" ### Extract price and currency * Mode: **Extract** * Input: Price Text (e.g., "USD 149.99") * Pattern: `([A-Z]{3})\s+(\d+\.\d+)` * Groups: group 1 → `currency` (str), group 2 → `amount` (float) ### Detect email addresses * Mode: **Detect** * Input: Notes field * Pattern: `[\w.-]+@[\w.-]+\.\w+` * Output: `has_email` (boolean) ## Best Practices * Use **Classify** for first-match-wins categorization (order rules from most specific to most general) * Use **Extract** when you need to pull structured data out of text * Use **Detect** for simple yes/no pattern presence checks * Use **Multi-Label** when a record can belong to multiple categories simultaneously * Test patterns on sample data before running on the full dataset ## Related Nodes * **[Transform](/guide/nodes/transform/transform-node)** - rule-based field computation without regex * **[Data Normalization](/guide/nodes/transform/data-normalization-node)** - LLM-powered text cleaning when regex is too rigid * **[AI Enrichment](/guide/nodes/enrichment/ai-enrichment-node)** - LLM-based classification when pattern matching isn't sufficient # Sort Source: https://docs.bondata.ai/guide/nodes/transform/sort-node Order records by field values in ascending or descending order Sorts all records by a selected field value. Use it to order data before downstream processing, reporting, or limiting with Head/Tail. ## Configuration | Setting | Description | | ----------------- | ------------------------------------------------------------------------ | | **Field** | The field to sort by | | **Reverse Order** | Sort descending (Z-A, 9-0) when enabled. Default is ascending (A-Z, 0-9) | ## How It Works Choose which field to sort by - supports text, numbers, and dates. Leave **Reverse Order** off for ascending (A-Z, oldest first, smallest first), or enable it for descending. ## Output All records in the same order as input, but reordered by the selected field. The sorted order is maintained by all downstream nodes. ## Example Sort accounts by revenue (highest first): * **Field:** Revenue * **Reverse Order:** enabled Combine with [Head/Tail](/guide/nodes/transform/head-tail-node) to get the top 10 highest-revenue accounts. ## Best Practices * Sort before Head/Tail to get meaningful "top N" or "bottom N" results * Sort before Export to CSV for reports that should be in a specific order * Sorting is stable - records with the same value maintain their relative order ## Related Nodes * **[Head/Tail](/guide/nodes/transform/head-tail-node)** - limit to first or last N records after sorting * **[Group By](/guide/nodes/transform/group-by-node)** - group records by field values (different from sorting) # Split Group Source: https://docs.bondata.ai/guide/nodes/transform/split-group-node Remove grouping to return records to single-batch processing Removes grouping metadata set by a [Group By](/guide/nodes/transform/group-by-node) node. Use it when you need per-record processing in one part of your workflow but batch processing in another. ## Configuration No configuration required. This node simply clears the grouping metadata. ## How It Works Add Split Group after the section of your workflow where per-group processing was needed. Downstream nodes will treat all records as a single collection again. ## Output The same records, with grouping metadata removed. Downstream action nodes will process all records as a single batch. ## Example Per-record updates followed by a single summary notification: 1. **Group By** → Contact.Id (one update per contact) 2. **Update Record** → update each contact individually 3. **Split Group** → remove grouping 4. **Slack** → one summary message about all updated contacts ## Related Nodes * **[Group By](/guide/nodes/transform/group-by-node)** - sets the grouping that Split Group removes * **[Aggregation](/guide/nodes/transform/aggregation-node)** - computes summaries per group before ungrouping # Transform Source: https://docs.bondata.ai/guide/nodes/transform/transform-node Create computed fields using formula expressions or SQL Creates new computed fields by applying formula expressions or raw SQL to your data. Use it for calculations, string operations, conditionals, and any rule-based transformation that doesn't require an LLM. ## Configuration | Setting | Description | | ----------------------- | --------------------------------------------------------- | | **Transforms** | Formula-based field mappings (optional) | | **SQL Transforms** | DuckDB SQL-based field mappings (optional) | | **Virtual Object Name** | Namespace prefix for output fields (default: `transform`) | ### Formula Transforms | Setting | Description | | -------------- | ------------------------------------------------------ | | **Field Name** | Name for the new computed field | | **Formula** | Expression using `{{Integration.Entity.Field}}` syntax | ### SQL Transforms | Setting | Description | | ------------------ | ------------------------------- | | **Field Name** | Name for the new computed field | | **SQL Expression** | DuckDB SQL expression | ## How It Works Define one or more new fields. For each, provide a name and either a formula or SQL expression. Use `{{Integration Label.Entity.Field}}` syntax to reference existing fields in your formulas. Virtual fields from earlier nodes use `{{virtual.node_name.field_name}}`. Later mappings within the same node can reference fields created by earlier mappings. ## Output New computed columns are added to each record, named as `{virtual_object_name}.{field_name}`. These become available as **Mentions** in downstream nodes. ## Example Calculate deal value and categorize: * **Field 1:** `deal_value` = `{{Salesforce.Opportunity.Amount}} * {{Salesforce.Opportunity.Probability}}` * **Field 2 (SQL):** `tier` = `CASE WHEN deal_value > 100000 THEN 'Enterprise' WHEN deal_value > 10000 THEN 'Mid-Market' ELSE 'SMB' END` ## Best Practices * Use formulas for simple arithmetic and string operations * Use SQL transforms for complex logic (CASE statements, string functions, date math) * Give fields descriptive names - they appear as Mentions throughout your workflow * Later fields can reference earlier fields defined in the same Transform node ## Related Nodes * **[Data Normalization](/guide/nodes/transform/data-normalization-node)** - uses an LLM for intelligent cleaning instead of rule-based formulas * **[Aggregation](/guide/nodes/transform/aggregation-node)** - computes summary statistics (SUM, AVG, COUNT) across groups * **[Code Execution](/guide/nodes/code/code-execution-node)** - run custom Python code for transformations that go beyond formulas and SQL # Sticky Note Source: https://docs.bondata.ai/guide/nodes/utility/sticky-note-node Add annotations and documentation to your workflow canvas Adds a colored note to the workflow canvas for documentation purposes. Sticky notes are non-executable - they don't process data or affect the workflow. Use them to explain logic, mark review items, or document business rules. ## Configuration | Setting | Description | | ----------- | ---------------------------------------------------------------------- | | **Content** | Text content of the note | | **Color** | Note color: **Yellow** (default), Blue, Green, Pink, Purple, or Orange | ## How It Works Add a Sticky Note anywhere on the canvas. Write your annotation and choose a color to visually organize your notes. ## Output None. Sticky notes are purely visual and do not affect the workflow execution. ## Best Practices * Use sticky notes to explain complex branching logic or non-obvious business rules * Color-code notes by purpose (e.g., yellow for explanations, pink for TODOs, green for approved sections) * Place notes near the nodes they describe * Keep notes concise - they're quick reminders, not full documentation # Settings & Usage Source: https://docs.bondata.ai/guide/settings/settings Customize your BonData experience and monitor platform usage Access settings by clicking **Settings** in the bottom of the sidebar. Here you can customize the look and feel of BonData and track your usage. ## Appearance Choose your preferred theme for the application. BonData offers 8 theme options to match your working environment. ### Standard themes | Theme | Description | | ---------- | ---------------------------------------- | | **Light** | Light theme for bright environments | | **Dark** | Dark theme for low-light environments | | **System** | Follows your operating system preference | ### More options | Theme | Description | | --------------- | -------------------------------------------- | | **Light Dim** | Softer light theme for long reading sessions | | **Light Sepia** | Warm, document-friendly theme | | **Dark Dimmed** | GitHub-style soft dark theme | | **Dark Ocean** | Cool blue-gray modern dashboard | | **Dark Forest** | Green accents for calm reading | ## Usage Breakdown Monitor how much data BonData is processing across your integrations. Go to **Settings > Usage** to see a summary and trends. The usage dashboard shows: * **Integration Fetched Objects** - total number of objects fetched across all integrations, with a per-entity breakdown showing which entities consume the most * **Node Run Processed Records** - total records processed by Agent node runs * **Usage Trends (30 days)** - a chart showing how your usage has changed over the past month Use the time range selector in the top right to filter by **1 week**, **30 days**, or custom periods. Review your usage regularly to identify integrations or entities that are consuming more resources than expected. You can deactivate unused entities from the integration settings to reduce usage. # Anthropic Source: https://docs.bondata.ai/integrations/ai-llm/anthropic Connect BonData to your Anthropic account to track Claude API usage and costs Anthropic is an AI safety company and the creator of the Claude family of language models. With BonData, you can use Claude models in your Agent workflows for AI enrichment, data normalization, and content generation - known for strong instruction-following and nuanced reasoning. ## Anthropic API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [Anthropic Console](https://console.anthropic.com/) 2. Sign in to your account 3. Navigate to **Settings** → **API Keys** ### Step 2: Create an API Key 1. Click **Create Key** 2. Enter a name (e.g., `BonData Integration`) 3. Click **Create Key** 4. **Copy the key immediately** - it starts with `sk-ant-` and won't be shown again ### Step 3: Enter Credentials Enter your Anthropic API key in BonData. API usage is billed to your Anthropic account. Monitor usage in the Console dashboard. ## Required Fields | Field | Description | | ------- | ---------------------------------------------------- | | API Key | API key from Anthropic Console → Settings → API Keys | # Cohere Source: https://docs.bondata.ai/integrations/ai-llm/cohere Connect BonData to your Cohere account for AI-powered workflows Cohere is an enterprise AI platform specializing in language models for business applications, including text generation, classification, and semantic search. With BonData, you can use Cohere's Command models in your Agent workflows for AI enrichment and content generation - designed with enterprise use cases in mind. ## Cohere API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [Cohere Dashboard](https://dashboard.cohere.com/) 2. Sign in to your account 3. Navigate to **API Keys** ### Step 2: Create an API Key 1. Click **Create API key** 2. Enter a name (e.g., `BonData Integration`) 3. **Copy the key immediately** - it won't be shown again ### Step 3: Enter Credentials Enter your Cohere API key in BonData. API usage is billed to your Cohere account. Monitor usage in the Dashboard. ## Required Fields | Field | Description | | ------- | ------------------------------------------- | | API Key | Secret key from Cohere Dashboard → API Keys | # DeepSeek Source: https://docs.bondata.ai/integrations/ai-llm/deepseek Connect BonData to your DeepSeek account for AI-powered workflows DeepSeek is a Chinese AI research company known for its high-performance open-source language models. With BonData, you can use DeepSeek models in your Agent workflows for AI enrichment, data normalization, and content generation - offering strong reasoning capabilities at competitive pricing. ## DeepSeek API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [DeepSeek Platform](https://platform.deepseek.com/) 2. Sign in to your account 3. Navigate to **API keys** ### Step 2: Create an API Key 1. Click **Create new API key** 2. Enter a name (e.g., `BonData Integration`) 3. **Copy the key immediately** - it starts with `sk-` and won't be shown again ### Step 3: Enter Credentials Enter your DeepSeek API key in BonData. API usage is billed to your DeepSeek account. Monitor usage in your dashboard to avoid unexpected charges. ## Required Fields | Field | Description | | ------- | -------------------------------------------- | | API Key | Secret key from DeepSeek Platform → API keys | # Fireworks AI Source: https://docs.bondata.ai/integrations/ai-llm/fireworks-ai Connect BonData to your Fireworks AI account for AI-powered workflows Fireworks AI is a high-speed inference platform optimized for running open-source and fine-tuned AI models with low latency. With BonData, you can use Fireworks AI in your Agent workflows for AI enrichment, data normalization, and content generation - ideal when speed and throughput matter. ## Fireworks AI API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [Fireworks AI Dashboard](https://fireworks.ai/) 2. Sign in to your account 3. Navigate to **API Keys** ### Step 2: Create an API Key 1. Click **Create API key** 2. Enter a name (e.g., `BonData Integration`) 3. **Copy the key immediately** - it starts with `fw_` and won't be shown again ### Step 3: Enter Credentials Enter your Fireworks AI API key in BonData. API usage is billed to your Fireworks AI account. Monitor usage in your dashboard. ## Required Fields | Field | Description | | ------- | ------------------------------------------------- | | API Key | Secret key from Fireworks AI Dashboard → API Keys | # Google AI (Gemini) Source: https://docs.bondata.ai/integrations/ai-llm/gemini Connect BonData to your Google AI account to track Gemini API usage Google AI (Gemini) is Google's multimodal AI platform powering the Gemini family of models. With BonData, you can use Gemini models in your Agent workflows for AI enrichment, data normalization, and content generation - with deep integration across Google's ecosystem. ## Google AI API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access Google AI Studio 1. Go to [Google AI Studio](https://aistudio.google.com/) 2. Sign in with your Google account ### Step 2: Create an API Key 1. Click **Get API key** in the left sidebar 2. Click **Create API key** 3. Select a Google Cloud project (or create one) 4. **Copy the API key** - it starts with `AIza` ### Step 3: Enter Credentials Enter your Google AI API key in BonData. Keep your API key secure. Do not share it publicly or commit it to version control. ## Required Fields | Field | Description | | ------- | ----------------------------- | | API Key | API key from Google AI Studio | # Groq Source: https://docs.bondata.ai/integrations/ai-llm/groq Connect BonData to your Groq account for high-speed AI inference Groq is an AI inference company known for ultra-fast model execution powered by custom LPU (Language Processing Unit) hardware. With BonData, you can use Groq in your Agent workflows for AI enrichment and content generation - delivering some of the fastest inference speeds available. ## Groq API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [Groq Console](https://console.groq.com/) 2. Sign in to your account 3. Navigate to **API Keys** ### Step 2: Create an API Key 1. Click **Create API key** 2. Enter a name (e.g., `BonData Integration`) 3. **Copy the key immediately** - it starts with `gsk_` and won't be shown again ### Step 3: Enter Credentials Enter your Groq API key in BonData. API usage is billed to your Groq account. Monitor usage in the Console dashboard. ## Required Fields | Field | Description | | ------- | --------------------------------------- | | API Key | Secret key from Groq Console → API Keys | # Mistral AI Source: https://docs.bondata.ai/integrations/ai-llm/mistral Connect BonData to your Mistral AI account for AI-powered workflows Mistral AI is a French AI company building efficient, high-performance language models. With BonData, you can use Mistral models in your Agent workflows for AI enrichment, data normalization, and content generation - known for strong multilingual support and competitive performance-to-cost ratio. ## Mistral AI API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [Mistral AI Console](https://console.mistral.ai/) 2. Sign in to your account 3. Navigate to **API keys** ### Step 2: Create an API Key 1. Click **Create new key** 2. Enter a name (e.g., `BonData Integration`) 3. **Copy the key immediately** - it won't be shown again ### Step 3: Enter Credentials Enter your Mistral AI API key in BonData. API usage is billed to your Mistral AI account. Monitor usage in the Console dashboard. ## Required Fields | Field | Description | | ------- | --------------------------------------------- | | API Key | Secret key from Mistral AI Console → API keys | # Ollama Source: https://docs.bondata.ai/integrations/ai-llm/ollama Connect BonData to your self-hosted Ollama instance for local AI model inference Ollama is an open-source tool for running large language models locally on your own hardware. With BonData, you can connect to a self-hosted Ollama instance to use local models in your Agent workflows - giving you full control over your data and infrastructure with no third-party API costs. ## Ollama Connection Setup Follow these steps to connect BonData to your Ollama server. ### Step 1: Ensure Ollama is Accessible Your Ollama server must be reachable from the internet. By default, Ollama runs on port `11434`. 1. Verify your server is running and accessible at its public URL 2. Test the connection by visiting `https://your-server.com:11434/api/tags` - you should see a JSON response listing available models ### Step 2: Enter Connection Details Enter your Ollama server URL in BonData (e.g., `https://ollama.your-server.com:11434`). Your Ollama server must have a public URL reachable from the internet. Local-only instances (e.g., `localhost`) will not work. No API key is required - Ollama uses the server URL for authentication. ## Required Fields | Field | Description | | -------- | ------------------------------------------------------------------------------- | | Host URL | Public URL of your Ollama server (e.g., `https://ollama.your-server.com:11434`) | # OpenAI Source: https://docs.bondata.ai/integrations/ai-llm/openai Connect BonData to your OpenAI account to track GPT API usage and costs OpenAI is the creator of the GPT family of large language models, including GPT-4o and GPT-4o mini. With BonData, you can use OpenAI models in your Agent workflows for AI enrichment, data normalization, and content generation. ## OpenAI API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [OpenAI Platform](https://platform.openai.com/) 2. Sign in to your account 3. Click your profile icon → **View API keys** ### Step 2: Create an API Key 1. Click **Create new secret key** 2. Enter a name (e.g., `BonData Integration`) 3. Click **Create secret key** 4. **Copy the key immediately** - it starts with `sk-` and won't be shown again ### Step 3: Enter Credentials Enter your OpenAI API key in BonData. API usage is billed to your OpenAI account. Set usage limits in your account settings to avoid unexpected charges. ## Required Fields | Field | Description | | ------- | ------------------------------------------ | | API Key | Secret key from OpenAI Platform → API keys | # OpenRouter Source: https://docs.bondata.ai/integrations/ai-llm/openrouter Connect BonData to your OpenRouter account to access multiple AI models through a single API OpenRouter is a unified API gateway that provides access to hundreds of AI models from multiple providers - including OpenAI, Anthropic, Google, Meta, and more - through a single API key. With BonData, you can use OpenRouter in your Agent workflows to switch between models without managing separate integrations. ## OpenRouter API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [OpenRouter Dashboard](https://openrouter.ai/) 2. Sign in to your account 3. Navigate to **Keys** ### Step 2: Create an API Key 1. Click **Create Key** 2. Enter a name (e.g., `BonData Integration`) 3. **Copy the key immediately** - it starts with `sk-or-` and won't be shown again ### Step 3: Enter Credentials Enter your OpenRouter API key in BonData. OpenRouter provides access to models from multiple providers through a single API. Usage is billed based on the model you select. Monitor costs in your OpenRouter dashboard. ## Required Fields | Field | Description | | ------- | ------------------------------------------- | | API Key | Secret key from OpenRouter Dashboard → Keys | # Perplexity Source: https://docs.bondata.ai/integrations/ai-llm/perplexity Connect BonData to your Perplexity account for AI-powered workflows Perplexity is an AI-powered answer engine that combines large language models with real-time web search. With BonData, you can use Perplexity's Sonar models in your Agent workflows - ideal for tasks that benefit from up-to-date web knowledge, such as company research and market analysis. ## Perplexity API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [Perplexity Settings](https://www.perplexity.ai/settings) 2. Sign in to your account 3. Navigate to **API** ### Step 2: Create an API Key 1. Click **Generate** to create a new API key 2. **Copy the key immediately** - it starts with `pplx-` and won't be shown again ### Step 3: Enter Credentials Enter your Perplexity API key in BonData. API usage is billed to your Perplexity account. Check your usage and billing in Settings → API. ## Required Fields | Field | Description | | ------- | ----------------------------------------- | | API Key | Secret key from Perplexity Settings → API | # Together AI Source: https://docs.bondata.ai/integrations/ai-llm/together-ai Connect BonData to your Together AI account for AI-powered workflows Together AI is a cloud platform for running open-source AI models at scale, including Llama, Mistral, and other popular architectures. With BonData, you can use Together AI in your Agent workflows for AI enrichment and content generation - giving you access to a wide catalog of models through a single integration. ## Together AI API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [Together AI Dashboard](https://api.together.xyz/) 2. Sign in to your account 3. Navigate to **Settings** → **API Keys** ### Step 2: Create an API Key 1. Click **Create API key** 2. Enter a name (e.g., `BonData Integration`) 3. **Copy the key immediately** - it won't be shown again ### Step 3: Enter Credentials Enter your Together AI API key in BonData. API usage is billed to your Together AI account. Monitor usage in your dashboard. ## Required Fields | Field | Description | | ------- | ----------------------------------------------------------- | | API Key | Secret key from Together AI Dashboard → Settings → API Keys | # xAI (Grok) Source: https://docs.bondata.ai/integrations/ai-llm/xai Connect BonData to your xAI account for AI-powered workflows with Grok xAI is an AI company founded by Elon Musk, building the Grok family of large language models. With BonData, you can use Grok models in your Agent workflows for AI enrichment, data normalization, and content generation - offering real-time knowledge and strong analytical capabilities. ## xAI API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Go to [xAI Console](https://console.x.ai/) 2. Sign in to your account 3. Navigate to **API keys** ### Step 2: Create an API Key 1. Click **Create API key** 2. Enter a name (e.g., `BonData Integration`) 3. **Copy the key immediately** - it starts with `xai-` and won't be shown again ### Step 3: Enter Credentials Enter your xAI API key in BonData. API usage is billed to your xAI account. Monitor usage in the Console dashboard. ## Required Fields | Field | Description | | ------- | -------------------------------------- | | API Key | Secret key from xAI Console → API keys | # Power BI Source: https://docs.bondata.ai/integrations/analytics/powerbi Connect BonData to Microsoft Power BI for workspaces, datasets, reports, and dataset rows Microsoft Power BI is a business analytics platform for building interactive reports and dashboards on top of governed semantic models. With BonData, you can connect to your Power BI tenant to read workspace metadata and query dataset rows within Agent workflows. ## Power BI Azure AD OAuth 2.0 Setup Follow these steps to register an app in Microsoft Entra ID (Azure AD) and authorize it against the Power BI REST API. ### Step 1: Register an App in Entra ID 1. Go to the [Azure Portal](https://portal.azure.com/) and open **Microsoft Entra ID** (formerly Azure Active Directory) 2. Navigate to **App registrations** → **New registration** 3. Configure: * **Name**: `BonData Integration` * **Supported account types**: Accounts in this organizational directory only * **Redirect URI**: Web - `https://app.bondata.ai/auth/oauth2/callback` 4. Click **Register** 5. On the **Overview** page, copy the **Application (client) ID** and **Directory (tenant) ID** ### Step 2: Grant Power BI Service API Permissions 1. Go to **API permissions** → **Add a permission** 2. Select **Power BI Service** 3. Choose **Delegated permissions** and add `Tenant.Read.All`, `Dataset.Read.All`, `Report.Read.All`, and `Workspace.Read.All` 4. Click **Add permissions**, then **Grant admin consent** (requires a tenant administrator) To read dataset table rows over the XMLA endpoint, an administrator must enable **XMLA endpoint** read access in the Power BI Admin portal under **Tenant settings** → **Integration settings**. This requires a Premium or Fabric capacity. ### Step 3: Create a Client Secret 1. Go to **Certificates & secrets** → **Client secrets** 2. Click **New client secret**, add a description, and select an expiration 3. **Copy the secret value immediately** - it is only shown once ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Power BI** 2. Enter your **Tenant ID**, **Client ID**, and **Client Secret** 3. Click **Connect** ## Required Fields | Field | Description | | ------------- | ---------------------------------------------------------- | | Tenant ID | Directory (tenant) ID from the Entra ID app registration | | Client ID | Application (client) ID from the Entra ID app registration | | Client Secret | Client secret value created under Certificates & secrets | ## Available Data Once connected, BonData can sync the following Power BI data via the Power BI REST API and XMLA endpoint: * **Workspaces** - Workspace (group) metadata including capacity assignment and access * **Datasets** - Semantic models with configured tables, refresh schedules, and data sources * **Reports** - Report definitions and their associated datasets * **Dashboards** - Dashboards and their pinned tiles * **Dataflows** - Dataflow definitions and entity metadata * **Dataset Table Rows** - Row-level data queried from dataset tables via the XMLA endpoint # Tableau Source: https://docs.bondata.ai/integrations/analytics/tableau Connect BonData to Tableau for workbooks, views, data sources, and extract data Tableau is a visual analytics platform for exploring, publishing, and sharing interactive dashboards across Tableau Server and Tableau Cloud. With BonData, you can connect to your Tableau site to read content metadata and pull view and data-source data within Agent workflows. ## Tableau Personal Access Token Setup Follow these steps to create a Personal Access Token (PAT) and connect it to BonData. ### Step 1: Create a Personal Access Token 1. Sign in to your **Tableau Server** or **Tableau Cloud** site 2. Click your profile icon in the top-right and select **My Account Settings** 3. Scroll to **Personal Access Tokens** 4. Enter a **Token Name** (e.g., `BonData Integration`) and click **Create Token** 5. **Copy the token secret immediately** - it is only shown once Personal Access Tokens inherit the permissions of the user who created them. Create the token under a service account with access to the projects and content you want BonData to sync. ### Step 2: Note Your Server URL and Site ID 1. Your **Server URL** is the base address of your Tableau environment, for example `https://10ax.online.tableau.com` (Tableau Cloud) or `https://tableau.yourcompany.com` (Tableau Server) 2. Your **Site ID** is the content URL that appears after `/site/` in the browser address bar. For the default site on Tableau Server this may be blank On Tableau Cloud the Site ID is never blank - copy the value shown in the URL between `/site/` and the next `/`. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Tableau** 2. Enter your **Server URL**, **Site ID**, **Token Name**, and **Token Secret** 3. Click **Connect** ## Required Fields | Field | Description | | ------------ | ------------------------------------------------------------------------------------------------ | | Server URL | Base URL of your Tableau Server or Tableau Cloud environment | | Site ID | Content URL of the site (the value after `/site/`); blank for the default site on Tableau Server | | Token Name | Name of the Personal Access Token created in My Account Settings | | Token Secret | Secret value shown once when the token is created | ## Available Data Once connected, BonData can sync the following Tableau data via the Tableau REST and Metadata APIs: * **Workbooks** - Published workbooks with owner, project, and revision metadata * **Views** - Sheets and dashboards within workbooks, including view image and usage data * **Data Sources** - Published data sources with connection and refresh details * **Projects** - Project hierarchy and content organization * **Users** - Site users, their roles, and group memberships * **Extract Data** - Underlying view and data-source extract data retrieved via the REST API # Asana Source: https://docs.bondata.ai/integrations/business-apps/asana Connect BonData to Asana to sync projects, tasks, and team data Asana is a work management platform teams use to organize, track, and manage projects, tasks, and workflows. With BonData, you can connect to your Asana account to read, enrich, and sync your work management data within Agent workflows. ## Asana Personal Access Token Setup Follow these steps to get your Asana credentials for BonData. ### Step 1: Open Your Developer Settings 1. Log in to [Asana](https://app.asana.com/) 2. Click your profile photo in the top-right corner and select **Settings** 3. Open the **Apps** tab 4. Click **Manage Developer Apps** ### Step 2: Create a Personal Access Token 1. On the developer console, find the **Personal access tokens** section 2. Click **Create new token** 3. Give the token a descriptive name (e.g., `BonData Integration`) 4. Read and agree to the API terms 5. Click **Create token** 6. **Copy the token immediately** - it is only shown once Personal access tokens inherit the permissions of the user who created them. To sync a specific workspace, make sure that user is a member of it. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Asana** 2. Enter your **Personal Access Token** 3. Click **Connect** ## Required Fields | Field | Description | | --------------------- | --------------------------------------------------------------- | | Personal Access Token | Token generated from Asana developer console (My Access Tokens) | ## Available Data Once connected, BonData can sync the following Asana objects: * **Projects** - Projects with owners, status, and custom fields * **Tasks** - Tasks with assignees, due dates, dependencies, and completion state * **Sections** - Sections that group tasks within a project or board * **Users** - Workspace members and their profile details * **Teams** - Teams and their membership within an organization * **Tags** - Tags used to categorize tasks across projects * **Stories** - Comments and activity history on tasks * **Portfolios** - Portfolios that roll up projects for reporting # BigTime Source: https://docs.bondata.ai/integrations/business-apps/bigtime Connect BonData to BigTime for time tracking and billing data BigTime is a professional services automation (PSA) platform for time tracking, billing, project management, and resource planning. With BonData, you can connect to your BigTime account to read and analyze time, billing, and project data within Agent workflows. ## BigTime API Setup Follow these steps to connect BonData to BigTime. ### Step 1: Get Your API Credentials 1. Log in to [BigTime](https://iq.bigtime.net/) 2. Go to **My Company** → **Company Details** 3. Navigate to the **API** section 4. Note your **Username** and **Password** for API access API credentials may be different from your login credentials. Contact your BigTime administrator if you don't have API access. ### Step 2: Enter Credentials Enter your BigTime username and password in BonData. ## Required Fields | Field | Description | | -------- | ------------------------- | | Username | Your BigTime API username | | Password | Your BigTime API password | # Coupa Source: https://docs.bondata.ai/integrations/business-apps/coupa Connect BonData to Coupa for spend management and procurement data Coupa is a business spend management platform covering procurement, invoicing, expenses, and supplier management. With BonData, you can connect to your Coupa account to read, enrich, and sync your spend management data within Agent workflows. ## Coupa OAuth Setup BonData connects to Coupa using OAuth 2.0 client credentials against the Core API. ### Step 1: Find Your Instance URL Your Coupa instance URL is the address you use to log in, in the format: * `https://yourcompany.coupahost.com` ### Step 2: Create an OAuth Client 1. Log in to Coupa as an administrator 2. Go to **Setup** → **Integrations** → **OAuth2/OIDC Clients** 3. Click **Create** 4. Select **Grant Type: Client Credentials** 5. Choose the **Scopes** for the objects you want to sync (for example `core.supplier.read`, `core.purchase_order.read`, `core.invoice.read`) 6. Click **Save** 7. **Copy the Client ID (Identifier) and Client Secret** - the secret is only shown once Some older Coupa tenants use a static API Key instead of OAuth. If your admin provides an API Key from **Setup** → **Integrations** → **API Keys**, you can use it in place of the OAuth client. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Coupa** 2. Enter your **Instance URL**, **Client ID**, and **Client Secret** 3. Click **Connect** ## Required Fields | Field | Description | | ------------- | --------------------------------------------- | | Instance URL | Your Coupa instance URL | | Client ID | Client identifier from the OAuth2/OIDC client | | Client Secret | Client secret from the OAuth2/OIDC client | | Field | Description | | ------------ | ---------------------------------------------------- | | Instance URL | Your Coupa instance URL | | API Key | API Key generated in Setup → Integrations → API Keys | ## Available Data Once connected, BonData can sync the following Coupa objects: * **Suppliers** - Supplier master records and contacts * **Purchase Orders** - Purchase orders and their lines * **Invoices** - Supplier invoices and approval status * **Requisitions** - Purchase requisitions * **Expenses** - Expense reports and lines * **Contracts** - Supplier contracts and terms # Dynamics 365 Source: https://docs.bondata.ai/integrations/business-apps/dynamics Connect BonData to Microsoft Dynamics 365 CRM Microsoft Dynamics 365 is an enterprise suite of CRM and ERP applications for sales, customer service, finance, and operations. With BonData, you can connect to your Dynamics 365 environment to read, enrich, and sync your business data within Agent workflows. BonData supports two authentication methods for Dynamics 365. For user-delegated access For service-to-service integration *** ## OAuth Authentication Follow these steps to configure OAuth authentication for BonData. ### Step 1: Register an App in Azure AD 1. Go to [Azure Portal](https://portal.azure.com/) 2. Navigate to **Azure Active Directory** → **App registrations** 3. Click **New registration** 4. Configure: * **Name**: `BonData Integration` * **Supported account types**: Accounts in any organizational directory * **Redirect URI**: Web - `https://app.bondata.ai/auth/oauth2/callback` 5. Click **Register** ### Step 2: Configure API Permissions 1. Go to **API permissions** → **Add a permission** 2. Select **Dynamics CRM** 3. Choose **Delegated permissions** and select `user_impersonation` 4. Click **Add permissions** 5. Click **Grant admin consent** (requires admin) ### Step 3: Create Client Secret 1. Go to **Certificates & secrets** → **Client secrets** 2. Click **New client secret** 3. Add a description and select expiration 4. **Copy the secret value immediately** - it won't be shown again ### Step 4: Note Your Credentials * **Client ID**: Found on the Overview page (Application ID) * **Client Secret**: The value you just copied ### Step 5: Get Your Dynamics URL Your Dynamics 365 URL is in the format: * `https://yourorg.crm.dynamics.com` ### Step 6: Enter Credentials Enter your Dynamics URL in BonData, then click Connect to authorize via OAuth. ### Required Fields (OAuth) | Field | Description | | ----- | --------------------------------- | | URL | Your Dynamics 365 environment URL | *** ## Application User Follow these steps to create an application user for BonData. ### Step 1: Register an App in Azure AD 1. Go to [Azure Portal](https://portal.azure.com/) 2. Navigate to **Azure Active Directory** → **App registrations** 3. Click **New registration** 4. Enter a name (e.g., `BonData Integration`) 5. Select **Accounts in this organizational directory only** 6. Click **Register** ### Step 2: Get App Credentials 1. Note the **Application (client) ID** - this is your Client ID 2. Note the **Directory (tenant) ID** - this is your Tenant ID 3. Go to **Certificates & secrets** → **Client secrets** 4. Click **New client secret** 5. Add a description and select expiration 6. **Copy the secret value immediately** - it won't be shown again ### Step 3: Create Application User in Dynamics 1. Go to [Power Platform Admin Center](https://admin.powerplatform.microsoft.com/) 2. Select your environment → **Settings** → **Users + permissions** → **Application users** 3. Click **New app user** 4. Add the app you registered 5. Assign appropriate security roles ### Step 4: Get Your Dynamics URL Your Dynamics 365 URL is in the format: * `https://yourorg.crm.dynamics.com` (North America) * `https://yourorg.crm4.dynamics.com` (EMEA) ### Step 5: Enter Credentials Enter your Tenant ID, Client ID, Client Secret, and Dynamics URL in BonData. ### Required Fields (Application User) | Field | Description | | ------------- | ------------------------------------------------------ | | Tenant ID | Directory (tenant) ID from Azure AD app registration | | Client ID | Application (client) ID from Azure AD app registration | | Client Secret | Client secret from Azure AD app registration | | URL | Your Dynamics 365 environment URL | # Epicor Source: https://docs.bondata.ai/integrations/business-apps/epicor Connect BonData to Epicor Kinetic ERP for manufacturing and distribution data Epicor Kinetic is a cloud ERP platform for manufacturers and distributors, covering production, inventory, sales, and finance. With BonData, you can connect to your Epicor account to read, enrich, and sync your ERP data within Agent workflows. ## Epicor API Key Setup BonData connects to Epicor Kinetic through the REST API using an API Key together with a service user for Basic authentication. ### Step 1: Find Your Base URL Your Epicor REST base URL follows this format: * `https://yourserver/EpicorERP/api/v2/odata/{company}` Ask your Epicor administrator for the correct server host and company ID. ### Step 2: Create an API Key 1. Log in to the **Epicor Admin Console** (or Application Server Configuration) 2. Open **API Key Management** 3. Click **New** and enter a name (e.g., `BonData Integration`) 4. Select the REST endpoints and version the key can access 5. Save and **copy the generated API Key** ### Step 3: Create a Service User 1. In Epicor, go to **System Setup** → **Security Maintenance** → **User Account Security Maintenance** 2. Create or select a dedicated integration user 3. Set a strong password and grant access to the required companies and business objects Epicor requires both an API Key and Basic auth credentials on every REST request. The service user determines which records and companies you can read. ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Epicor** 2. Enter your **Base URL**, **API Key**, **Username**, and **Password** 3. Click **Connect** ## Required Fields | Field | Description | | -------- | --------------------------------------------------- | | Base URL | Your Epicor REST API base URL including the company | | API Key | API Key from Epicor API Key Management | | Username | Epicor service user name | | Password | Epicor service user password | ## Available Data Once connected, BonData can sync the following Epicor objects: * **Customers** - Customer master records * **Parts** - Part master and inventory records * **Sales Orders** - Sales orders and their release lines * **Jobs** - Production jobs and operations * **Purchase Orders** - Purchase orders and receipts * **Suppliers** - Supplier (vendor) records * **Invoices** - AR invoices and balances # InsCipher Source: https://docs.bondata.ai/integrations/business-apps/inscipher Connect BonData to InsCipher for surplus lines tax compliance data InsCipher is a surplus lines insurance tax compliance platform that automates tax calculation, filing, and reporting for wholesale brokers and carriers. With BonData, you can connect to your InsCipher account to read, enrich, and sync your surplus lines compliance data within Agent workflows. ## InsCipher API Key Setup BonData connects to InsCipher using an API Key. ### Step 1: Open Your Account Settings 1. Log in to your [InsCipher](https://www.inscipher.com/) account 2. Open the **Settings** area from the account menu 3. Select the **API** or **Developer** section ### Step 2: Generate an API Key 1. Click **Generate API Key** (or contact your InsCipher account manager if API access is not enabled) 2. Give the key a descriptive name (e.g., `BonData Integration`) 3. **Copy the API Key** - it may only be shown once API access is tied to your InsCipher plan. If you do not see the API section, ask your InsCipher account manager to enable API access for your organization. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **InsCipher** 2. Enter your **API Key** 3. Click **Connect** ## Required Fields | Field | Description | | ------- | ------------------------------------------------------ | | API Key | API Key generated from your InsCipher account settings | ## Available Data Once connected, BonData can sync the following InsCipher data: * **Policies** - Surplus lines policies and their details * **Transactions** - Policy transactions including new business, endorsements, and cancellations * **Tax Filings** - Surplus lines tax filings and their status * **Jurisdictions** - State jurisdictions and their filing requirements * **Stamping Fees** - Stamping office fees and calculated tax amounts # Jira Source: https://docs.bondata.ai/integrations/business-apps/jira Connect BonData to Atlassian Jira for issue tracking data Jira by Atlassian is a leading project management and issue tracking tool used by software teams to plan, track, and release software. With BonData, you can connect to your Jira instance to read and analyze project data, track issues, and enrich records within Agent workflows. ## Jira API Token Setup Follow these steps to create an API token for BonData. ### Step 1: Create an API Token 1. Go to [Atlassian Account Settings](https://id.atlassian.com/manage-profile/security/api-tokens) 2. Click **Create API token** 3. Enter a label (e.g., `BonData Integration`) 4. Click **Create** 5. **Copy the token** - it won't be shown again ### Step 2: Get Your Jira Site URL Your site URL is your Atlassian domain: * Example: `https://your-company.atlassian.net` ### Step 3: Find Your Project Key The project key is the prefix of your issue IDs: * If issues look like `PROJ-123`, the project key is `PROJ` * Find it in **Project Settings** → **Details** ### Step 4: Enter Credentials Enter your email (Atlassian account), API token, site URL, and project key in BonData. ## Required Fields | Field | Description | | ------------- | ------------------------------------------------------------------------------------------------------- | | Email | Your Atlassian account email | | API Token | Generated from Atlassian account settings | | Jira Site URL | Your Jira Cloud site URL (e.g., [https://your-domain.atlassian.net](https://your-domain.atlassian.net)) | | Project Key | The prefix of your issue IDs (e.g., PROJ from PROJ-123) | # Linear Source: https://docs.bondata.ai/integrations/business-apps/linear Connect BonData to Linear for issue tracking data Linear is a modern project management tool built for speed, designed for product and engineering teams to plan, track, and ship software. With BonData, you can connect to your Linear workspace to read and analyze issues, projects, and team data within Agent workflows. ## Linear API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Log in to [Linear](https://linear.app) 2. Click on your profile picture in the bottom-left corner 3. Select **Settings** 4. Go to **API** under **My Account** ### Step 2: Create a Personal API Key 1. Under **Personal API keys**, click **Create key** 2. Enter a label (e.g., `BonData Integration`) 3. Click **Create** 4. **Copy the key immediately** - it starts with `lin_api_` and won't be shown again ### Step 3: Enter Credentials Enter your Linear API key in BonData. The API key has the same permissions as your user account. Only create keys for trusted applications. ## Required Fields | Field | Description | | ------- | ------------------------------------------- | | API Key | Personal API key from Linear Settings → API | # Monday.com Source: https://docs.bondata.ai/integrations/business-apps/monday Connect BonData to Monday.com to sync your project management boards and items Monday.com is a flexible work management platform that helps teams plan, track, and deliver projects across any workflow. With BonData, you can connect to your Monday.com workspace to read and analyze boards, items, and team data within Agent workflows. ## OAuth Authentication BonData connects to Monday.com using OAuth 2.0 for secure access to your workspace data. ### Connect Your Account 1. In BonData, navigate to **Integrations** and select **Monday.com** 2. Click **Connect** 3. You'll be redirected to Monday.com to authorize the connection 4. Sign in to your Monday.com account and approve the access request 5. You'll be redirected back to BonData once connected BonData requests read access to your boards and items. You can review and revoke access at any time from your Monday.com account settings. ## Available Data Once connected, BonData can sync the following Monday.com objects: * **Boards** - Project boards and their configurations * **Items** - Tasks and records within boards * **Groups** - Sections within boards * **Columns** - Field definitions and values * **Users** - Workspace members # NetSuite Source: https://docs.bondata.ai/integrations/business-apps/netsuite Connect BonData to Oracle NetSuite ERP for financial and operational data Oracle NetSuite is a cloud ERP suite covering accounting, order management, inventory, and CRM for growing businesses. With BonData, you can connect to your NetSuite account to read, enrich, and sync your ERP data within Agent workflows. ## NetSuite Token-Based Authentication Setup BonData connects to NetSuite using Token-Based Authentication (TBA), the recommended method for server-to-server integrations. ### Step 1: Enable the Required Features 1. Log in to NetSuite as an administrator 2. Go to **Setup** → **Company** → **Enable Features** 3. On the **SuiteCloud** tab, enable: * **Token-Based Authentication** * **REST Web Services** 4. Save your changes ### Step 2: Find Your Account ID 1. Go to **Setup** → **Company** → **Company Information** 2. Note your **Account ID** (for example, `1234567` or `1234567_SB1` for a sandbox) ### Step 3: Create an Integration Record 1. Go to **Setup** → **Integration** → **Manage Integrations** → **New** 2. Enter a name (e.g., `BonData Integration`) 3. Under **Authentication**, check **Token-Based Authentication** and uncheck **TBA: Authorization Flow** 4. Click **Save** 5. **Copy the Consumer Key and Consumer Secret** shown at the bottom of the page - they are only displayed once ### Step 4: Create an Access Token 1. Go to **Setup** → **Users/Roles** → **Access Tokens** → **New** 2. Select the **Application Name** (the integration you just created) 3. Select the **User** and a **Role** with the required permissions 4. Click **Save** 5. **Copy the Token ID and Token Secret** - they are only displayed once The assigned role must include REST Web Services and Log in using Access Tokens permissions, plus record-level access to the objects you want to sync. ### Step 5: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **NetSuite** 2. Enter your **Account ID**, **Consumer Key**, **Consumer Secret**, **Token ID**, and **Token Secret** 3. Click **Connect** ## Required Fields | Field | Description | | --------------- | ------------------------------------------------- | | Account ID | Your NetSuite account ID from Company Information | | Consumer Key | Consumer Key from the integration record | | Consumer Secret | Consumer Secret from the integration record | | Token ID | Token ID from the access token | | Token Secret | Token Secret from the access token | ## Available Data Once connected, BonData can sync the following NetSuite records: * **Customers** - Customer master records with contacts and terms * **Sales Orders** - Sales orders and their line items * **Invoices** - Customer invoices and balances * **Items** - Inventory, assembly, and service items * **Vendors** - Vendor master records * **Purchase Orders** - Purchase orders and receipts * **Journal Entries** - General ledger journal entries * **Employees** - Employee records and roles # Outlook Source: https://docs.bondata.ai/integrations/business-apps/outlook Connect BonData to Microsoft Outlook to sync your emails, calendar events, and contacts Microsoft Outlook is a widely used email and calendar platform, part of the Microsoft 365 suite. With BonData, you can connect to Outlook via the Microsoft Graph API to read emails, calendar events, and contacts - enabling data-driven workflows that leverage your communication data. ## OAuth Authentication BonData connects to Microsoft Outlook using OAuth 2.0, which provides secure access to your Outlook data via the Microsoft Graph API. ### Admin Consent (Required First) Before any user in your organization can connect, an Azure AD administrator must grant consent for BonData. 1. In BonData, navigate to **Integrations** and select **Outlook** 2. Click the **Grant admin consent** link 3. Sign in with an Azure AD administrator account 4. Review the permissions and click **Accept** 5. You'll be redirected back to BonData once complete This only needs to be done once per organization. ### Connect Your Account After admin consent has been granted: 1. Click **Connect** 2. You'll be redirected to Microsoft to authorize the connection 3. Sign in with your Microsoft work or school account 4. You'll be redirected back to BonData once connected ## Available Data Once connected, BonData can sync the following Outlook data: * **Messages** - Emails from your mailbox * **Mail Folders** - Folder structure (Inbox, Sent, Drafts, etc.) * **Calendar Events** - Meetings and appointments * **Calendars** - Your calendar list * **Contacts** - People in your contact list BonData requests read-only access to your Outlook data. You can review and revoke access at any time from your [Microsoft account settings](https://account.microsoft.com/permissions). # Primetric Source: https://docs.bondata.ai/integrations/business-apps/primetric Connect BonData to Primetric to sync your resource management and project data Primetric is a resource management and professional services platform that helps organizations plan capacity, track utilization, and forecast project profitability. With BonData, you can connect to your Primetric account to read and analyze resource, project, and time data within Agent workflows. ## OAuth Authentication BonData connects to Primetric using OAuth 2.0 for secure access to your resource planning data. ### Connect Your Account 1. In BonData, navigate to **Integrations** and select **Primetric** 2. Click **Connect** 3. You'll be redirected to Primetric to authorize the connection 4. Sign in to your Primetric account and approve the access request 5. You'll be redirected back to BonData once connected BonData requests read access to your resource and project data. You can review and revoke access at any time from your Primetric account settings. ## Available Data Once connected, BonData can sync the following Primetric objects: * **Projects** - Project details and configurations * **People** - Team members and their assignments * **Assignments** - Resource allocations to projects * **Time Entries** - Tracked time and effort * **Skills** - Skill definitions and assignments # Priority ERP Source: https://docs.bondata.ai/integrations/business-apps/priority Connect BonData to Priority ERP Priority ERP is a comprehensive enterprise resource planning system covering finance, manufacturing, supply chain, HR, and CRM. With BonData, you can connect to your Priority instance to read and enrich your ERP data within Agent workflows. ## Priority ERP Setup Follow these steps to connect BonData to Priority ERP. ### Step 1: Get API Credentials Contact your Priority administrator to obtain: * **Username** - your Priority API user * **Password** - your Priority API password ### Step 2: Get Connection Details You'll need the following information from your Priority setup: * **Domain** - your Priority server domain * **Database** - the Priority database name * **Environment** - the Priority environment name ### Step 3: Enter Credentials Enter your username, password, and connection details in BonData. ## Required Fields | Field | Description | | ----------- | ----------------------------- | | Username | Your Priority API user | | Password | Your Priority API password | | Domain | Your Priority server domain | | Database | The Priority database name | | Environment | The Priority environment name | # Roadio Source: https://docs.bondata.ai/integrations/business-apps/roadio Connect BonData to Roadio for EV charging network and session data Roadio (Road.io) is an EV charging network management platform that charge point operators use to manage locations, chargers, sessions, and billing. With BonData, you can connect to your Roadio account to read, enrich, and sync your charging network data within Agent workflows. ## Roadio API Token Setup BonData connects to the Roadio API at `https://api.road.io` using a bearer API token scoped to your operator (provider). ### Step 1: Request an API Token 1. Contact your Road.io / ChargeNow account team to request an API token for the integration 2. They will issue a **Bearer token** scoped to your operator account 3. Confirm your **Provider** identifier - the tenant or operator your credential is scoped to The provider value is sent as the `provider` request header. Without it, all Road.io endpoints return `403 Forbidden`, so make sure you have the correct operator identifier. ### Step 2: Review the API Documentation For endpoint details and object schemas, see the [Road.io documentation](https://documentation.road.io). ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Roadio** 2. Enter your **API Token** and **Provider** 3. Click **Connect** ## Required Fields | Field | Description | | --------- | --------------------------------------------------- | | API Token | Bearer token issued by the Road.io / ChargeNow team | | Provider | Operator identifier sent as the `provider` header | ## Available Data Once connected, BonData can sync the following Roadio objects: * **Accounts** - Customer and operator accounts * **Locations** - Charging site locations with address and coordinates * **EVSE Controllers** - Charge point controllers and firmware details * **EVSE Issues** - Faults and issues raised against chargers * **Sessions** - Charging sessions with energy, cost, and timestamps * **Credit Sessions** - Credit-based charging sessions * **Vehicles** - Registered vehicles with make, model, and license plate * **Cards** - RFID and charge cards * **Tokens** - Authorization tokens * **Internal Tokens** - Internal authorization tokens * **Users** - Platform users and roles * **Customer Groups** - Groupings of customer accounts * **Charging Groups** - Groupings of chargers * **Charging Policies** - Pricing and access policies * **Access Groups** - Access control groups * **Billing Plans** - Billing plans and pricing * **Payment Terminals** - Connected payment terminals * **Credentials** - Roaming and integration credentials * **External Providers** - Connected external providers * **OCPI Locations** - Locations exposed via the OCPI roaming protocol * **OCPI Tariffs** - Tariffs exposed via the OCPI roaming protocol # Salesforce Source: https://docs.bondata.ai/integrations/business-apps/salesforce Connect BonData to Salesforce CRM Salesforce is the world's leading CRM platform, used by businesses to manage customer relationships, sales pipelines, and service operations. With BonData, you can connect to your Salesforce org to read, enrich, and sync your CRM data within Agent workflows. ## Salesforce Access Token Setup Follow these steps to get your Salesforce credentials for BonData. ### Step 1: Get Your Instance URL Your Salesforce instance URL is in your browser when logged in: * Production: `https://yourcompany.my.salesforce.com` * Sandbox: `https://yourcompany--sandbox.sandbox.my.salesforce.com` ### Step 2: Get an Access Token 1. Log in to Salesforce 2. Open Developer Console (gear icon → Developer Console) 3. Press `Ctrl+G` (or `Cmd+G` on Mac) 4. Enter: `System.debug(UserInfo.getSessionId());` 5. Copy the session ID from the debug log 1. Go to **Setup** → **App Manager** 2. Click **New Connected App** 3. Enable OAuth and select required scopes 4. Use the OAuth flow to get an access token ### Step 3: Enter Credentials Enter your access token and Salesforce URL in BonData. Session IDs expire. For long-term use, create a Connected App with refresh tokens. ## Required Fields | Field | Description | | ------------ | ------------------------------------------ | | Access Token | Your Salesforce access token or session ID | | URL | Your Salesforce instance URL | # SAP Source: https://docs.bondata.ai/integrations/business-apps/sap Connect BonData to SAP ERP for master data and transactional records SAP is the enterprise resource planning (ERP) system that runs finance, logistics, procurement, and manufacturing for many of the world's largest organizations. With BonData, you can connect to your SAP account to read, enrich, and sync your ERP data within Agent workflows. ## SAP Connection Setup BonData connects to SAP over HTTPS. You can route through **SAP Integration Suite** (Cloud Integration, commonly called CPI), or connect **directly** to your SAP system - either its OData services or its underlying SAP HANA database. ### Step 1: Choose a Connection Method | Method | Best for | Works with | | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | | SAP Integration Suite (CPI) | Landscapes that already standardize integration on CPI, or where SAP is not directly reachable from outside the corporate network | S/4HANA Cloud, S/4HANA on-premise, ECC | | Direct - OData | The simplest path when BonData can reach SAP over HTTPS; respects SAP application-level authorizations | S/4HANA Cloud, S/4HANA on-premise, ECC with SAP Gateway activated | | Direct - SAP HANA | High-volume bulk extracts and historical backfills, where reading tables and CDS views directly is fastest | S/4HANA on-premise or private edition, Suite on HANA, BW/4HANA, SAP HANA Cloud | If you are unsure which applies, ask your SAP Basis or integration team whether BonData should go through your Integration Suite tenant or connect to the system directly. Many organizations already have a policy for this. ### Step 2: Set Up the Connection 1. In SAP Integration Suite, open the **Cloud Integration** capability and go to **Design** → **Integrations** 2. Identify or create the integration flow (iFlow) that exposes the data you want to sync, using an **HTTPS sender adapter** 3. Deploy the iFlow and copy its **Endpoint URL** from the **Monitor** → **Manage Integration Content** view 4. In the SAP BTP cockpit, go to **Instances and Subscriptions** and create a service instance of **Process Integration Runtime** with the **api** service plan 5. Create a **service key** for that instance and grant it the `ESBMessaging.send` role 6. Copy the **Client ID**, **Client Secret**, and **Token URL** from the service key The Token URL is your BTP subaccount's authentication endpoint, in the form `https://.authentication..hana.ondemand.com/oauth/token`. 1. Confirm the OData services you need are available: * **On-premise:** use transaction **/IWFND/MAINT\_SERVICE** to activate the required services in SAP Gateway * **S/4HANA Cloud:** go to **Communication Management** → **Communication Arrangements** and create an arrangement for the relevant communication scenario 2. Create a dedicated integration user: * **On-premise:** use transaction **SU01** to create a service user with read authorization for the relevant OData services * **S/4HANA Cloud:** create an inbound **Communication User** and attach it to a **Communication System** 3. Note your **Service Root URL**, in the form `https://:/sap/opu/odata/sap/` 4. For on-premise systems, note the **Client** number (`sap-client`, e.g. `100`) 5. Confirm your firewall or reverse proxy allows HTTPS connections from BonData's IP addresses Your SAP team can identify the right `SAP_COM_*` communication scenario or OData service for each object you want to sync. 1. Gather the connection endpoint from your Basis team: * **On-premise HANA:** SQL port `315` (e.g. `30015`), or the tenant database port * **SAP HANA Cloud:** port `443` 2. Identify the SAP schema to read from (commonly `SAPHANADB` on S/4HANA, or `SAPABAP1` on Suite on HANA) 3. Create a read-only database user for BonData: ```sql theme={null} -- Create a user for BonData CREATE USER BONDATA_USER PASSWORD "your_secure_password" NO FORCE_FIRST_PASSWORD_CHANGE; -- Grant read access to the SAP schema GRANT SELECT ON SCHEMA SAPHANADB TO BONDATA_USER; ``` 4. Confirm your firewall allows connections from BonData's IP addresses A direct HANA connection reads database tables and CDS views, bypassing the ABAP application layer. SAP application-level authorization checks do not apply, and you work with technical table names rather than business objects. Scope the database user's grants narrowly. This method is not available for S/4HANA Cloud public edition, which does not expose its database. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **SAP** 2. Choose your **Connection Method** 3. Enter the credentials for that method (see below) 4. Click **Connect** ## Required Fields | Field | Description | | ------------- | ---------------------------------------------------------- | | Endpoint URL | The deployed iFlow endpoint URL | | Token URL | OAuth token endpoint for your BTP subaccount | | Client ID | Client ID from the Process Integration Runtime service key | | Client Secret | Client secret from the service key | | Field | Description | | ---------------- | --------------------------------------------------------------------- | | Service Root URL | e.g. `https://sap.example.com:44300/sap/opu/odata/sap/` | | Client | SAP client number, e.g. `100` (`sap-client`) - on-premise only | | Username | Integration or communication user name | | Password | Password for the integration user | | Field | Description | | -------- | --------------------------------------------------------- | | Host | HANA hostname or IP | | Port | SQL port, e.g. `30015` (on-premise) or `443` (HANA Cloud) | | Database | Tenant database name | | Schema | SAP schema to read, e.g. `SAPHANADB` | | User | Read-only database user | | Password | Password for the database user | Connecting to an on-premise SAP system over RFC using standard BAPI function modules is also supported for older ECC landscapes. Contact your BonData representative if your system cannot be reached through Integration Suite, OData, or HANA. # ServiceNow Source: https://docs.bondata.ai/integrations/business-apps/servicenow Connect BonData to ServiceNow for ITSM and CMDB data ServiceNow is a cloud platform for IT service management (ITSM), operations, and workflow automation across the enterprise. With BonData, you can connect to your ServiceNow account to read, enrich, and sync your ITSM and CMDB data within Agent workflows. ## ServiceNow Authentication Setup BonData connects to ServiceNow through the Table API. You can authenticate with Basic auth or OAuth 2.0. ### Step 1: Find Your Instance URL Your instance URL is the address you use to log in, in the format: * `https://yourcompany.service-now.com` ### Step 2: Choose an Authentication Method 1. Log in to ServiceNow as an administrator 2. Navigate to **User Administration** → **Users** 3. Create or select a dedicated integration user (e.g., `bondata.integration`) 4. Set a strong password 5. Assign roles that grant read access to the tables you want to sync (for example `itil` or `rest_service`) 1. Navigate to **System OAuth** → **Application Registry** 2. Click **New** and select **Create an OAuth API endpoint for external clients** 3. Enter a name (e.g., `BonData Integration`) 4. Save and copy the generated **Client ID** and **Client Secret** Make sure the integration user or OAuth client has read access to each table. ServiceNow enforces access control lists (ACLs) on every Table API request. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **ServiceNow** 2. Enter your **Instance URL** 3. Enter your **Username** and **Password**, or your **Client ID** and **Client Secret** 4. Click **Connect** ## Required Fields | Field | Description | | ------------ | ---------------------------- | | Instance URL | Your ServiceNow instance URL | | Username | Integration user name | | Password | Integration user password | | Field | Description | | ------------- | ------------------------------------------- | | Instance URL | Your ServiceNow instance URL | | Client ID | Client ID from the Application Registry | | Client Secret | Client Secret from the Application Registry | ## Available Data Once connected, BonData can sync the following ServiceNow tables: * **Incidents** - Incident records (`incident`) * **Problems** - Problem records (`problem`) * **Changes** - Change requests (`change_request`) * **CMDB Configuration Items** - Configuration items from the CMDB (`cmdb_ci`) * **Users** - User records (`sys_user`) * **Groups** - Assignment and user groups (`sys_user_group`) * **Catalog Items** - Service catalog items (`sc_cat_item`) # Stripe Source: https://docs.bondata.ai/integrations/business-apps/stripe Connect BonData to Stripe for payments, billing, and subscription data Stripe is a payments platform that businesses use to accept payments, run subscriptions, and manage billing online. With BonData, you can connect to your Stripe account to read, enrich, and sync your payments and billing data within Agent workflows. ## Stripe API Key Setup BonData connects to Stripe using a secret API key. ### Step 1: Open the API Keys Page 1. Log in to the [Stripe Dashboard](https://dashboard.stripe.com/) 2. In the left navigation, click **Developers** 3. Select the **API keys** tab ### Step 2: Get Your Secret Key 1. Under **Standard keys**, find the **Secret key** 2. Click **Reveal** and copy the value (it starts with `sk_live_` for live mode or `sk_test_` for test mode) 1. Under **Restricted keys**, click **Create restricted key** 2. Grant **Read** permission on the resources you want to sync (Customers, Charges, Invoices, and so on) 3. Click **Create key** and copy the value (it starts with `rk_live_`) Use a restricted key with read-only permissions for the tightest security. Treat any secret key like a password - never share it publicly. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Stripe** 2. Enter your **Secret API Key** 3. Click **Connect** ## Required Fields | Field | Description | | ------- | ------------------------------------------------------------------------ | | API Key | Your Stripe secret key (`sk_live_...`) or restricted key (`rk_live_...`) | ## Available Data Once connected, BonData can sync the following Stripe objects: * **Customers** - Customer records and billing details * **Charges** - Individual charge and payment records * **Invoices** - Invoices and their line items * **Subscriptions** - Active and canceled subscriptions * **Products** - Product catalog entries * **Prices** - Pricing and billing plans * **Payouts** - Payouts to your bank account * **Refunds** - Refund records * **Disputes** - Chargebacks and disputes # Workday Source: https://docs.bondata.ai/integrations/business-apps/workday Connect BonData to Workday for HCM and financial data Workday is a cloud platform for human capital management (HCM) and financial management used by large enterprises to run HR, payroll, and finance. With BonData, you can connect to your Workday account to read, enrich, and sync your HCM and finance data within Agent workflows. ## Workday OAuth Setup BonData connects to Workday using an API Client for Integrations with the OAuth 2.0 refresh token grant. ### Step 1: Find Your Tenant and REST API Endpoint 1. Log in to Workday 2. Search for the **View API Clients** task 3. Note your **Tenant** name and the **Workday REST API Endpoint** (for example, `https://wd2-impl-services1.workday.com/ccx/api/v1/yourtenant`) ### Step 2: Register an API Client 1. Search for and open the **Register API Client for Integrations** task 2. Enter a **Client Name** (e.g., `BonData Integration`) 3. Set the **Non-Expiring Refresh Tokens** option as needed 4. Select the required **Functional Areas / Scopes** (for example, Staffing, Compensation, and Financial Accounting) 5. Click **OK** 6. **Copy the Client ID and Client Secret** shown on the confirmation screen ### Step 3: Generate a Refresh Token 1. Search for the **View API Clients** task and open your registered client 2. Under **API Clients for Integrations**, select **Manage Refresh Tokens for Integrations** 3. Choose the integration system user and generate a refresh token 4. **Copy the Refresh Token** - it is only shown once Workday scopes control which objects your client can read. Confirm the security groups assigned to the integration system user include access to the domains you plan to sync. ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Workday** 2. Enter your **Tenant**, **REST API Endpoint**, **Client ID**, **Client Secret**, and **Refresh Token** 3. Click **Connect** ## Required Fields | Field | Description | | ----------------- | ------------------------------------------------------- | | Tenant | Your Workday tenant name | | REST API Endpoint | Your Workday REST API base URL | | Client ID | Client ID from the registered API client | | Client Secret | Client Secret from the registered API client | | Refresh Token | Refresh token generated for the integration system user | ## Available Data Once connected, BonData can sync the following Workday objects: * **Workers** - Employee and contingent worker records * **Organizations** - Supervisory, company, and cost center organizations * **Positions** - Positions and job profiles * **Compensation** - Compensation plans and grades * **Time Off** - Time off and absence records * **Financial Accounts** - Ledger accounts and financial dimensions # Zoho Billing Source: https://docs.bondata.ai/integrations/business-apps/zohobilling Connect BonData to Zoho Billing (Subscriptions) to sync your subscription and billing data Zoho Billing (formerly Zoho Subscriptions) is a subscription management and recurring billing platform for SaaS and subscription-based businesses. With BonData, you can connect to your Zoho Billing account to read and analyze subscription, invoice, and payment data within Agent workflows. ## OAuth Authentication BonData connects to Zoho Billing using OAuth 2.0 for secure access to your subscription data. ### Step 1: Select Your Data Center Choose the data center that matches your Zoho account location: | Region | URL | | ----------- | ------------------------------ | | Global (US) | `https://accounts.zoho.com` | | Europe | `https://accounts.zoho.eu` | | India | `https://accounts.zoho.in` | | Australia | `https://accounts.zoho.com.au` | | Japan | `https://accounts.zoho.jp` | | Canada | `https://accounts.zoho.ca` | | China | `https://accounts.zoho.com.cn` | ### Step 2: Connect Your Account 1. In BonData, navigate to **Integrations** and select **Zoho Billing** 2. Select your Data Center from the dropdown 3. Click **Connect** 4. You'll be redirected to Zoho to authorize the connection 5. Sign in to your Zoho account and approve the access request 6. You'll be redirected back to BonData once connected ## Required Fields | Field | Description | | ----------- | ---------------------------- | | Data Center | Your Zoho data center region | ## Available Data Once connected, BonData can sync the following Zoho Billing objects: * **Customers** - Customer records and details * **Subscriptions** - Active and historical subscriptions * **Invoices** - Billing invoices * **Payments** - Payment records * **Products** - Product catalog * **Plans** - Subscription plans # Zoho Books Source: https://docs.bondata.ai/integrations/business-apps/zohobooks Connect BonData to Zoho Books to sync your accounting and financial data Zoho Books is an online accounting platform for small and medium businesses, offering invoicing, expense tracking, and financial reporting. With BonData, you can connect to your Zoho Books account to read and analyze accounting and financial data within Agent workflows. ## OAuth Authentication BonData connects to Zoho Books using OAuth 2.0 for secure access to your accounting data. ### Step 1: Select Your Data Center Choose the data center that matches your Zoho account location: | Region | URL | | ----------- | ------------------------------ | | Global (US) | `https://accounts.zoho.com` | | Europe | `https://accounts.zoho.eu` | | India | `https://accounts.zoho.in` | | Australia | `https://accounts.zoho.com.au` | | Japan | `https://accounts.zoho.jp` | | Canada | `https://accounts.zoho.ca` | | China | `https://accounts.zoho.com.cn` | ### Step 2: Connect Your Account 1. In BonData, navigate to **Integrations** and select **Zoho Books** 2. Select your Data Center from the dropdown 3. Click **Connect** 4. You'll be redirected to Zoho to authorize the connection 5. Sign in to your Zoho account and approve the access request 6. You'll be redirected back to BonData once connected ## Required Fields | Field | Description | | ----------- | ---------------------------- | | Data Center | Your Zoho data center region | ## Available Data Once connected, BonData can sync the following Zoho Books objects: * **Contacts** - Customers and vendors * **Invoices** - Sales invoices * **Bills** - Vendor bills * **Estimates** - Quotes and estimates * **Sales Orders** - Sales order records * **Purchase Orders** - Purchase order records * **Payments** - Customer and vendor payments * **Expenses** - Expense records # Azure Blob Storage Source: https://docs.bondata.ai/integrations/cloud-storage/azure-blob Connect BonData to Azure Blob Storage containers ## Azure Blob Connection Setup Follow these steps to connect BonData to your Azure Blob Storage container. ### Step 1: Create a Storage Account 1. Go to the [Azure Portal](https://portal.azure.com/) 2. Navigate to **Storage accounts** 3. Click **+ Create** to create a new storage account (or use an existing one) 4. Fill in the required fields and click **Review + create** ### Step 2: Create a Container 1. Open your storage account 2. Go to **Data storage** → **Containers** 3. Click **+ Container** 4. Enter a name and set the access level 5. Click **Create** ### Step 3: Get Access Keys 1. Open your storage account 2. Go to **Security + networking** → **Access keys** 3. Click **Show** next to one of the keys 4. Copy the **Storage account name** and **Key** ### Step 4: Enter Credentials Enter the storage account name and access key in BonData. ## Required Fields | Field | Description | | -------------------- | --------------------------------------------- | | Container Name | The name of the Azure Blob container | | Prefix | Optional folder path (e.g., data/exports) | | Storage Account Name | The name of your Azure Storage account | | Storage Account Key | The access key for your Azure Storage account | # Dropbox Source: https://docs.bondata.ai/integrations/cloud-storage/dropbox Connect BonData to Dropbox to sync your files and folders Dropbox is a cloud storage service for storing, syncing, and sharing files across devices and teams. With BonData, you can connect to your Dropbox account to read and analyze files and folders within Agent workflows. ## Dropbox OAuth Setup BonData connects to Dropbox using OAuth 2.0, so you authorize access with your Dropbox account without sharing your password. ### Step 1: Start the Connection 1. In BonData, navigate to **Integrations** and select **Dropbox** 2. Click **Connect with Dropbox** ### Step 2: Sign In to Dropbox 1. You'll be redirected to Dropbox's secure sign-in page 2. Sign in with the account you want to connect 3. For team accounts, sign in with your Dropbox Business credentials ### Step 3: Authorize Access 1. Review the permissions BonData requests 2. Click **Allow** to authorize the connection 3. You'll be redirected back to BonData once the connection is complete BonData supports both **personal** and **Dropbox Business (team)** accounts. Access is read-only - your files and folders are never modified. You can review or revoke access at any time from your [Dropbox connected apps](https://www.dropbox.com/account/connected_apps). ## Required Fields OAuth authentication is handled entirely through Dropbox. No additional fields are required after you authorize the connection. ## Available Data Once connected, BonData can sync: * **Files** - Files stored in your Dropbox, including their contents * **Folders** - Your folder structure and hierarchy * **Shared Folders** - Folders shared with you or your team * **File Metadata** - File names, sizes, paths, and modified timestamps # Google Cloud Storage Source: https://docs.bondata.ai/integrations/cloud-storage/gcs Connect BonData to Google Cloud Storage buckets ## GCS Connection Setup Follow these steps to connect BonData to your Google Cloud Storage bucket. ### Step 1: Create a Service Account 1. Go to the [GCP Console](https://console.cloud.google.com/iam-admin/serviceaccounts) 2. Select your project 3. Click **Create Service Account** 4. Enter a name (e.g., `bondata-gcs-access`) 5. Click **Create and Continue** ### Step 2: Assign Storage Permissions 1. Skip the optional grant step and click **Done** 2. Go to [Cloud Storage](https://console.cloud.google.com/storage/browser) 3. Click your bucket → **Permissions** tab 4. Click **Grant Access** 5. Enter the service account email 6. Assign the role **Storage Object Viewer** (`roles/storage.objectViewer`) 7. Click **Save** 1. In the **Grant this service account access to project** step, add the role **Storage Object Viewer** (`roles/storage.objectViewer`) 2. Click **Continue** → **Done** For write access, use the **Storage Object Admin** role instead. ### Step 3: Create a JSON Key 1. Go to [Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts) 2. Click your service account 3. Go to the **Keys** tab 4. Click **Add Key** → **Create new key** 5. Select **JSON** and click **Create** 6. The key file will download automatically - keep it safe ### Step 4: Enter Credentials Upload the JSON key file in BonData. ## Required Fields | Field | Description | | ------------------- | ------------------------------------------ | | Bucket Name | The name of the GCS bucket | | Prefix | Optional folder path (e.g., data/exports) | | Project ID | The Google Cloud project ID (optional) | | Service Account Key | The JSON key file for your service account | # Google Drive Source: https://docs.bondata.ai/integrations/cloud-storage/googledrive Connect BonData to Google Drive to sync your files and folders Google Drive is Google's cloud storage service for storing, sharing, and collaborating on files and documents. With BonData, you can connect to your Google Drive to read and analyze files and folders within Agent workflows. ## Google Drive OAuth Setup BonData connects to Google Drive using OAuth 2.0, so you authorize access with your Google account without sharing your password. ### Step 1: Start the Connection 1. In BonData, navigate to **Integrations** and select **Google Drive** 2. Click **Connect with Google** ### Step 2: Sign In with Google 1. You'll be redirected to Google's secure sign-in page 2. Choose the Google account whose Drive you want to connect 3. If you belong to multiple Google Workspace accounts, select the correct one ### Step 3: Grant Access 1. Review the permissions BonData requests 2. Click **Allow** to grant read-only access to your Drive 3. You'll be redirected back to BonData once the connection is authorized BonData requests read-only access to Google Drive (`drive.readonly` scope). Files and folders are never modified. You can review or revoke access at any time from your [Google account permissions](https://myaccount.google.com/permissions). ## Required Fields OAuth authentication is handled entirely through Google. No additional fields are required after you authorize the connection. ## Available Data Once connected, BonData can sync: * **Files** - Files stored in your Drive, including their metadata * **Folders** - Your folder structure and hierarchy * **Google Docs** - Exported as text or document formats * **Google Sheets** - Exported as spreadsheet data * **Google Slides** - Exported as presentation formats * **Shared Drives** - Files and folders in shared drives you have access to # Google Sheets Source: https://docs.bondata.ai/integrations/cloud-storage/googlesheets Connect BonData to Google Sheets to sync your spreadsheet data Google Sheets is a cloud-based spreadsheet application that enables real-time collaboration and data management. With BonData, you can connect to your Google Sheets to read spreadsheet data directly into your workflows - ideal for working with manually maintained datasets and reports. ## OAuth Authentication BonData connects to Google Sheets using OAuth 2.0 for secure access to your spreadsheets. ### Connect Your Account 1. In BonData, navigate to **Integrations** and select **Google Sheets** 2. Click **Connect** 3. You'll be redirected to Google to authorize the connection 4. Sign in to your Google account and approve the access request 5. You'll be redirected back to BonData once connected BonData requests read-only access to your spreadsheets. Your data remains secure and cannot be modified through this integration. ## Available Data Once connected, BonData can sync data from your Google Sheets: * **Spreadsheets** - Access to spreadsheets in your Google Drive * **Sheets** - Individual sheets within spreadsheets * **Cell Data** - Row and column data from your sheets # Amazon S3 Source: https://docs.bondata.ai/integrations/cloud-storage/s3 Connect BonData to Amazon S3 buckets Amazon S3 (Simple Storage Service) is AWS's highly scalable, durable object storage for any type of data. With BonData, you can connect to your S3 buckets to read CSV, JSON, and Parquet files directly into your workflows - enabling analysis and enrichment of data stored in AWS. ## S3 Connection Setup Follow these steps to connect BonData to your S3 bucket. ### Step 1: Create an IAM User 1. Go to the [AWS IAM Console](https://console.aws.amazon.com/iam/) 2. Click **Users** → **Create user** 3. Enter a name (e.g., `bondata-s3-access`) 4. Click **Next** → **Attach policies directly** 5. Click **Create policy** and use one of the policies below ### Step 2: Choose a Policy ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME", "Condition": { "StringLike": { "s3:prefix": "YOUR_PREFIX/*" } } }, { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/YOUR_PREFIX/*" } ] } ``` ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME" }, { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*" } ] } ``` Replace `YOUR_BUCKET_NAME` and `YOUR_PREFIX` with your actual values. ### Step 3: Create Access Keys 1. Go to your new user → **Security credentials** tab 2. Click **Create access key** 3. Select **Third-party service** → **Next** 4. Copy the **Access Key ID** and **Secret Access Key** ### Step 4: Enter Credentials Enter the Access Key ID and Secret Access Key in BonData. ## Required Fields | Field | Description | | ----------------- | -------------------------------------------------- | | Bucket Name | The name of the S3 bucket (e.g., my-data-bucket) | | Prefix | Optional folder path (e.g., data/exports) | | Access Key ID | The public identifier for your AWS IAM credentials | | Secret Access Key | The private key paired with your Access Key ID | # SharePoint Source: https://docs.bondata.ai/integrations/cloud-storage/sharepoint Connect BonData to Microsoft SharePoint Microsoft SharePoint is a collaboration and document management platform integrated with Microsoft 365, used for file storage, team sites, and intranet portals. With BonData, you can connect to your SharePoint sites to read and analyze documents and lists within Agent workflows. ## SharePoint OAuth Setup Follow these steps to configure OAuth authentication for BonData. ### Step 1: Register an App in Azure AD 1. Go to [Azure Portal](https://portal.azure.com/) 2. Navigate to **Azure Active Directory** → **App registrations** 3. Click **New registration** 4. Configure: * **Name**: `BonData SharePoint Integration` * **Supported account types**: Accounts in any organizational directory * **Redirect URI**: Web - `https://app.bondata.ai/auth/oauth2/callback` 5. Click **Register** ### Step 2: Configure API Permissions 1. Go to **API permissions** → **Add a permission** 2. Select **Microsoft Graph** 3. Choose **Delegated permissions** and select: * `Sites.Read.All` - Read items in all site collections * `Files.ReadWrite.All` - Read and write files 4. Click **Add permissions** 5. Click **Grant admin consent** (requires admin) ### Step 3: Create Client Secret 1. Go to **Certificates & secrets** → **Client secrets** 2. Click **New client secret** 3. Add a description and select expiration 4. **Copy the secret value immediately** - it won't be shown again ### Step 4: Note Your Credentials * **Client ID**: Found on the Overview page (Application ID) * **Client Secret**: The value you just copied ### Step 5: Enter Credentials Click Connect in BonData to authorize via OAuth using your Azure AD app credentials. ## Required Fields OAuth authentication is handled through the Azure AD app. No additional fields are required after setup. # Freshsuccess Source: https://docs.bondata.ai/integrations/customer-success/freshsuccess Connect BonData to Freshsuccess for customer success data Freshsuccess (by Freshworks) is a customer success management platform that helps teams monitor account health, manage renewals, and reduce churn. With BonData, you can connect to your Freshsuccess account to read and analyze customer health and engagement data within Agent workflows. ## Freshsuccess API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Log in to your Freshsuccess account 2. Go to **Settings** (gear icon) 3. Navigate to **Integrations** → **API** ### Step 2: Generate API Key 1. Click **Generate API Key** or find your existing key 2. **Copy the API key** Contact your Freshsuccess administrator if you don't have access to API settings. ### Step 3: Enter Credentials Enter your Freshsuccess API key in BonData. ## Required Fields | Field | Description | | ------- | ------------------------------------------------------- | | API Key | API key from Freshsuccess Settings → Integrations → API | # Gainsight Source: https://docs.bondata.ai/integrations/customer-success/gainsight Connect BonData to Gainsight for customer success data Gainsight is the leading customer success platform, helping companies drive retention, reduce churn, and grow revenue through data-driven customer engagement. With BonData, you can connect to your Gainsight instance to read and enrich customer health, usage, and lifecycle data within Agent workflows. BonData supports three authentication methods for Gainsight. Machine-to-machine User-delegated Direct token *** ## M2M OAuth Follow these steps to create Machine-to-Machine credentials for BonData. ### Step 1: Access Connected Apps 1. Log in to your Gainsight instance as an admin 2. Go to **Administration** → **Integrations** → **Connectors 2.0** 3. Click **Connected Apps** ### Step 2: Create a Connected App 1. Click **Create Connected App** 2. Enter a name (e.g., `BonData Integration`) 3. Select **Machine-to-Machine** as the app type 4. Configure the required scopes/permissions 5. Click **Save** ### Step 3: Copy Credentials After creation, you'll see: * **Client ID** - the unique identifier for your app * **Client Secret** - the secret used for authentication Copy both values - the Client Secret may not be shown again. ### Step 4: Get Your Application URL Your Gainsight URL is in the format: * `https://yourcompany.gainsightcloud.com` ### Step 5: Enter Credentials Enter your Client ID, Client Secret, and Application URL in BonData. ### Required Fields (M2M OAuth) | Field | Description | | --------------- | --------------------------- | | Client ID | OAuth app Client ID | | Client Secret | OAuth app Client Secret | | Application URL | Your Gainsight instance URL | *** ## OAuth Code Flow Follow these steps to configure OAuth authentication for BonData. ### Step 1: Access Connected Apps 1. Log in to your Gainsight instance as an admin 2. Go to **Administration** → **Integrations** → **Connectors 2.0** 3. Click **Connected Apps** ### Step 2: Create a Connected App 1. Click **Create Connected App** 2. Enter a name (e.g., `BonData Integration`) 3. Select **Authorization Code** as the grant type 4. Set the **Redirect URI**: `https://app.bondata.ai/auth/oauth2/callback` 5. Configure the required scopes/permissions 6. Click **Save** ### Step 3: Copy Credentials After creation, you'll see: * **Client ID** - the unique identifier for your app * **Client Secret** - the secret used for authentication Copy both values - the Client Secret may not be shown again. ### Step 4: Get Your Application URL Your Gainsight URL is in the format: * `https://yourcompany.gainsightcloud.com` ### Step 5: Enter Credentials Enter your Client ID, Client Secret, and Application URL in BonData, then click Connect to authorize via OAuth. ### Required Fields (OAuth Code Flow) | Field | Description | | --------------- | --------------------------- | | Client ID | OAuth app Client ID | | Client Secret | OAuth app Client Secret | | Application URL | Your Gainsight instance URL | *** ## Access Token Follow these steps to get an access token for BonData. ### Step 1: Get an Access Token You can obtain an access token in one of these ways: **Option A: From Gainsight Admin** 1. Log in to your Gainsight instance as an admin 2. Go to **Administration** → **Integrations** 3. Generate or copy an existing access token **Option B: From OAuth Flow** If you have OAuth credentials, you can generate an access token using the OAuth flow and copy it here. ### Step 2: Enter Credentials Enter your Gainsight access token in BonData. Access tokens may expire. For long-term integrations, consider using the M2M OAuth option instead. ### Required Fields (Access Token) | Field | Description | | ------------ | ------------------------------------------ | | Access Token | Access token from Gainsight Administration | # Intercom Source: https://docs.bondata.ai/integrations/customer-success/intercom Connect BonData to Intercom to sync your customer conversations and user data Intercom is a customer messaging platform that combines live chat, bots, and a help center to support, engage, and convert customers. With BonData, you can connect to your Intercom workspace to read and analyze contact, conversation, and company data within Agent workflows. ## OAuth Authentication BonData connects to Intercom using OAuth 2.0 for secure access to your customer data. ### Connect Your Account 1. In BonData, navigate to **Integrations** and select **Intercom** 2. Click **Connect** 3. You'll be redirected to Intercom to authorize the connection 4. Sign in to your Intercom account and approve the access request 5. You'll be redirected back to BonData once connected Intercom access tokens do not expire until manually revoked, so you won't need to re-authenticate periodically. ## Available Data Once connected, BonData can sync the following Intercom objects: * **Contacts** - Users and leads in your Intercom * **Conversations** - Customer conversations and messages * **Companies** - Organizations associated with contacts * **Tags** - Tags applied to contacts and conversations * **Admins** - Team members in your Intercom workspace # Pendo Source: https://docs.bondata.ai/integrations/customer-success/pendo Connect BonData to Pendo for product analytics data Pendo is a product analytics and digital adoption platform that helps teams understand user behavior, collect feedback, and guide users in-app. With BonData, you can connect to your Pendo account to read and analyze product usage and engagement data within Agent workflows. ## Pendo Integration Key Setup Follow these steps to create an Integration Key for BonData. ### Step 1: Access Integration Keys 1. Log in to [Pendo](https://app.pendo.io) as an admin 2. Click **Settings** (gear icon) 3. Go to **Subscription Settings** → **App Details** ### Step 2: Find Your Integration Key 1. Locate the **Integration Key** section 2. Click **Show** or **Copy** to reveal the key 3. Copy the Integration Key If you don't see an Integration Key, you may need to contact your Pendo admin or support to enable API access. ### Step 3: Select Your Region Choose the correct data center region for your Pendo account: * **US** (default): `https://app.pendo.io` * **EU**: `https://app.eu.pendo.io` * **US1**: `https://us1.app.pendo.io` * **Japan**: `https://app.jpn.pendo.io` * **Australia**: `https://app.au.pendo.io` ### Step 4: Enter Credentials Select your region and enter your Integration Key in BonData. ## Required Fields | Field | Description | | --------------- | ------------------------------------- | | Base URL | Your Pendo data center region | | Integration Key | Found in Pendo Settings → App Details | # Planhat Source: https://docs.bondata.ai/integrations/customer-success/planhat Connect BonData to Planhat for customer success data Planhat is a customer success platform that unifies customer data, health scores, and engagement so teams can reduce churn and grow revenue. With BonData, you can connect to your Planhat tenant to read and enrich company, end user, and lifecycle data within Agent workflows. ## Planhat API Token Setup Planhat authenticates API requests with a personal API token. Follow these steps to create one for BonData. ### Step 1: Open Your Profile Settings 1. Log in to [Planhat](https://app.planhat.com) as a user with the appropriate permissions 2. Click your avatar in the bottom-left corner 3. Go to **Settings** → **Service Accounts** (API access) ### Step 2: Generate an API Token 1. Under **Personal Tokens** (or **Service Account Tokens**), click **Generate Token** 2. Give the token a descriptive name, such as `BonData Integration` 3. Copy the generated token Copy the token immediately - Planhat only displays it once. If you lose it, you will need to generate a new one. ### Step 3: Confirm Your API Base URL Most tenants use the default API host. If your workspace is hosted in the EU region, use your region-specific host instead. * **Default**: `https://api.planhat.com` * **EU**: `https://api-eu.planhat.com` ### Step 4: Enter Credentials Enter your API Base URL and API Token in BonData. ## Required Fields | Field | Description | | --------- | ---------------------------------------------------------- | | Base URL | Your Planhat API host (default: `https://api.planhat.com`) | | API Token | Personal or service account token from Planhat Settings | ## Available Data Once connected, BonData can sync the following Planhat entities: * **Companies** - Customer accounts and their attributes * **End Users** - Individual contacts associated with companies * **Users** - Team members in your Planhat tenant * **Conversations** - Logged customer interactions * **Assets** - Products or units tracked against a company * **Licenses** - License and subscription records * **NPS** - Net Promoter Score responses * **Tasks** - Customer success tasks * **Notes** - Notes logged against companies and end users * **Issues** - Tracked customer issues * **Tickets** - Support tickets * **Churns** - Churn records * **Opportunities** - Sales and expansion opportunities * **Projects** - Onboarding and success projects * **Invoices** - Billing and invoice records * **Sales** - Recognized sales records * **Campaigns** - Marketing and lifecycle campaigns * **Deals** - Deal records * **Line Items** - Invoice and deal line items * **Metrics** - Usage and dimension data * **Objectives** - Customer objectives and goals * **Products** - Product catalog entries * **Time Entries** - Logged time entries * **Timesheets** - Aggregated timesheet records # Zendesk Source: https://docs.bondata.ai/integrations/customer-success/zendesk Connect BonData to Zendesk to sync your support tickets and customer data Zendesk is a leading customer service and support platform that helps businesses manage tickets, conversations, and customer relationships across channels. With BonData, you can connect to your Zendesk instance to read and analyze support ticket, user, and organization data within Agent workflows. ## OAuth Authentication BonData connects to Zendesk using OAuth 2.0 for secure access to your support data. ### Step 1: Create an OAuth Client 1. Go to your Zendesk Admin Center 2. Navigate to **Apps and integrations** → **APIs** → **Zendesk API** 3. Click the **OAuth Clients** tab 4. Click **Add OAuth Client** ### Step 2: Configure the OAuth Client 1. Enter a client name (e.g., `BonData Integration`) 2. Add the redirect URL: `https://app.bondata.ai/auth/oauth2/callback` 3. Click **Save** ### Step 3: Get Your Credentials 1. After saving, copy the **Client ID** and **Client Secret** 2. Note your Zendesk subdomain (e.g., `yourcompany` from `yourcompany.zendesk.com`) ### Step 4: Connect in BonData Enter your Client ID, Client Secret, and Zendesk URL in BonData, then click Connect to authorize via OAuth. ## Required Fields | Field | Description | | ------------- | ---------------------------------------------------------- | | Client ID | OAuth Client ID from Zendesk | | Client Secret | OAuth Client Secret from Zendesk | | URL | Your Zendesk URL (e.g., `https://yourcompany.zendesk.com`) | ## Available Data Once connected, BonData can sync the following Zendesk objects: * **Tickets** - Support tickets and their status * **Users** - Customers and agents * **Organizations** - Customer organizations * **Groups** - Agent groups * **Custom Fields** - Your custom ticket fields # Connecting Azure SQL in a Private VNet Source: https://docs.bondata.ai/integrations/databases/azure-sql-private-vnet How to securely connect BonData to an Azure database with no public endpoint If your Azure SQL Database or Azure Database for PostgreSQL is in a private VNet with no public endpoint, there are several ways to securely connect it to BonData. The right approach depends on your security requirements, data volume, and infrastructure. Using a different cloud? See [AWS RDS in a Private VPC](/integrations/databases/rds-private-vpc) or [GCP Cloud SQL in a Private VPC](/integrations/databases/cloud-sql-private-vpc). Self-service setup with Terraform Lightweight agent in your VNet Private endpoint, no public internet Direct network link between VNets Encrypted tunnel over the internet Dedicated physical connection **Not sure which option is right for you?** The Blob Storage + Azure Functions approach works for most teams and you can set it up entirely on your own. For all other options, [reach out to our team](mailto:support@bondata.ai) - we'll help you evaluate your setup and find the best path forward. *** ## Option 1: Export to Blob Storage via Azure Functions
Recommended Self-service
An Azure Function runs inside your VNet via VNet integration, queries your database, converts results to Parquet, and writes them to Blob Storage. BonData reads from Blob Storage via its native [S3-compatible integration](/integrations/cloud-storage/s3). ``` Azure SQL (private) ──▶ Azure Function (VNet integrated) ──▶ Blob Storage ──▶ BonData ▲ Timer trigger (cron) ``` **Why this approach works best for most teams:** * No firewall changes - the function connects via your VNet * Zero DB performance impact - queries run on your schedule * Database credentials never leave your Azure subscription * Fully self-service - no coordination with BonData needed ### Deploy with Terraform Create a `bondata-azure-export.tf` file and fill in the variables at the top. This provisions the Storage Account, Function App, VNet integration, and timer trigger in one apply. Store `db_password` in [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/general/overview) and reference it as a Key Vault secret in the app settings to avoid committing secrets. ```hcl theme={null} # ────────────────────────────────────────────── # Variables - fill these in # ────────────────────────────────────────────── variable "resource_group" { description = "Existing resource group name" } variable "location" { default = "eastus" } variable "vnet_name" { description = "VNet where your database lives" } variable "vnet_rg" { description = "Resource group of the VNet" } variable "integration_subnet" { description = "Subnet name delegated to Microsoft.Web/serverFarms" } variable "db_host" { description = "Database FQDN (private endpoint)" } variable "db_port" { default = "5432" } variable "db_name" { description = "Database name" } variable "db_user" { description = "Database user" } variable "db_password" { sensitive = true } variable "tables" { default = "public.users,public.orders" description = "Comma-separated tables" } variable "schedule" { default = "0 0 * * * *" description = "NCRONTAB schedule (default: every hour)" } variable "storage_account" { default = "bondataexports" description = "Storage account name (globally unique)" } provider "azurerm" { features {} } # ────────────────────────────────────────────── # Data sources # ────────────────────────────────────────────── data "azurerm_resource_group" "rg" { name = var.resource_group } data "azurerm_subnet" "integration" { name = var.integration_subnet virtual_network_name = var.vnet_name resource_group_name = var.vnet_rg } # ────────────────────────────────────────────── # Storage account + container # ────────────────────────────────────────────── resource "azurerm_storage_account" "export" { name = var.storage_account resource_group_name = data.azurerm_resource_group.rg.name location = var.location account_tier = "Standard" account_replication_type = "LRS" allow_nested_items_to_be_public = false } resource "azurerm_storage_container" "export" { name = "bondata-exports" storage_account_id = azurerm_storage_account.export.id container_access_type = "private" } # ────────────────────────────────────────────── # App Service Plan (Consumption) # ────────────────────────────────────────────── resource "azurerm_service_plan" "plan" { name = "bondata-export-plan" resource_group_name = data.azurerm_resource_group.rg.name location = var.location os_type = "Linux" sku_name = "EP1" # Elastic Premium required for VNet integration } # ────────────────────────────────────────────── # Function App # ────────────────────────────────────────────── resource "azurerm_linux_function_app" "export" { name = "bondata-db-export" resource_group_name = data.azurerm_resource_group.rg.name location = var.location service_plan_id = azurerm_service_plan.plan.id storage_account_name = azurerm_storage_account.export.name storage_account_access_key = azurerm_storage_account.export.primary_access_key virtual_network_subnet_id = data.azurerm_subnet.integration.id site_config { application_stack { python_version = "3.12" } vnet_route_all_enabled = true } app_settings = { DB_HOST = var.db_host DB_PORT = var.db_port DB_NAME = var.db_name DB_USER = var.db_user DB_PASSWORD = var.db_password STORAGE_CONNECTION_STRING = azurerm_storage_account.export.primary_connection_string STORAGE_CONTAINER = azurerm_storage_container.export.name TABLES = var.tables EXPORT_SCHEDULE = var.schedule FUNCTIONS_WORKER_RUNTIME = "python" AzureWebJobsFeatureFlags = "EnableWorkerIndexing" } } # ────────────────────────────────────────────── # Outputs # ────────────────────────────────────────────── output "storage_account" { value = azurerm_storage_account.export.name } output "function_app" { value = azurerm_linux_function_app.export.name } ``` After `terraform apply`, deploy the function code. Create these two files and deploy with Azure Functions Core Tools: **`function_app.py`**: ```python theme={null} import os, io, json, logging from datetime import datetime, timezone import azure.functions as func from azure.storage.blob import BlobServiceClient import psycopg2, pyarrow as pa, pyarrow.parquet as pq app = func.FunctionApp() DB = dict(host=os.environ["DB_HOST"], port=int(os.environ.get("DB_PORT","5432")), dbname=os.environ["DB_NAME"], user=os.environ["DB_USER"], password=os.environ["DB_PASSWORD"]) CONN_STR = os.environ["STORAGE_CONNECTION_STRING"] CONTAINER = os.environ["STORAGE_CONTAINER"] PREFIX = os.environ.get("STORAGE_PREFIX", "db-exports") TABLES = [t.strip() for t in os.environ["TABLES"].split(",")] CHUNK = int(os.environ.get("CHUNK_SIZE", "50000")) def export_table(cur, table, ts, container_client): safe = table.replace('"','').replace('.','__') cur.execute(f"SELECT * FROM {table} LIMIT 0") cols = [d[0] for d in cur.description] cur.execute(f"DECLARE _c CURSOR FOR SELECT * FROM {table}") part, total = 0, 0 while True: cur.execute(f"FETCH {CHUNK} FROM _c") rows = cur.fetchall() if not rows: break tbl = pa.table({c: [r[i] for r in rows] for i,c in enumerate(cols)}) buf = io.BytesIO() pq.write_table(tbl, buf); buf.seek(0) blob_name = f"{PREFIX}/{safe}/dt={ts}/part-{part:05d}.parquet" container_client.upload_blob(name=blob_name, data=buf, overwrite=True) total += len(rows); part += 1 cur.execute("CLOSE _c") return total @app.timer_trigger(schedule=os.environ.get("EXPORT_SCHEDULE", "0 0 * * * *"), arg_name="timer", run_on_startup=False) def bondata_export(timer: func.TimerRequest): ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H%M%SZ") blob_svc = BlobServiceClient.from_connection_string(CONN_STR) container_client = blob_svc.get_container_client(CONTAINER) conn = psycopg2.connect(**DB) try: conn.autocommit = False; cur = conn.cursor() res = {} for t in TABLES: try: res[t] = export_table(cur, t, ts, container_client) except Exception as e: logging.error(f"{t}: {e}"); res[t] = str(e); conn.rollback() conn.commit() finally: conn.close() logging.info(json.dumps(res)) ``` **`requirements.txt`**: ```txt theme={null} azure-functions==1.* azure-storage-blob==12.* psycopg2-binary==2.9.9 pyarrow==15.0.0 ``` Deploy: ```bash theme={null} func azure functionapp publish bondata-db-export ``` ### Connect Blob Storage to BonData Once data is flowing, connect BonData to the storage account: 1. In BonData, go to **Integrations** → **Add Integration** → **Amazon S3** 2. Use the [Azurite S3-compatible endpoint](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction) or generate a SAS token 3. Alternatively, contact [support@bondata.ai](mailto:support@bondata.ai) to set up a direct Azure Blob Storage connection Azure Blob Storage supports S3-compatible access. You can also share a read-only [SAS token](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview) scoped to the export container with BonData support for direct ingestion. *** ## Option 2: BonData Tunnel Agent A lightweight Docker container that runs inside your VNet and creates a secure outbound tunnel to BonData. Once running, BonData can query your database directly through the encrypted connection - no inbound firewall rules, no VPN, no public exposure. ``` ┌──────────────────────────────────────────────────┐ │ Your Azure VNet │ │ │ │ ┌─────────────┐ ┌────────────────┐ │ │ │ Azure SQL │◀──────│ BonData Tunnel │───────┼──▶ BonData Cloud (port 443 outbound) │ │ (private) │ │ Agent │ │ │ └─────────────┘ └────────────────┘ │ │ │ └──────────────────────────────────────────────────┘ ``` **Best for:** Teams that need real-time query access with minimal infrastructure changes. The agent only requires outbound HTTPS (port 443) and can run on any Docker host - Azure VMs, AKS, ACI, or Container Apps. Database credentials stay in your environment and all traffic is encrypted end-to-end. Contact our team to provision your tunnel token and walk through deployment for your environment. *** ## Option 3: Azure Private Link Azure Private Link creates a private endpoint in your VNet that routes traffic to BonData over the Microsoft backbone network, never crossing the public internet. **Best for:** Organizations with strict compliance requirements (HIPAA, SOC 2, FedRAMP) that prohibit any data traversal over the public internet, even when encrypted. Private Link provides the strongest network-level isolation available on Azure. **How it works:** * BonData exposes a Private Link Service in its Azure subscription * You create a Private Endpoint in your VNet pointing to that service * Your database traffic flows privately through the Microsoft backbone - no internet gateway, no public IPs Contact our team to get BonData's Private Link Service alias and configure the private endpoint for your subscription. *** ## Option 4: VNet Peering VNet Peering creates a direct network route between your VNet and BonData's VNet, allowing private IP communication across subscriptions and tenants. **Best for:** Teams that want a simple, low-cost network link. VNet Peering on Azure supports high bandwidth, low latency, and works across subscriptions, tenants, and regions (global peering). **How it works:** * A peering connection is established between your VNet and BonData's VNet * Routes are automatically exchanged between the peered networks * Your database's network security group or firewall is updated to allow connections from BonData's address space VNet Peering requires non-overlapping address spaces. Global VNet Peering (cross-region) is supported but may incur data transfer charges. Contact our team to exchange VNet details and coordinate the peering connection. *** ## Option 5: Azure VPN Gateway An Azure VPN Gateway creates an encrypted IPsec/IKE tunnel over the public internet between your network and BonData's infrastructure. **Best for:** Organizations that already have VPN infrastructure, need to connect from on-premises networks, or require connectivity where VNet Peering isn't possible due to overlapping address spaces. **How it works:** * A VPN Gateway is provisioned in your VNet's gateway subnet * An IPsec/IKE tunnel is established between your gateway and BonData's endpoint * All traffic is encrypted and routed through the tunnel * Supports both policy-based and route-based configurations Contact our team to exchange gateway details and configure the VPN tunnel. *** ## Option 6: Azure ExpressRoute Azure ExpressRoute provides a dedicated private connection between your infrastructure and BonData through a connectivity provider, bypassing the public internet entirely. **Best for:** Enterprise environments with very high data volumes, strict latency requirements, or regulatory mandates for dedicated connectivity. ExpressRoute provides the most predictable throughput and lowest latency, with options for 50 Mbps to 100 Gbps circuits. **How it works:** * A circuit is provisioned through an ExpressRoute connectivity provider * Private peering routes traffic between your network and BonData's Azure VNet * Traffic never touches the public internet - ideal for large-scale, continuous data sync * ExpressRoute Global Reach can extend connectivity across regions ExpressRoute typically takes 1-4 weeks to provision depending on the provider. ExpressRoute Direct is available for dedicated port-level access at 10 Gbps or 100 Gbps. Contact our team to discuss your throughput requirements and coordinate the connection. # Azure Synapse Analytics Source: https://docs.bondata.ai/integrations/databases/azure-synapse Connect BonData to Azure Synapse Analytics to sync your data warehouse tables Azure Synapse Analytics is Microsoft's enterprise analytics service that brings together data warehousing and big data analytics. With BonData, you can connect directly to a Synapse dedicated SQL pool to read, enrich, and act on your warehouse data within Agent workflows. ## Database Connection BonData connects to Azure Synapse Analytics over the TDS protocol using standard SQL authentication, the same way you would connect to a SQL Server database. ### Step 1: Locate Your SQL Endpoint 1. Open the [Azure Portal](https://portal.azure.com/) and go to your **Synapse workspace** 2. On the **Overview** page, find the **SQL endpoint** under **Dedicated SQL endpoint** 3. The endpoint has the format `.sql.azuresynapse.net` Connect to the **dedicated SQL pool** endpoint (`*.sql.azuresynapse.net`), not the serverless (`*-ondemand.sql.azuresynapse.net`) endpoint, unless you specifically intend to query serverless external tables. ### Step 2: Configure Firewall Rules 1. In your Synapse workspace, go to **Networking** (or **Firewalls and virtual networks**) 2. Add BonData's IP addresses to the allowed IP range 3. Ensure **Allow Azure services and resources to access this workspace** is configured as required by your security policy 4. Save the changes ### Step 3: Create a SQL Login and User (Recommended) For security, create a dedicated read-only user for BonData in your dedicated SQL pool: ```sql theme={null} -- In the master database, create a login CREATE LOGIN bondata_user WITH PASSWORD = 'your_secure_password'; -- In your dedicated SQL pool, create a user mapped to the login CREATE USER bondata_user FOR LOGIN bondata_user; -- Grant read access EXEC sp_addrolemember 'db_datareader', 'bondata_user'; ``` ### Step 4: Gather Connection Details Collect the following information: * **Host**: Your workspace SQL endpoint (e.g., `myworkspace.sql.azuresynapse.net`) * **Port**: `1433` * **Database**: The name of your dedicated SQL pool * **User**: The username created above * **Password**: The password for the user ### Step 5: Connect in BonData Enter your connection details in BonData to establish the connection. ## Required Fields | Field | Description | | -------- | ----------------------------------------------------------------- | | Host | Workspace SQL endpoint (e.g., `.sql.azuresynapse.net`) | | Port | Database server port (default: 1433) | | Database | Name of the dedicated SQL pool | | User | SQL authentication username | | Password | SQL authentication password | Azure Synapse requires encrypted connections. BonData connects using SQL authentication over an encrypted channel by default. ## Available Data Once connected, BonData can sync: * **Tables** - All tables the user has SELECT access to * **Views** - Database views accessible to the user * **Custom Queries** - Run custom T-SQL queries to extract specific data # BigQuery Source: https://docs.bondata.ai/integrations/databases/bigquery Connect BonData to Google BigQuery to sync your data warehouse tables Google BigQuery is a serverless, highly scalable data warehouse designed for fast SQL analytics over large datasets. With BonData, you can connect to your BigQuery project to read, enrich, and act on your warehouse data within Agent workflows. ## BigQuery Service Account Setup Follow these steps to create a service account for BonData. ### Step 1: Create a Service Account 1. Go to [Google Cloud Console](https://console.cloud.google.com/) 2. Select your project (or create one) 3. Navigate to **IAM & Admin** → **Service Accounts** 4. Click **Create Service Account** 5. Enter a name (e.g., `bondata-bigquery`) 6. Click **Create and Continue** ### Step 2: Grant Permissions Assign these roles to the service account: * **BigQuery Data Viewer** - to read table data * **BigQuery Job User** - to run queries * **BigQuery Metadata Viewer** - to list datasets and tables Click **Continue** → **Done** ### Step 3: Create a Key 1. Click on your new service account 2. Go to the **Keys** tab 3. Click **Add Key** → **Create new key** 4. Select **JSON** format 5. Click **Create** - the key file will download ### Step 4: Upload the Key Upload or paste the downloaded JSON key file in BonData. ## Required Fields | Field | Description | | -------------------- | ------------------------------------------------------ | | Service Account JSON | The JSON key file downloaded from Google Cloud Console | # ClickHouse Source: https://docs.bondata.ai/integrations/databases/clickhouse Connect BonData to ClickHouse to sync your analytical database tables ClickHouse is a fast, open-source column-oriented OLAP database designed for real-time analytical queries over large datasets. With BonData, you can connect directly to your ClickHouse database to read, enrich, and act on your data within Agent workflows. ## Database Connection BonData connects to ClickHouse over a secure interface. Both **ClickHouse Cloud** and **self-hosted** deployments are supported. ### Step 1: Gather Your Connection Details 1. Log in to the [ClickHouse Cloud console](https://clickhouse.cloud/) 2. Select your service and open **Connect** 3. Copy the **host** (e.g., `abc123.us-east-1.aws.clickhouse.cloud`) 4. Use port **8443** for the HTTPS interface (or **9440** for the native TLS interface) 1. Identify the hostname or IP address of your ClickHouse server 2. Ensure the HTTPS interface (default port **8443**) or the native TLS interface (default port **9440**) is enabled 3. Confirm your firewall allows connections from BonData's IP addresses ### Step 2: Create a Read-Only User (Recommended) For security, create a dedicated read-only user for BonData: ```sql theme={null} -- Create a user for BonData CREATE USER bondata_user IDENTIFIED BY 'your_secure_password'; -- Grant read access to your database GRANT SELECT ON your_database.* TO bondata_user; ``` ### Step 3: Gather Connection Details Collect the following information: * **Host**: Your ClickHouse server hostname * **Port**: `8443` (HTTPS) or `9440` (native TLS) * **Database**: The name of the database to connect to * **User**: The username created above * **Password**: The password for the user ### Step 4: Connect in BonData Enter your connection details in BonData to establish the connection. ## Required Fields | Field | Description | | -------- | ------------------------------------------------------------------------ | | Host | Database server hostname (e.g., `abc123.us-east-1.aws.clickhouse.cloud`) | | Port | HTTPS interface `8443` or native TLS interface `9440` | | Database | Name of the database to connect to | | User | Database username | | Password | Database password | BonData connects to ClickHouse over TLS. ClickHouse Cloud services require a secure connection; for self-hosted deployments, enable the HTTPS or native TLS port before connecting. ## Available Data Once connected, BonData can sync: * **Tables** - All tables the user has SELECT access to * **Views** - Standard views accessible to the user * **Materialized Views** - Materialized views accessible to the user * **Custom Queries** - Run custom SQL queries to extract specific data # Connecting Cloud SQL in a Private VPC Source: https://docs.bondata.ai/integrations/databases/cloud-sql-private-vpc How to securely connect BonData to a Google Cloud SQL database with no public IP If your Cloud SQL instance has no public IP and is only accessible within your VPC, there are several ways to securely connect it to BonData. The right approach depends on your security requirements, data volume, and infrastructure. Using a different cloud? See [AWS RDS](/integrations/databases/rds-private-vpc) or [Azure SQL](/integrations/databases/azure-sql-private-vnet). Self-service setup with Terraform Lightweight agent in your VPC Private endpoint, no public internet Direct network link between VPCs Encrypted tunnel over the internet Dedicated physical connection **Not sure which option is right for you?** The GCS + Cloud Functions approach works for most teams and you can set it up entirely on your own. For all other options, [reach out to our team](mailto:support@bondata.ai) - we'll help you evaluate your setup and find the best path forward. *** ## Option 1: Export to GCS via Cloud Functions
Recommended Self-service
A Cloud Function runs inside your VPC via a Serverless VPC Access connector, queries Cloud SQL, converts results to Parquet, and writes them to GCS. BonData reads from GCS via its native [S3-compatible integration](/integrations/cloud-storage/s3) or Google Cloud Storage. ``` Cloud SQL (private) ──▶ Cloud Function (VPC connector) ──▶ GCS bucket ──▶ BonData ▲ Cloud Scheduler (cron) ``` **Why this approach works best for most teams:** * No firewall changes - the function connects via your VPC's private network * Zero DB performance impact - queries run on your schedule * Database credentials never leave your GCP project * Fully self-service - no coordination with BonData needed ### Deploy with Terraform Create a `bondata-cloudsql-export.tf` file and fill in the variables at the top. This provisions the GCS bucket, Cloud Function, VPC connector, Cloud Scheduler job, and IAM in one apply. Store `db_password` in [Google Secret Manager](https://cloud.google.com/secret-manager/docs) and reference it via `TF_VAR_db_password` to avoid committing secrets. ```hcl theme={null} # ────────────────────────────────────────────── # Variables - fill these in # ────────────────────────────────────────────── variable "project_id" { description = "GCP project ID" } variable "region" { default = "us-central1" } variable "vpc_network" { description = "VPC network name (e.g. default)" } variable "vpc_connector_cidr" { default = "10.8.0.0/28" description = "Unused /28 CIDR for the VPC connector" } variable "db_host" { description = "Cloud SQL private IP" } variable "db_port" { default = "5432" } variable "db_name" { description = "Database name" } variable "db_user" { description = "Database user" } variable "db_password" { sensitive = true } variable "tables" { default = "public.users,public.orders" description = "Comma-separated tables" } variable "schedule" { default = "0 * * * *" description = "Cron schedule (default: every hour)" } variable "bucket_name" { default = "bondata-cloudsql-exports" } provider "google" { project = var.project_id region = var.region } # ────────────────────────────────────────────── # Enable required APIs # ────────────────────────────────────────────── resource "google_project_service" "apis" { for_each = toset([ "cloudfunctions.googleapis.com", "cloudbuild.googleapis.com", "cloudscheduler.googleapis.com", "vpcaccess.googleapis.com", "run.googleapis.com", ]) service = each.value disable_on_destroy = false } # ────────────────────────────────────────────── # GCS bucket # ────────────────────────────────────────────── resource "google_storage_bucket" "export" { name = var.bucket_name location = var.region uniform_bucket_level_access = true public_access_prevention = "enforced" } # ────────────────────────────────────────────── # Serverless VPC Access connector # ────────────────────────────────────────────── resource "google_vpc_access_connector" "connector" { name = "bondata-export" region = var.region network = var.vpc_network ip_cidr_range = var.vpc_connector_cidr depends_on = [google_project_service.apis] } # ────────────────────────────────────────────── # Service account # ────────────────────────────────────────────── resource "google_service_account" "function" { account_id = "bondata-export-fn" display_name = "BonData Cloud SQL Export" } resource "google_storage_bucket_iam_member" "writer" { bucket = google_storage_bucket.export.name role = "roles/storage.objectCreator" member = "serviceAccount:${google_service_account.function.email}" } resource "google_project_iam_member" "log_writer" { project = var.project_id role = "roles/logging.logWriter" member = "serviceAccount:${google_service_account.function.email}" } # ────────────────────────────────────────────── # Cloud Function source code # ────────────────────────────────────────────── data "archive_file" "function" { type = "zip" output_path = "${path.module}/function.zip" source { content = <<-PYTHON import os, io, json, logging from datetime import datetime, timezone from google.cloud import storage import psycopg2, pyarrow as pa, pyarrow.parquet as pq logger = logging.getLogger(__name__) DB = dict(host=os.environ["DB_HOST"], port=int(os.environ.get("DB_PORT","5432")), dbname=os.environ["DB_NAME"], user=os.environ["DB_USER"], password=os.environ["DB_PASSWORD"]) BUCKET = os.environ["GCS_BUCKET"] PREFIX = os.environ.get("GCS_PREFIX", "cloudsql-exports") TABLES = [t.strip() for t in os.environ["TABLES"].split(",")] CHUNK = int(os.environ.get("CHUNK_SIZE", "50000")) gcs = storage.Client() def export_table(cur, table, ts): safe = table.replace('"','').replace('.','__') cur.execute(f"SELECT * FROM {table} LIMIT 0") cols = [d[0] for d in cur.description] cur.execute(f"DECLARE _c CURSOR FOR SELECT * FROM {table}") part, total = 0, 0 bucket = gcs.bucket(BUCKET) while True: cur.execute(f"FETCH {CHUNK} FROM _c") rows = cur.fetchall() if not rows: break tbl = pa.table({c: [r[i] for r in rows] for i,c in enumerate(cols)}) buf = io.BytesIO() pq.write_table(tbl, buf); buf.seek(0) blob = bucket.blob(f"{PREFIX}/{safe}/dt={ts}/part-{part:05d}.parquet") blob.upload_from_file(buf, content_type="application/octet-stream") total += len(rows); part += 1 cur.execute("CLOSE _c") return total def handler(request): ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H%M%SZ") conn = psycopg2.connect(**DB) try: conn.autocommit = False; cur = conn.cursor() res = {} for t in TABLES: try: res[t] = export_table(cur, t, ts) except Exception as e: logger.error(f"{t}: {e}"); res[t] = str(e); conn.rollback() conn.commit() finally: conn.close() logger.info(json.dumps(res)) return json.dumps({"results": res}), 200 PYTHON filename = "main.py" } source { content = <<-REQS functions-framework==3.* psycopg2-binary==2.9.9 pyarrow==15.0.0 google-cloud-storage==2.* REQS filename = "requirements.txt" } } resource "google_storage_bucket" "source" { name = "${var.bucket_name}-fn-source" location = var.region uniform_bucket_level_access = true } resource "google_storage_bucket_object" "source" { name = "function-${data.archive_file.function.output_md5}.zip" bucket = google_storage_bucket.source.name source = data.archive_file.function.output_path } # ────────────────────────────────────────────── # Cloud Function (2nd gen) # ────────────────────────────────────────────── resource "google_cloudfunctions2_function" "export" { name = "bondata-cloudsql-export" location = var.region build_config { runtime = "python312" entry_point = "handler" source { storage_source { bucket = google_storage_bucket.source.name object = google_storage_bucket_object.source.name } } } service_config { max_instance_count = 1 available_memory = "512Mi" timeout_seconds = 300 service_account_email = google_service_account.function.email vpc_connector = google_vpc_access_connector.connector.id vpc_connector_egress_settings = "PRIVATE_RANGES_ONLY" environment_variables = { DB_HOST = var.db_host DB_PORT = var.db_port DB_NAME = var.db_name DB_USER = var.db_user DB_PASSWORD = var.db_password GCS_BUCKET = google_storage_bucket.export.name TABLES = var.tables } } depends_on = [google_project_service.apis] } # ────────────────────────────────────────────── # Cloud Scheduler (cron trigger) # ────────────────────────────────────────────── resource "google_service_account" "scheduler" { account_id = "bondata-export-scheduler" display_name = "BonData Export Scheduler" } resource "google_cloudfunctions2_function_iam_member" "invoker" { project = var.project_id location = var.region cloud_function = google_cloudfunctions2_function.export.name role = "roles/cloudfunctions.invoker" member = "serviceAccount:${google_service_account.scheduler.email}" } resource "google_cloud_run_service_iam_member" "invoker" { project = var.project_id location = var.region service = google_cloudfunctions2_function.export.name role = "roles/run.invoker" member = "serviceAccount:${google_service_account.scheduler.email}" } resource "google_cloud_scheduler_job" "trigger" { name = "bondata-cloudsql-export" region = var.region schedule = var.schedule http_target { uri = google_cloudfunctions2_function.export.url http_method = "POST" oidc_token { service_account_email = google_service_account.scheduler.email } } depends_on = [google_project_service.apis] } # ────────────────────────────────────────────── # Outputs # ────────────────────────────────────────────── output "bucket" { value = google_storage_bucket.export.name } output "function_url" { value = google_cloudfunctions2_function.export.url } ``` ### Deploy ```bash theme={null} terraform init terraform apply \ -var="project_id=my-gcp-project" \ -var="vpc_network=default" \ -var="db_host=10.0.0.3" \ -var="db_name=production" \ -var="db_user=bondata_user" \ -var="db_password=CHANGEME" \ -var="tables=public.users,public.orders" ``` ### Connect GCS to BonData Once data is flowing, connect BonData to the bucket: 1. In BonData, go to **Integrations** → **Add Integration** → **Amazon S3** 2. Use [GCS interoperability keys](https://cloud.google.com/storage/docs/interoperability) (S3-compatible) with the endpoint `https://storage.googleapis.com` 3. Enter your bucket name and the prefix (default: `cloudsql-exports`) GCS is S3-compatible. Generate HMAC keys in the [Cloud Storage Settings](https://console.cloud.google.com/storage/settings) → **Interoperability** tab, then use them as Access Key ID / Secret Access Key in the BonData S3 integration. *** ## Option 2: BonData Tunnel Agent A lightweight Docker container that runs inside your VPC and creates a secure outbound tunnel to BonData. Once running, BonData can query your database directly through the encrypted connection - no inbound firewall rules, no VPN, no public exposure. ``` ┌──────────────────────────────────────────────┐ │ Your GCP VPC │ │ │ │ ┌───────────┐ ┌────────────────┐ │ │ │ Cloud SQL │◀──────│ BonData Tunnel │─────┼──▶ BonData Cloud (port 443 outbound) │ │ (private) │ │ Agent │ │ │ └───────────┘ └────────────────┘ │ │ │ └──────────────────────────────────────────────┘ ``` **Best for:** Teams that need real-time query access with minimal infrastructure changes. The agent only requires outbound HTTPS (port 443) and can run on any Docker host - Compute Engine, GKE, or Cloud Run. Database credentials stay in your environment and all traffic is encrypted end-to-end. Contact our team to provision your tunnel token and walk through deployment for your environment. *** ## Option 3: Private Service Connect Google Private Service Connect creates a private endpoint in your VPC that routes traffic to BonData without it ever crossing the public internet. Traffic stays entirely within the Google network. **Best for:** Organizations with strict compliance requirements (HIPAA, SOC 2) that prohibit any data traversal over the public internet, even when encrypted. Private Service Connect provides the strongest network-level isolation without the complexity of VPC Peering or VPN. **How it works:** * BonData publishes a Private Service Connect service * You create a forwarding rule and endpoint in your VPC pointing to that service * Your Cloud SQL traffic flows privately through Google's backbone - no NAT, no public IPs Contact our team to get BonData's service attachment and configure Private Service Connect for your project. *** ## Option 4: VPC Network Peering VPC Network Peering creates a direct network route between your VPC and BonData's VPC, allowing private IP communication across projects. **Best for:** Teams that want a simple, low-cost network link. VPC Peering on GCP has no per-hour charge, supports full-bandwidth communication, and works across projects and organizations. **How it works:** * A peering connection is established between your VPC network and BonData's VPC network * Routes are automatically exchanged (or custom routes are exported) * Your Cloud SQL authorized networks are updated to allow connections from BonData's IP range GCP VPC Peering supports cross-project and cross-organization peering. CIDR ranges must not overlap. Contact our team to exchange VPC details and coordinate the peering connection. *** ## Option 5: Cloud VPN Google Cloud VPN creates an encrypted IPsec tunnel over the public internet between your network and BonData's infrastructure. **Best for:** Organizations that already have VPN infrastructure or need to connect from on-premises networks. Also useful when VPC Peering isn't possible due to overlapping CIDR ranges or cross-cloud connectivity needs. **How it works:** * A Cloud VPN gateway is created in your VPC * An IPsec tunnel is established between your gateway and BonData's endpoint * All traffic is encrypted and routed through the tunnel * HA VPN provides 99.99% availability with dual tunnels Contact our team to exchange gateway details and configure the VPN tunnel. *** ## Option 6: Cloud Interconnect Google Cloud Interconnect provides a dedicated physical network connection (10 Gbps or 100 Gbps) between your infrastructure and BonData, bypassing the public internet entirely. **Best for:** Enterprise environments with very high data volumes, strict latency requirements, or regulatory mandates for dedicated connectivity. Dedicated Interconnect provides the most consistent throughput and lowest latency of any option. Partner Interconnect is available for smaller bandwidth needs. **How it works:** * A physical cross-connect is established at a Google colocation facility (Dedicated) or through a supported partner (Partner) * A VLAN attachment routes traffic between your network and BonData * Traffic never touches the public internet - ideal for large-scale, continuous data sync Dedicated Interconnect typically takes 2-4 weeks to provision. Partner Interconnect can be faster depending on the provider. Contact our team to discuss your throughput requirements and coordinate the connection. # Databricks Source: https://docs.bondata.ai/integrations/databases/databricks Connect BonData to Databricks to sync your lakehouse data Databricks is a unified analytics platform built on Apache Spark, combining data engineering, data science, and machine learning in a single lakehouse architecture. With BonData, you can connect to your Databricks workspace to read and enrich your lakehouse data within Agent workflows. BonData supports two authentication methods for Databricks. Recommended for production environments Quick setup for testing *** ## OAuth Authentication Follow these steps to configure OAuth authentication for BonData. ### Step 1: Create an OAuth Application 1. Log in to your Databricks workspace 2. Go to **Settings** → **Developer** → **OAuth Applications** 3. Click **Create Application** 4. Configure the application: * **Name**: `BonData Integration` * **Redirect URL**: `https://app.bondata.ai/auth/oauth2/callback` * **Scopes**: Select `all-apis` and `offline_access` 5. Click **Create** ### Step 2: Copy Credentials After creation, you'll see: * **Client ID** - the unique identifier for your OAuth app * **Client Secret** - click **Generate Secret** to create one Copy both values - the Client Secret won't be shown again. ### Step 3: Get Your Workspace URL Your workspace URL is in your browser address bar: * Example: `https://adb-1234567890123456.7.azuredatabricks.net` ### Step 4: Enter Credentials Enter your Client ID, Client Secret, and Workspace URL in BonData, then click Connect to authorize via OAuth. ### Required Fields (OAuth) | Field | Description | | ------------- | ----------------------------- | | Client ID | OAuth app Client ID | | Client Secret | OAuth app Client Secret | | Workspace URL | Your Databricks workspace URL | *** ## Personal Access Token Follow these steps to create a Personal Access Token for BonData. ### Step 1: Access User Settings 1. Log in to your Databricks workspace 2. Click your username in the top-right corner 3. Select **Settings** from the dropdown ### Step 2: Generate a Token 1. Go to the **Developer** section 2. Click **Manage** next to Access tokens 3. Click **Generate new token** 4. Enter a description (e.g., `BonData Integration`) 5. Set the lifetime (or leave blank for no expiration) 6. Click **Generate** 7. **Copy the token immediately** - it won't be shown again ### Step 3: Get Your Workspace URL Your workspace URL is in your browser address bar: * Example: `https://adb-1234567890123456.7.azuredatabricks.net` ### Step 4: Enter Credentials Enter your Personal Access Token and Workspace URL in BonData. ### Required Fields (Token) | Field | Description | | --------------------- | -------------------------------------------------------------- | | Personal Access Token | Generated from Databricks Settings → Developer → Access tokens | | Workspace URL | Your Databricks workspace URL | # MariaDB Source: https://docs.bondata.ai/integrations/databases/mariadb Connect BonData to MariaDB to sync your database tables MariaDB is a community-driven, open-source relational database forked from MySQL, offering enhanced performance and additional storage engines. With BonData, you can connect directly to your MariaDB database to read, enrich, and act on your data within Agent workflows. ## Database Connection BonData connects directly to your MariaDB database using standard connection credentials. MariaDB is fully compatible with MySQL, so the setup process is similar. ### Step 1: Prepare Your Database Ensure your MariaDB server is accessible from BonData's IP addresses. You may need to: 1. Configure your firewall to allow connections on port 3306 (or your custom port) 2. Update the `bind-address` in your MariaDB configuration if needed ### Step 2: Create a Read-Only User (Recommended) For security, create a dedicated read-only user for BonData: ```sql theme={null} -- Create a user for BonData (update 'your_ip' as needed) CREATE USER 'bondata_user'@'%' IDENTIFIED BY 'your_secure_password'; -- Grant select access on the database GRANT SELECT ON your_database.* TO 'bondata_user'@'%'; -- Apply the changes FLUSH PRIVILEGES; ``` ### Step 3: Gather Connection Details Collect the following information: * **Host**: Your database server hostname or IP address * **Port**: Usually 3306 * **Database**: The name of the database to connect to * **User**: The username created above * **Password**: The password for the user ### Step 4: Connect in BonData Enter your connection details in BonData to establish the connection. ## Required Fields | Field | Description | | -------- | -------------------------------------- | | Host | Database server hostname or IP address | | Port | Database server port (default: 3306) | | Database | Name of the database to connect to | | User | Database username | | Password | Database password | BonData supports SSL connections for enhanced security. Contact support if you need to configure SSL certificates. ## Available Data Once connected, BonData can sync: * **Tables** - All tables the user has SELECT access to * **Views** - Database views accessible to the user * **Custom Queries** - Run custom SQL queries to extract specific data # MySQL Source: https://docs.bondata.ai/integrations/databases/mysql Connect BonData to MySQL to sync your database tables MySQL is one of the world's most popular open-source relational databases, widely used for web applications, analytics, and enterprise systems. With BonData, you can connect directly to your MySQL database to read, enrich, and act on your data within Agent workflows. ## Database Connection BonData connects directly to your MySQL database using standard connection credentials. ### Step 1: Prepare Your Database Ensure your MySQL server is accessible from BonData's IP addresses. You may need to: 1. Configure your firewall to allow connections on port 3306 (or your custom port) 2. Update the `bind-address` in your MySQL configuration if needed ### Step 2: Create a Read-Only User (Recommended) For security, create a dedicated read-only user for BonData: ```sql theme={null} -- Create a user for BonData (update 'your_ip' as needed) CREATE USER 'bondata_user'@'%' IDENTIFIED BY 'your_secure_password'; -- Grant select access on the database GRANT SELECT ON your_database.* TO 'bondata_user'@'%'; -- Apply the changes FLUSH PRIVILEGES; ``` ### Step 3: Gather Connection Details Collect the following information: * **Host**: Your database server hostname or IP address * **Port**: Usually 3306 * **Database**: The name of the database to connect to * **User**: The username created above * **Password**: The password for the user ### Step 4: Connect in BonData Enter your connection details in BonData to establish the connection. ## Required Fields | Field | Description | | -------- | -------------------------------------- | | Host | Database server hostname or IP address | | Port | Database server port (default: 3306) | | Database | Name of the database to connect to | | User | Database username | | Password | Database password | BonData supports SSL connections for enhanced security. Contact support if you need to configure SSL certificates. ## Available Data Once connected, BonData can sync: * **Tables** - All tables the user has SELECT access to * **Views** - Database views accessible to the user * **Custom Queries** - Run custom SQL queries to extract specific data # Oracle Database Source: https://docs.bondata.ai/integrations/databases/oracle Connect BonData to Oracle Database to sync your database tables Oracle Database is an enterprise-grade relational database management system known for high availability, scalability, and advanced security features. With BonData, you can connect directly to your Oracle Database to read, enrich, and act on your data within Agent workflows. ## Database Connection BonData connects directly to your Oracle Database using standard connection credentials. ### Step 1: Prepare Your Database Ensure your Oracle Database is accessible from BonData's IP addresses. You may need to: 1. Configure your firewall to allow connections on port 1521 (or your custom port) 2. Verify the listener is configured to accept remote connections ### Step 2: Create a Read-Only User (Recommended) For security, create a dedicated read-only user for BonData: ```sql theme={null} -- Create a user for BonData CREATE USER bondata_user IDENTIFIED BY your_secure_password; -- Grant basic connection privileges GRANT CREATE SESSION TO bondata_user; -- Grant select access on specific tables GRANT SELECT ON schema_name.table_name TO bondata_user; -- Or grant select on all tables in a schema BEGIN FOR t IN (SELECT table_name FROM all_tables WHERE owner = 'SCHEMA_NAME') LOOP EXECUTE IMMEDIATE 'GRANT SELECT ON SCHEMA_NAME.' || t.table_name || ' TO bondata_user'; END LOOP; END; / ``` ### Step 3: Gather Connection Details Collect the following information: * **Host**: Your database server hostname or IP address * **Port**: Usually 1521 * **Service Name**: The Oracle service name (e.g., `ORCL`) * **User**: The username created above * **Password**: The password for the user ### Step 4: Connect in BonData Enter your connection details in BonData to establish the connection. ## Required Fields | Field | Description | | ------------ | -------------------------------------- | | Host | Database server hostname or IP address | | Port | Database server port (default: 1521) | | Service Name | Oracle service name (e.g., ORCL) | | User | Database username | | Password | Database password | For Oracle Autonomous Data Warehouse (ADW), see the dedicated Oracle ADW integration which uses wallet-based authentication. ## Available Data Once connected, BonData can sync: * **Tables** - All tables the user has SELECT access to * **Views** - Database views accessible to the user * **Custom Queries** - Run custom SQL queries to extract specific data # Oracle Autonomous Database Source: https://docs.bondata.ai/integrations/databases/oracle-adw Connect BonData to Oracle Autonomous Database (ADW/ATP) using Oracle REST Data Services Oracle Autonomous Database is a fully managed cloud database service that automates provisioning, patching, tuning, and backups. With BonData, you can connect to your Autonomous Data Warehouse (ADW) or Autonomous Transaction Processing (ATP) instance via Oracle REST Data Services (ORDS). ## Oracle Autonomous Database Setup Follow these steps to configure OAuth credentials for BonData. ### Step 1: Enable ORDS (Oracle REST Data Services) 1. Log in to Oracle Cloud Console 2. Navigate to your Autonomous Database 3. Go to **Database Actions** → **REST** 4. Enable ORDS if not already enabled ### Step 2: Create an OAuth Client 1. In Database Actions, go to **REST** → **Security** → **OAuth Clients** 2. Click **Create OAuth Client** 3. Enter a name (e.g., `BonData Integration`) 4. Set **Grant Type** to `Client Credentials` 5. Note the **Client ID** and **Client Secret** ### Step 3: Get Your ORDS URL Your ORDS URL is in the format: ``` https://{ADB_OCID}.adb.{REGION}.oraclecloudapps.com/ords/{SCHEMA} ``` Find this in Database Actions under **REST** → **Overview**. ### Step 4: Enter Credentials Enter your Client ID, Client Secret, and ORDS URL in BonData. ## Required Fields | Field | Description | | ----------------- | ----------------------------------------------- | | Client ID | OAuth Client ID from ORDS Security settings | | Client Secret | OAuth Client Secret from ORDS Security settings | | Authorization URL | Your ORDS base URL from Database Actions | # PostgreSQL Source: https://docs.bondata.ai/integrations/databases/postgresql Connect BonData to PostgreSQL to sync your database tables PostgreSQL is a powerful, open-source relational database known for reliability, extensibility, and standards compliance. With BonData, you can connect directly to your PostgreSQL database to read, enrich, and act on your data within Agent workflows. ## Database Connection BonData connects directly to your PostgreSQL database using standard connection credentials. ### Step 1: Prepare Your Database Ensure your PostgreSQL server is accessible from BonData's IP addresses. You may need to: 1. Configure your firewall to allow connections on port 5432 (or your custom port) 2. Update `pg_hba.conf` to allow remote connections 3. Set `listen_addresses` in `postgresql.conf` if needed ### Step 2: Create a Read-Only User (Recommended) For security, create a dedicated read-only user for BonData: ```sql theme={null} -- Create a user for BonData CREATE USER bondata_user WITH PASSWORD 'your_secure_password'; -- Grant connect access to the database GRANT CONNECT ON DATABASE your_database TO bondata_user; -- Grant usage on schema GRANT USAGE ON SCHEMA public TO bondata_user; -- Grant select on all tables GRANT SELECT ON ALL TABLES IN SCHEMA public TO bondata_user; -- Grant select on future tables ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO bondata_user; ``` ### Step 3: Gather Connection Details Collect the following information: * **Host**: Your database server hostname or IP address * **Port**: Usually 5432 * **Database**: The name of the database to connect to * **User**: The username created above * **Password**: The password for the user ### Step 4: Connect in BonData Enter your connection details in BonData to establish the connection. ## Required Fields | Field | Description | | -------- | -------------------------------------- | | Host | Database server hostname or IP address | | Port | Database server port (default: 5432) | | Database | Name of the database to connect to | | User | Database username | | Password | Database password | BonData supports SSL connections for enhanced security. Contact support if you need to configure SSL certificates. ## Available Data Once connected, BonData can sync: * **Tables** - All tables the user has SELECT access to * **Views** - Database views accessible to the user * **Custom Queries** - Run custom SQL queries to extract specific data Learn how to securely connect RDS databases that aren't publicly accessible. # Connecting RDS in a Private VPC Source: https://docs.bondata.ai/integrations/databases/rds-private-vpc How to securely connect BonData to an AWS RDS database inside a private VPC If your RDS database is in a private VPC with no public access, there are several ways to securely connect it to BonData. The right approach depends on your security requirements, data volume, and infrastructure. Using a different cloud? See [GCP Cloud SQL](/integrations/databases/cloud-sql-private-vpc) or [Azure SQL](/integrations/databases/azure-sql-private-vnet). Self-service setup with Terraform Lightweight agent in your VPC Private endpoint, no public internet Direct network link between VPCs Encrypted tunnel over the internet Dedicated physical connection **Not sure which option is right for you?** The S3 + Lambda approach works for most teams and you can set it up entirely on your own. For all other options, [reach out to our team](mailto:support@bondata.ai) - we'll help you evaluate your setup and find the best path forward. *** ## Option 1: Export to S3 via Lambda
Recommended Self-service
A Lambda function runs inside your VPC on a schedule, queries RDS, converts results to Parquet, and writes them to S3. BonData reads from S3 via its native [S3 integration](/integrations/cloud-storage/s3). ``` RDS (private) ──▶ Lambda (your VPC) ──▶ S3 bucket ──▶ BonData ▲ EventBridge (schedule) ``` **Why this approach works best for most teams:** * No firewall changes - Lambda runs inside your VPC * Zero DB performance impact - queries run on your schedule * Database credentials never leave your AWS account * Fully self-service - no coordination with BonData needed ### Deploy with Terraform Create a `bondata-rds-export.tf` file and fill in the variables at the top. This provisions the S3 bucket, Lambda function, IAM role, EventBridge schedule, and networking in one apply. Store `db_password` in [Terraform Cloud](https://developer.hashicorp.com/terraform/cloud-docs/workspaces/variables) or pass it via `TF_VAR_db_password` to avoid committing secrets. ```hcl theme={null} # ────────────────────────────────────────────── # Variables - fill these in # ────────────────────────────────────────────── variable "aws_region" { default = "us-east-1" } variable "vpc_id" { description = "VPC where RDS lives" } variable "subnet_ids" { description = "Private subnets that can reach RDS" type = list(string) } variable "rds_sg_id" { description = "Security group of your RDS instance" } variable "db_host" { description = "RDS endpoint" } variable "db_port" { default = "5432" } variable "db_name" { description = "Database name" } variable "db_user" { description = "Database user" } variable "db_password" { sensitive = true } variable "tables" { description = "Comma-separated tables" default = "public.users,public.orders" } variable "schedule" { default = "rate(1 hour)" description = "EventBridge schedule expression" } variable "bucket_name" { default = "bondata-rds-exports" } provider "aws" { region = var.aws_region } # ────────────────────────────────────────────── # S3 bucket # ────────────────────────────────────────────── resource "aws_s3_bucket" "export" { bucket = var.bucket_name } resource "aws_s3_bucket_public_access_block" "export" { bucket = aws_s3_bucket.export.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } # ────────────────────────────────────────────── # VPC endpoint for S3 (so Lambda can reach S3) # ────────────────────────────────────────────── data "aws_route_tables" "private" { vpc_id = var.vpc_id } resource "aws_vpc_endpoint" "s3" { vpc_id = var.vpc_id service_name = "com.amazonaws.${var.aws_region}.s3" route_table_ids = data.aws_route_tables.private.ids } # ────────────────────────────────────────────── # Security group - allows Lambda to reach RDS # ────────────────────────────────────────────── resource "aws_security_group" "lambda" { name_prefix = "bondata-export-lambda-" vpc_id = var.vpc_id egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_vpc_security_group_ingress_rule" "rds_from_lambda" { security_group_id = var.rds_sg_id referenced_security_group_id = aws_security_group.lambda.id from_port = var.db_port to_port = var.db_port ip_protocol = "tcp" } # ────────────────────────────────────────────── # IAM role for Lambda # ────────────────────────────────────────────── resource "aws_iam_role" "lambda" { name_prefix = "bondata-export-" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow", Principal = { Service = "lambda.amazonaws.com" }, Action = "sts:AssumeRole" }] }) } resource "aws_iam_role_policy" "lambda" { role = aws_iam_role.lambda.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow", Action = ["s3:PutObject"], Resource = "${aws_s3_bucket.export.arn}/*" }, { Effect = "Allow", Action = ["s3:ListBucket"], Resource = aws_s3_bucket.export.arn }, { Effect = "Allow", Action = ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"], Resource = "arn:aws:logs:*:*:*" }, { Effect = "Allow", Action = ["ec2:CreateNetworkInterface","ec2:DescribeNetworkInterfaces","ec2:DeleteNetworkInterface"], Resource = "*" } ] }) } # ────────────────────────────────────────────── # Lambda function # ────────────────────────────────────────────── data "archive_file" "lambda" { type = "archive" output_path = "${path.module}/lambda.zip" source { content = <<-PYTHON import os, io, json, logging from datetime import datetime, timezone import boto3, psycopg2, pyarrow as pa, pyarrow.parquet as pq logger = logging.getLogger() logger.setLevel(logging.INFO) DB = dict(host=os.environ["DB_HOST"], port=int(os.environ.get("DB_PORT","5432")), dbname=os.environ["DB_NAME"], user=os.environ["DB_USER"], password=os.environ["DB_PASSWORD"]) BUCKET = os.environ["S3_BUCKET"] PREFIX = os.environ.get("S3_PREFIX", "rds-exports") TABLES = [t.strip() for t in os.environ["TABLES"].split(",")] CHUNK = int(os.environ.get("CHUNK_SIZE", "50000")) s3 = boto3.client("s3") def export_table(cur, table, ts): safe = table.replace('"','').replace('.','__') cur.execute(f"SELECT * FROM {table} LIMIT 0") cols = [d[0] for d in cur.description] cur.execute(f"DECLARE _c CURSOR FOR SELECT * FROM {table}") part, total = 0, 0 while True: cur.execute(f"FETCH {CHUNK} FROM _c") rows = cur.fetchall() if not rows: break tbl = pa.table({c: [r[i] for r in rows] for i,c in enumerate(cols)}) buf = io.BytesIO() pq.write_table(tbl, buf); buf.seek(0) s3.upload_fileobj(buf, BUCKET, f"{PREFIX}/{safe}/dt={ts}/part-{part:05d}.parquet") total += len(rows); part += 1 cur.execute("CLOSE _c") return total def handler(event, context): ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H%M%SZ") conn = psycopg2.connect(**DB) try: conn.autocommit = False; cur = conn.cursor() res = {} for t in TABLES: try: res[t] = export_table(cur, t, ts) except Exception as e: logger.error(f"{t}: {e}"); res[t] = str(e); conn.rollback() conn.commit() finally: conn.close() logger.info(json.dumps(res)) return {"statusCode": 200, "results": res} PYTHON filename = "index.py" } } resource "aws_lambda_function" "export" { function_name = "bondata-rds-export" role = aws_iam_role.lambda.arn handler = "index.handler" runtime = "python3.12" timeout = 300 memory_size = 512 filename = data.archive_file.lambda.output_path source_code_hash = data.archive_file.lambda.output_base64sha256 vpc_config { subnet_ids = var.subnet_ids security_group_ids = [aws_security_group.lambda.id] } environment { variables = { DB_HOST = var.db_host DB_PORT = var.db_port DB_NAME = var.db_name DB_USER = var.db_user DB_PASSWORD = var.db_password S3_BUCKET = aws_s3_bucket.export.id TABLES = var.tables } } layers = [] # Add your psycopg2 + pyarrow layer ARN here - see note below } # ────────────────────────────────────────────── # EventBridge schedule # ────────────────────────────────────────────── resource "aws_cloudwatch_event_rule" "schedule" { name = "bondata-rds-export" schedule_expression = var.schedule } resource "aws_cloudwatch_event_target" "lambda" { rule = aws_cloudwatch_event_rule.schedule.name arn = aws_lambda_function.export.arn } resource "aws_lambda_permission" "eventbridge" { action = "lambda:InvokeFunction" function_name = aws_lambda_function.export.function_name principal = "events.amazonaws.com" source_arn = aws_cloudwatch_event_rule.schedule.arn } # ────────────────────────────────────────────── # Outputs # ────────────────────────────────────────────── output "bucket" { value = aws_s3_bucket.export.id } output "lambda_name" { value = aws_lambda_function.export.function_name } ``` **Lambda layer:** The function requires `psycopg2` and `pyarrow`. Build a layer or use a public one: ```bash theme={null} docker run --rm -v $(pwd):/out python:3.12 bash -c \ "pip install psycopg2-binary==2.9.9 pyarrow==15.0.0 -t /out/python && cd /out && zip -r layer.zip python" aws lambda publish-layer-version \ --layer-name bondata-rds-deps \ --zip-file fileb://layer.zip \ --compatible-runtimes python3.12 ``` Then add the layer ARN to the `layers` list in the Terraform file. ### Deploy ```bash theme={null} terraform init terraform apply -var="vpc_id=vpc-XXX" \ -var='subnet_ids=["subnet-AAA","subnet-BBB"]' \ -var="rds_sg_id=sg-XXX" \ -var="db_host=mydb.abc123.us-east-1.rds.amazonaws.com" \ -var="db_name=production" \ -var="db_user=bondata_user" \ -var="db_password=CHANGEME" \ -var="tables=public.users,public.orders" ``` ### Connect S3 to BonData Once data is flowing, connect BonData to the bucket using the [S3 integration](/integrations/cloud-storage/s3): 1. In BonData, go to **Integrations** → **Add Integration** → **Amazon S3** 2. Enter your bucket name and the prefix (default: `rds-exports`) 3. Provide IAM credentials with **read-only** access to the bucket *** ## Option 2: BonData Tunnel Agent A lightweight Docker container that runs inside your VPC and creates a secure outbound tunnel to BonData. Once running, BonData can query your database directly through the encrypted connection - no inbound firewall rules, no VPN, no public exposure. ``` ┌─────────────────────────────────────────┐ │ Your VPC │ │ │ │ ┌─────────┐ ┌────────────────┐ │ │ │ RDS │◀──────│ BonData Tunnel │──┼──▶ BonData Cloud (port 443 outbound) │ │(private)│ │ Agent │ │ │ └─────────┘ └────────────────┘ │ │ │ └─────────────────────────────────────────┘ ``` **Best for:** Teams that need real-time query access with minimal infrastructure changes. The agent only requires outbound HTTPS (port 443) and can run on any Docker host - EC2, ECS, EKS, or Fargate. Database credentials stay in your environment and all traffic is encrypted end-to-end. Contact our team to provision your tunnel token and walk through deployment for your environment. *** ## Option 3: AWS PrivateLink AWS PrivateLink creates a private endpoint in your VPC that routes traffic to BonData without it ever crossing the public internet. Traffic stays entirely within the AWS network. **Best for:** Organizations with strict compliance requirements (HIPAA, SOC 2) that prohibit any data traversal over the public internet, even when encrypted. PrivateLink provides the strongest network-level isolation without the complexity of VPC Peering or VPN. **How it works:** * BonData exposes a VPC Endpoint Service in its AWS account * You create an Interface VPC Endpoint in your VPC pointing to that service * Your RDS traffic flows privately through the AWS backbone - no internet gateway, no NAT, no public IPs Contact our team to get BonData's endpoint service name and configure PrivateLink for your account. *** ## Option 4: VPC Peering VPC Peering creates a direct network route between your VPC and BonData's VPC, allowing private IP communication as if they were on the same network. **Best for:** Teams that want a simple, low-cost network link with low latency. VPC Peering has no per-hour charge (you only pay for data transfer) and supports full-bandwidth communication between VPCs. **How it works:** * A peering connection is established between your VPC and BonData's VPC * Route tables on both sides are updated to direct traffic through the peering link * Your RDS security group is updated to allow inbound connections from BonData's CIDR range VPC Peering requires both VPCs to be in the same AWS region or use inter-region peering. CIDR ranges must not overlap. Contact our team to exchange VPC details and coordinate the peering connection. *** ## Option 5: Site-to-Site VPN An AWS Site-to-Site VPN creates an encrypted IPsec tunnel over the public internet between your network and BonData's infrastructure. **Best for:** Organizations that already have VPN infrastructure or need to connect from on-premises networks (not just AWS). Also useful when VPC Peering isn't possible due to overlapping CIDR ranges. **How it works:** * A Virtual Private Gateway is attached to your VPC * An IPsec tunnel is established between your gateway and BonData's endpoint * All traffic is encrypted and routed through the tunnel * Supports both static and dynamic (BGP) routing Contact our team to exchange gateway details and configure the VPN tunnel. *** ## Option 6: AWS Direct Connect AWS Direct Connect provides a dedicated physical network connection (1 Gbps or 10 Gbps) between your infrastructure and BonData, bypassing the public internet entirely. **Best for:** Enterprise environments with very high data volumes, strict latency requirements, or regulatory mandates for dedicated connectivity. Direct Connect provides the most consistent throughput and lowest latency of any option. **How it works:** * A physical cross-connect is established at an AWS Direct Connect location * A dedicated Virtual Interface (VIF) routes traffic between your network and BonData * Traffic never touches the public internet - ideal for large-scale, continuous data sync Direct Connect typically takes 2-4 weeks to provision and involves coordination between your network team, AWS, and BonData. Contact our team to discuss your throughput requirements and coordinate the connection. # Amazon Redshift Source: https://docs.bondata.ai/integrations/databases/redshift Connect BonData to Amazon Redshift to sync your data warehouse tables Amazon Redshift is a fully managed, petabyte-scale cloud data warehouse from AWS, optimized for fast analytics on structured data. With BonData, you can connect to your Redshift cluster to read, enrich, and act on your warehouse data within Agent workflows. ## Amazon Redshift Setup Follow these steps to set up IAM credentials for BonData. ### Step 1: Create an IAM User 1. Go to [AWS IAM Console](https://console.aws.amazon.com/iam/) 2. Click **Users** → **Create user** 3. Enter a name (e.g., `bondata-redshift`) 4. Click **Next** → **Attach policies directly** ### Step 2: Attach Permissions Create a policy with these permissions: ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "redshift:GetClusterCredentials", "redshift:DescribeClusters", "redshift-data:ExecuteStatement", "redshift-data:GetStatementResult", "redshift-data:DescribeStatement" ], "Resource": "*" } ] } ``` ### Step 3: Create Access Keys 1. Go to your new user → **Security credentials** 2. Click **Create access key** 3. Select **Third-party service** → **Next** 4. Copy the **Access Key ID** and **Secret Access Key** ### Step 4: Get Cluster Details * **Cluster Identifier**: Found in Redshift console (e.g., `my-cluster`) * **AWS Region**: The region of your cluster (e.g., `us-east-1`) * **Workgroup**: For Serverless Redshift only ### Step 5: Grant Database Permissions AWS IAM only controls access to the Redshift Data API — it does **not** grant access to your tables. The **Db User** you connect as also needs read permissions **inside** Redshift. For every schema you want to sync, grant the user `USAGE` on the schema and `SELECT` on its tables: ```sql theme={null} -- Let the user see the schema and its tables GRANT USAGE ON SCHEMA public TO bondata_user; -- Let the user read existing tables (required for column discovery and sync) GRANT SELECT ON ALL TABLES IN SCHEMA public TO bondata_user; -- Keep newly created tables readable ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO bondata_user; ``` Repeat these statements for each schema you plan to sync, and run them as a user allowed to grant on those tables (the table owner or a superuser). Schema `USAGE` alone makes tables **visible** in the picker but not **readable**. Without `SELECT`, a table still shows up in the list, but BonData can't read its columns — so it offers only the synthetic `_bondata_row_id` primary key and sync will fail. If a table appears with no real columns to choose from, grant `SELECT` on it to the connecting user. #### Tables built by dbt (or anything that rebuilds a table) Grants live on the table **object**, not its name. If a table is produced by **dbt** — or any pipeline that recreates it on each run (a `table` materialization, a full refresh, `CREATE TABLE AS`, a create-then-swap) — the rebuild drops the old object and creates a new one with **no grants**. A one-time `GRANT SELECT` you ran by hand disappears on the very next run and the table becomes unreadable again. This is the most common cause of a Redshift table that syncs fine at first and then later "loses" its columns. Neither statement above survives a rebuild by another account: `GRANT SELECT ON ALL TABLES` only affects tables that exist **at that moment**, and `ALTER DEFAULT PRIVILEGES` **without** a `FOR USER` clause applies only to tables created by the user who *ran* it — **not** the dbt/ETL service account that actually creates the table. Pick **one** durable fix: **1. Grant from dbt (recommended).** Add a [`grants`](https://docs.getdbt.com/reference/resource-configs/grants) config so dbt re-applies `SELECT` every time it rebuilds the table. In the model's `.sql` file: ```sql theme={null} {{ config(grants = {'select': ['bondata_user']}) }} ``` or for every model at once, in `dbt_project.yml`: ```yaml theme={null} models: +grants: select: ['bondata_user'] ``` dbt reconciles the object's grants to match this config after each build, so the permission persists across rebuilds. If BonData connects through a role or group, prefix the grantee: `role:bondata_role` or `group:bondata_group`. **2. Redshift scoped permissions.** Grant on all current **and future** tables in the schema, no matter which user creates them — no dbt change required: ```sql theme={null} GRANT SELECT FOR TABLES IN SCHEMA public TO bondata_user; ``` **3. Default privileges scoped to the dbt user.** If you use neither of the above, set default privileges **for the account dbt runs as** (not the admin), and grant on the existing tables once: ```sql theme={null} -- existing tables GRANT SELECT ON ALL TABLES IN SCHEMA public TO bondata_user; -- future tables created by dbt (replace dbt_user with the account dbt connects as) ALTER DEFAULT PRIVILEGES FOR USER dbt_user IN SCHEMA public GRANT SELECT ON TABLES TO bondata_user; ``` ### Step 6: Enter Credentials Enter the Access Key ID, Secret Access Key, and cluster details in BonData. ## Required Fields | Field | Description | | ------------------ | --------------------------------------------------------- | | AWS Region | The AWS region of your Redshift cluster (e.g., us-east-1) | | Cluster Identifier | For provisioned Redshift clusters | | Workgroup | For Redshift Serverless only | | Db User | The database user to connect as | | Access Key ID | AWS IAM access key | | Secret Access Key | AWS IAM secret key | # Snowflake Source: https://docs.bondata.ai/integrations/databases/snowflake Connect BonData to Snowflake to sync your data warehouse tables Snowflake is a cloud-native data warehouse platform that enables scalable storage, processing, and analytics across AWS, Azure, and GCP. With BonData, you can connect to your Snowflake warehouse to read, enrich, and act on your data directly within Agent workflows. BonData supports two authentication methods for Snowflake. We strongly recommend using **Key Pair Authentication** for a stable, long-lived connection. OAuth connections expire after a maximum of 90 days, after which you will need to reconnect. Key pair authentication does not have this limitation. Expires after up to 90 days Recommended for stable, long-lived connections *** ## OAuth Authentication Follow these steps to configure OAuth authentication for BonData. ### Step 1: Create a Security Integration Run this SQL in Snowflake as an ACCOUNTADMIN: ```sql theme={null} CREATE OR REPLACE SECURITY INTEGRATION bondata_oauth TYPE = OAUTH ENABLED = TRUE OAUTH_CLIENT = CUSTOM OAUTH_CLIENT_TYPE = 'CONFIDENTIAL' OAUTH_REDIRECT_URI = 'https://app.bondata.ai/auth/oauth2/callback' OAUTH_ISSUE_REFRESH_TOKENS = TRUE OAUTH_REFRESH_TOKEN_VALIDITY = 7776000; ``` ### Step 2: Get OAuth Credentials Run these commands to retrieve your credentials: ```sql theme={null} -- Get the Client ID SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('BONDATA_OAUTH'); ``` This returns: * **OAUTH\_CLIENT\_ID** - your Client ID * **OAUTH\_CLIENT\_SECRET** - your Client Secret ### Step 3: Get Your Account URL Your Snowflake URL is in the format: * `https://.snowflakecomputing.com` Find your account identifier in Snowflake under **Admin** → **Accounts**. ### Step 4: Enter Credentials Enter your Client ID, Client Secret, and Snowflake URL in BonData, then click Connect to authorize via OAuth. ### Required Fields (OAuth) | Field | Description | | ------------- | --------------------------------------------- | | Client ID | OAuth Client ID from security integration | | Client Secret | OAuth Client Secret from security integration | | URL | Your Snowflake account URL | *** ## Key Pair Authentication Follow these steps to set up key pair authentication for Snowflake. ### Step 1: Generate a Key Pair Run these commands in your terminal: ```bash theme={null} # Generate private key (encrypted) openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 # Generate public key openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub ``` You'll be prompted to create a passphrase for the private key. ### Step 2: Create a Snowflake User Run this SQL in Snowflake: ```sql theme={null} -- Create a user for BonData CREATE USER bondata_user PASSWORD = 'temporary_password' DEFAULT_ROLE = PUBLIC MUST_CHANGE_PASSWORD = FALSE; -- Assign the public key to the user ALTER USER bondata_user SET RSA_PUBLIC_KEY=''; ``` ### Step 3: Grant Permissions ```sql theme={null} -- Grant access to the warehouse GRANT USAGE ON WAREHOUSE TO USER bondata_user; -- Grant access to the database and schema GRANT USAGE ON DATABASE TO USER bondata_user; GRANT USAGE ON SCHEMA . TO USER bondata_user; -- Grant SELECT on tables GRANT SELECT ON ALL TABLES IN SCHEMA . TO USER bondata_user; GRANT SELECT ON FUTURE TABLES IN SCHEMA . TO USER bondata_user; ``` ### Step 4: Get Your Account Identifier Your account identifier is in your Snowflake URL: * URL: `https://abc12345.us-east-1.snowflakecomputing.com` * Account: `abc12345.us-east-1` ### Step 5: Enter Credentials Enter the URL, User, Account, and upload your private key file in BonData. ### Required Fields (Key Pair) | Field | Description | | ----------- | -------------------------------------- | | URL | Your Snowflake account URL | | User | The Snowflake user with the public key | | Account | Your Snowflake account identifier | | Private Key | The private key file (rsa\_key.p8) | | Passphrase | The passphrase for your private key | # SQLite Source: https://docs.bondata.ai/integrations/databases/sqlite Connect BonData to SQLite by uploading your database file SQLite is a lightweight, self-contained relational database engine where an entire database lives in a single file. With BonData, you can upload a SQLite database file to read, enrich, and act on its data within Agent workflows. ## Database Connection Because SQLite is file-based, there is no server to connect to. Instead of connection credentials, you provide the database file itself, which BonData reads and stores securely. ### Step 1: Prepare Your Database File 1. Locate your SQLite database file - typically with a `.sqlite`, `.db`, or `.sqlite3` extension 2. Make sure the file contains the tables you want to work with 3. Confirm the file is not currently locked by another process (close any application writing to it) BonData reads SQLite databases in read-only mode. Uploading a file never modifies your original database. ### Step 2: Upload the File 1. In BonData, navigate to **Integrations** and select **SQLite** 2. Click **Upload** and select your database file 3. Wait for the upload to complete - BonData stores the file securely and inspects its schema ### Step 3: Review Discovered Tables Once uploaded, BonData reads the database schema and lists the available tables and their row counts. You can then select the tables you want to sync. BonData discovers tables directly from the database's internal catalog, so no manual schema definition is required. Internal `sqlite_*` system tables are excluded automatically. ## Required Fields | Field | Description | | ------------- | -------------------------------------------------------------------- | | Database File | The SQLite database file to upload (`.sqlite`, `.db`, or `.sqlite3`) | ## Available Data Once uploaded, BonData can sync: * **Tables** - All tables in the uploaded database * **Views** - Views defined within the database * **Custom Queries** - Run custom SQL queries to extract specific data # SQL Server Source: https://docs.bondata.ai/integrations/databases/sqlserver Connect BonData to Microsoft SQL Server to sync your database tables Microsoft SQL Server is a relational database management system widely used in enterprise environments, offering strong integration with the Microsoft ecosystem. With BonData, you can connect directly to your SQL Server database to read, enrich, and act on your data within Agent workflows. ## Database Connection BonData connects directly to your SQL Server database using standard connection credentials. ### Step 1: Prepare Your Database Ensure your SQL Server is accessible from BonData's IP addresses. You may need to: 1. Configure your firewall to allow connections on port 1433 (or your custom port) 2. Enable TCP/IP connections in SQL Server Configuration Manager 3. Ensure SQL Server authentication is enabled (mixed mode) ### Step 2: Create a Read-Only User (Recommended) For security, create a dedicated read-only user for BonData: ```sql theme={null} -- Create a login CREATE LOGIN bondata_user WITH PASSWORD = 'your_secure_password'; -- Create a user in your database USE your_database; CREATE USER bondata_user FOR LOGIN bondata_user; -- Grant read access ALTER ROLE db_datareader ADD MEMBER bondata_user; ``` ### Step 3: Gather Connection Details Collect the following information: * **Host**: Your database server hostname or IP address * **Port**: Usually 1433 * **Database**: The name of the database to connect to * **User**: The username created above * **Password**: The password for the user ### Step 4: Connect in BonData Enter your connection details in BonData to establish the connection. ## Required Fields | Field | Description | | -------- | -------------------------------------- | | Host | Database server hostname or IP address | | Port | Database server port (default: 1433) | | Database | Name of the database to connect to | | User | Database username | | Password | Database password | BonData supports encrypted connections using TLS. This is recommended for production environments. ## Available Data Once connected, BonData can sync: * **Tables** - All tables the user has SELECT access to * **Views** - Database views accessible to the user * **Custom Queries** - Run custom SQL queries to extract specific data # GitHub Source: https://docs.bondata.ai/integrations/developer-tools/github Connect BonData to GitHub for repository data GitHub is the world's largest code hosting and collaboration platform, used by developers to manage repositories, track issues, and automate workflows. With BonData, you can connect to your GitHub repositories to read and analyze code, issue, and contributor data within Agent workflows. ## GitHub Personal Access Token Setup Follow these steps to create a Personal Access Token for BonData. ### Step 1: Create a Personal Access Token 1. Go to [GitHub Settings → Developer Settings → Personal Access Tokens](https://github.com/settings/tokens) 2. Click **Generate new token** → **Generate new token (classic)** 3. Enter a note (e.g., `BonData Integration`) 4. Select an expiration (or no expiration) 5. Select scopes: * `repo` - Full control of private repositories * `read:user` - Read user profile data 6. Click **Generate token** 7. **Copy the token** - it starts with `ghp_` and won't be shown again ### Step 2: Identify Your Repository Find the owner and repository name from your GitHub URL: * URL: `https://github.com/mycompany/myrepo` * Owner: `mycompany` * Repository: `myrepo` ### Step 3: Enter Credentials Enter your Personal Access Token, owner, and repository name in BonData. ## Required Fields | Field | Description | | --------------------- | ---------------------------------------------------------------------------- | | Personal Access Token | Generated from GitHub Settings → Developer settings → Personal access tokens | | Owner | The username or organization that owns the repository | | Repository | The name of the repository to connect to | # Notion Source: https://docs.bondata.ai/integrations/developer-tools/notion Connect BonData to Notion for workspace data Notion is an all-in-one workspace for notes, documents, wikis, project management, and databases. With BonData, you can connect to your Notion workspace to read and analyze page, database, and content data within Agent workflows. ## Notion Internal Integration Setup Follow these steps to create an Internal Integration for BonData. ### Step 1: Create an Integration 1. Go to [Notion Integrations](https://www.notion.so/my-integrations) 2. Click **New integration** 3. Enter a name (e.g., `BonData`) 4. Select the workspace you want to connect 5. Click **Submit** ### Step 2: Configure Capabilities Under **Capabilities**, ensure these are enabled: * **Read content** - to access page and database content * **Read user information** - to see user details (optional) ### Step 3: Copy the API Key 1. Go to the **Secrets** section 2. Click **Show** next to the Internal Integration Secret 3. Click **Copy** - the key starts with `secret_` ### Step 4: Share Pages with the Integration **Important**: The integration can only access pages explicitly shared with it. 1. Open the Notion page or database you want to connect 2. Click **Share** in the top-right corner 3. Click **Invite** 4. Search for your integration name and select it 5. Repeat for all pages/databases you want to sync ### Step 5: Enter Credentials Enter your Internal Integration Secret in BonData. ## Required Fields | Field | Description | | ------- | --------------------------------------------------------- | | API Key | Internal Integration Secret from Notion Integrations page | # Anaplan Source: https://docs.bondata.ai/integrations/enterprise/anaplan Connect BonData to Anaplan for models, modules, lists, and view data Anaplan is a connected-planning platform for building large-scale financial, sales, and supply-chain models on a shared calculation engine. With BonData, you can connect to your Anaplan workspace to read model structure and export view and list data within Agent workflows. ## Anaplan Basic Authentication Setup Anaplan uses a two-step flow: you authenticate with Basic auth (or a certificate) to obtain a short-lived auth token, which is then used to call the Bulk and Integration APIs. Follow these steps to connect BonData. ### Step 1: Prepare an Anaplan Service Account 1. Sign in to [Anaplan](https://us1a.app.anaplan.com/) with an administrator account 2. Create or identify a user that will be used for the integration and grant it access to the target workspace and model 3. Confirm the account's **email** and **password** - these are used for Basic authentication against the Anaplan Authentication Service (`https://auth.anaplan.com/token/authenticate`) Anaplan also supports certificate-based authentication (CA certificate + private key) for accounts with Single Sign-On enabled. If your tenant enforces SSO, use a certificate or a dedicated non-SSO service account, since password auth is disabled for SSO users. ### Step 2: Find Your Workspace and Model IDs 1. Open your model in Anaplan 2. The **Workspace ID** and **Model ID** appear in the browser URL after `/anaplan/framework.html?...` or can be retrieved from the API at `https://api.anaplan.com/2/0/workspaces` and `/workspaces/{workspaceId}/models` 3. Copy both identifiers ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Anaplan** 2. Enter your **Email**, **Password**, **Workspace ID**, and **Model ID** 3. Click **Connect** - BonData exchanges your credentials for an auth token and validates access to the model ## Required Fields | Field | Description | | ------------ | -------------------------------------------------------------------- | | Email | Email address of the Anaplan service account used for authentication | | Password | Password for the Anaplan service account | | Workspace ID | Identifier of the Anaplan workspace containing your model | | Model ID | Identifier of the Anaplan model to sync | ## Available Data Once connected, BonData can sync the following Anaplan data via the Bulk and Integration APIs (`https://api.anaplan.com/2/0/`): * **Workspaces** - Workspaces available to the authenticated account * **Models** - Models within a workspace, including size and last-modified metadata * **Modules** - Model modules and their dimensional structure * **Lists** - List members, properties, and hierarchy * **Line Items** - Line item definitions, formats, and formulas within modules * **Views** - Saved module and dashboard views used as data sources * **Exports** - Export actions used to extract tabular data from views and modules # Arena PLM Source: https://docs.bondata.ai/integrations/enterprise/arena Connect BonData to PTC Arena for items, BOMs, changes, and quality records PTC Arena is a cloud product lifecycle management (PLM) and quality management system (QMS) that centralizes bills of materials, engineering changes, and quality processes for hardware teams. With BonData, you can connect to your Arena workspace to read item, BOM, and change data within Agent workflows. ## Arena PLM Session Authentication Setup Arena's REST API authenticates by logging in with your email and password against a specific workspace to obtain a session, which is then used for subsequent requests. Follow these steps to connect BonData. ### Step 1: Get Your Workspace URL and ID 1. Sign in to [Arena](https://app.bom.com/) 2. Your API **base URL** is `https://api.arenasolutions.com/v1` 3. Note your **Workspace ID** - it is shown in **Settings** → **Workspace** and is required when you have access to more than one workspace ### Step 2: Prepare Integration Credentials 1. Identify a user account with access to the target workspace and the item, change, and quality data you want to sync 2. Confirm the account's **email** and **password** - these are posted to the `/login` endpoint to create a session Use a dedicated Arena service account for the integration so that access and audit history are separated from individual users. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Arena PLM** 2. Enter your **Email**, **Password**, and **Workspace ID** 3. Click **Connect** - BonData logs in to Arena and validates the session ## Required Fields | Field | Description | | ------------ | ------------------------------------------------------------------------ | | Email | Email address of the Arena account used to log in | | Password | Password for the Arena account | | Workspace ID | Identifier of the Arena workspace to connect (from Settings → Workspace) | ## Available Data Once connected, BonData can sync the following Arena data via the Arena REST API (`https://api.arenasolutions.com/v1`): * **Items / Parts** - Item master records with attributes, categories, and lifecycle phase * **BOMs** - Multi-level bills of materials and item relationships * **Changes** - Engineering change orders and requests (ECOs/ECRs) with affected items and status * **Quality Records** - Quality processes including corrective actions, complaints, and NCRs * **Suppliers** - Supplier records and supplier items linked to parts * **Files** - Files and documents attached to items and changes # AWS IoT Core Source: https://docs.bondata.ai/integrations/enterprise/aws-iot-core Connect BonData to AWS IoT Core for device, registry, and telemetry data AWS IoT Core is a managed cloud service that connects industrial devices and sensors to AWS, managing their registry, security, and message telemetry at scale. With BonData, you can connect to your AWS IoT Core environment to read, enrich, and sync your device and telemetry data within Agent workflows. ## AWS IoT Core IAM Setup BonData connects to AWS IoT Core using an IAM access key, calling the IoT Device Management and Registry APIs in your chosen region. ### Step 1: Create an IAM User or Access Key 1. Sign in to the [AWS Management Console](https://console.aws.amazon.com/) 2. Open the **IAM** console and go to **Users** 3. Create a dedicated user (for example `bondata-iot`) or select an existing service user 4. Under **Security credentials**, create an **Access key** for programmatic access ### Step 2: Attach a Least-Privilege Policy 1. Attach a policy that grants only the read actions BonData needs, for example `iot:ListThings`, `iot:DescribeThing`, `iot:ListThingGroups`, `iot:GetThingShadow`, and `iot:ListCertificates` 2. Avoid attaching broad managed policies such as `AWSIoTFullAccess` Follow the principle of least privilege. Scope the IAM policy to the specific IoT read actions and resources BonData requires rather than granting account-wide access. ### Step 3: Note Your Region 1. Identify the AWS region hosting your IoT Core endpoint (for example `us-east-1`) 2. BonData directs API calls to this region ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **AWS IoT Core** 2. Enter your **Access Key ID**, **Secret Access Key**, and **Region** 3. Click **Connect** ## Required Fields | Field | Description | | ----------------- | ------------------------------------------------------------------- | | Access Key ID | IAM access key ID for the integration user | | Secret Access Key | IAM secret access key paired with the access key ID | | Region | AWS region hosting your IoT Core endpoint (for example `us-east-1`) | ## Available Data Once connected, BonData can sync the following AWS IoT Core data: * **Things (Devices)** - Registered devices with attributes and metadata * **Thing Types** - Device type definitions and their searchable attributes * **Thing Groups** - Static and dynamic groups used to organize devices * **Device Shadows** - Reported and desired device state documents * **Topics / Telemetry** - Message topics and device telemetry data * **Certificates** - Device certificates and their status # ETQ Reliance Source: https://docs.bondata.ai/integrations/enterprise/etq Connect BonData to ETQ Reliance for quality, compliance, and supplier data ETQ Reliance is a quality management system (QMS) that manages documents, nonconformances, corrective actions, audits, and supplier quality across regulated manufacturing environments. With BonData, you can connect to your ETQ Reliance instance to read, enrich, and sync your quality and compliance data within Agent workflows. ## ETQ Reliance API Key Setup BonData connects to ETQ Reliance through its REST API. Authentication uses an API key (or Basic auth) issued for a dedicated integration user. ### Step 1: Confirm Your Reliance Base URL 1. Log in to ETQ Reliance as an administrator 2. Your base URL is the host of your Reliance instance, for example `https://yourcompany.etq.com/reliance` or `https:///reliance/rest` 3. Note this URL - BonData appends the REST resource paths to it ### Step 2: Enable the REST API and Create an Integration User 1. Open the **Administration** module 2. Under **Security**, create a dedicated user (for example `bondata-integration`) or reuse a service account 3. Assign a role that grants read access to the applications and forms you plan to sync 4. Confirm the **REST API** service is enabled for your instance ### Step 3: Generate an API Key 1. In **Administration**, open the **API Keys** (or **Integration Keys**) section 2. Generate a new API key associated with the integration user 3. **Copy the generated key** - it authenticates BonData's requests If your ETQ Reliance instance uses Basic authentication instead of API keys, enter the integration user's username and password as the credentials in BonData. ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **ETQ Reliance** 2. Enter your **Base URL** and **API Key** 3. Click **Connect** ## Required Fields | Field | Description | | -------- | ------------------------------------------------------------------------------------ | | Base URL | Your ETQ Reliance instance host (for example `https://yourcompany.etq.com/reliance`) | | API Key | API key generated for the integration user in Administration | ## Available Data Once connected, BonData can sync the following ETQ Reliance records: * **Documents** - Controlled documents with revision, status, and approval history * **Nonconformances (NCRs)** - Nonconformance reports and their dispositions * **CAPAs** - Corrective and preventive action records and workflow status * **Audits** - Internal and supplier audit records with findings * **Suppliers** - Supplier master records and qualification status * **Change Requests** - Change control records and approvals * **Training Records** - Employee training assignments and completion status # Flexport Source: https://docs.bondata.ai/integrations/enterprise/flexport Connect BonData to Flexport for freight, shipment, and logistics data Flexport is a freight forwarding and logistics platform that gives shippers end-to-end visibility into ocean, air, and ground shipments, bookings, and customs across their supply chain. With BonData, you can connect to your Flexport account to read, enrich, and sync your logistics data within Agent workflows. ## Flexport API Token Setup BonData connects to Flexport using an API token, sent as a Bearer token on every request. ### Step 1: Open API Settings 1. Log in to [Flexport](https://www.flexport.com/) 2. Click your account menu and go to **Settings** 3. Select **API Tokens** ### Step 2: Generate an API Token 1. Click **Create Token** (or **New Token**) 2. Enter a name (for example `BonData`) and select the appropriate access scope 3. Click **Create** ### Step 3: Copy the Token 1. Flexport displays the **API Token** once on creation 2. **Copy it immediately** - it will not be shown again Flexport uses the same token for its sandbox and production environments only when explicitly enabled. Confirm you are generating the token in the environment BonData should connect to. ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Flexport** 2. Enter your **API Token** 3. Click **Connect** ## Required Fields | Field | Description | | --------- | -------------------------------------------------------- | | API Token | Bearer token generated in Flexport Settings → API Tokens | ## Available Data Once connected, BonData can sync the following Flexport records: * **Shipments** - Shipments with mode, milestones, and status * **Bookings** - Booking requests and their confirmation status * **Products** - Product catalog records and specifications * **Purchase Orders** - Purchase orders and their fulfillment status * **Invoices** - Freight and services invoices with line items * **Containers** - Containers and their contents and tracking * **Documents** - Shipment documents such as bills of lading and customs paperwork * **Tracking Events** - Milestone and location tracking events for shipments # Manhattan Associates Source: https://docs.bondata.ai/integrations/enterprise/manhattan Connect BonData to Manhattan Active for orders, shipments, inventory, and items Manhattan Associates provides Manhattan Active supply chain applications for warehouse management (WMS) and order management (OMS), running on a cloud-native microservices platform. With BonData, you can connect to your Manhattan Active environment to read order, inventory, and fulfillment data within Agent workflows. ## Manhattan Associates OAuth 2.0 Setup Manhattan Active APIs authenticate with the OAuth 2.0 client credentials grant. Follow these steps to connect BonData. ### Step 1: Request API Credentials 1. Contact your **Manhattan Active administrator** or Manhattan support to provision an integration client for your organization 2. Manhattan issues a **Client ID** and **Client Secret** scoped to the applications (WMS, OMS) you need 3. Note the **base URL** of your environment, for example `https://your-org.sce.manh.com` Manhattan Active is multi-tenant and organization-specific. The base URL, token endpoint, and available application APIs depend on the environment provisioned for your organization. ### Step 2: Confirm the Token Endpoint and Scope 1. The client credentials are exchanged for a bearer token at your environment's OAuth token endpoint (typically `/oauth/token`) 2. Confirm with your administrator which application scopes are granted to the client ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Manhattan Associates** 2. Enter your **Base URL**, **Client ID**, and **Client Secret** 3. Click **Connect** - BonData requests a token and validates access ## Required Fields | Field | Description | | ------------- | ---------------------------------------------------- | | Base URL | Base URL of your Manhattan Active environment | | Client ID | OAuth 2.0 client identifier provisioned by Manhattan | | Client Secret | OAuth 2.0 client secret paired with the Client ID | ## Available Data Once connected, BonData can sync the following Manhattan Active data: * **Orders** - Sales and fulfillment orders with lines, status, and customer details * **Shipments** - Outbound shipments with carrier, tracking, and status * **Inventory** - On-hand and available inventory balances by location * **Items / SKUs** - Item master records with attributes and unit-of-measure data * **Facilities / Locations** - Distribution centers, stores, and internal storage locations * **Purchase Orders** - Inbound purchase orders and their lines * **ASNs** - Advance shipment notices for expected inbound receipts # IBM Maximo Source: https://docs.bondata.ai/integrations/enterprise/maximo Connect BonData to IBM Maximo for asset, work order, and maintenance data IBM Maximo is an enterprise asset management (EAM) platform that tracks the full lifecycle of physical assets, from procurement and maintenance through to retirement across manufacturing, utilities, and facilities operations. With BonData, you can connect to your Maximo environment to read, enrich, and sync your asset and maintenance data within Agent workflows. ## IBM Maximo API Key Setup BonData connects to Maximo through its REST/OSLC API using `maxauth` (API key) authentication. OAuth is also supported for environments that require it. ### Step 1: Confirm Your Maximo Base URL 1. Log in to Maximo as an administrator 2. Your base URL is the host that serves the Maximo application, for example `https://maximo.yourcompany.com/maximo` or `https:///maximo/oslc` for Maximo Application Suite 3. Note this URL - BonData appends the REST/OSLC object paths (for example `/os/mxapiasset`) to it ### Step 2: Enable API Access and Create an API Key 1. Go to the **Administration** work center, or open the **Users** application 2. Ensure the integration user has a security group that grants access to the object structures (OS) you plan to use 3. In Maximo Application Suite, open the **API Keys** management page (or use the `apikey` endpoint) and generate a new API key for the integration user 4. **Copy the generated API key** - it is used as the `apikey` header on every request For classic Maximo (7.6.x) without API key management, BonData can authenticate using the `maxauth` header, which is a Base64-encoded `username:password` credential. Use a dedicated service account for this. ### Step 3: Grant Object Structure Access 1. Open the **Object Structures** application 2. Confirm the object structures you need are exposed as REST resources (for example `MXAPIASSET`, `MXAPIWODETAIL`, `MXAPIITEM`) 3. Make sure the integration user's security group has read access to each ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **IBM Maximo** 2. Enter your **Base URL** and **API Key** 3. Click **Connect** ## Required Fields | Field | Description | | -------- | ------------------------------------------------------------------------------------------------------ | | Base URL | Your Maximo host, including the application path (for example `https://maximo.yourcompany.com/maximo`) | | API Key | The `maxauth` API key generated for the integration user | ## Available Data Once connected, BonData can sync the following Maximo records: * **Assets** - Asset master records with hierarchy, status, and location * **Work Orders** - Corrective and planned work orders with labor, materials, and status * **Locations** - Location hierarchy and operating context for assets * **Items / Inventory** - Item master records and storeroom inventory balances * **Purchase Orders** - Purchase orders and receipts for materials and services * **Service Requests** - Incoming service requests and tickets * **Preventive Maintenance** - PM schedules, frequencies, and generated work # NielsenIQ Source: https://docs.bondata.ai/integrations/enterprise/nielseniq Connect BonData to NielsenIQ for retail measurement and consumer POS market data NielsenIQ (NIQ) provides retail measurement and consumer point-of-sale data covering sales, distribution, and market share across categories, markets, and time periods. With BonData, you can connect to your NielsenIQ data services to pull measurement facts and reference dimensions within Agent workflows. ## NielsenIQ API Key Setup NielsenIQ data services authenticate with client credentials issued by NIQ. Follow these steps to connect BonData. ### Step 1: Request API Access from NielsenIQ 1. Contact your **NielsenIQ account representative** or NIQ Connect administrator to request API access for your subscription 2. NIQ provisions a **Client ID** and **Client Secret** (or an **API Key**) scoped to the datasets included in your contract 3. Note the **base URL** of the NIQ data service or Connect API assigned to your account NielsenIQ data is licensed per subscription. The categories, markets, and periods available through the API are limited to what your organization has purchased. ### Step 2: Confirm Your Dataset Scope 1. In NIQ Connect, review the categories and markets included in your entitlement 2. Confirm which **facts/measures** (for example sales value, sales volume, and distribution) your subscription exposes ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **NielsenIQ** 2. Enter your **Client ID** and **Client Secret** (or **API Key**) 3. Click **Connect** - BonData validates the credentials and retrieves your available datasets ## Required Fields | Field | Description | | ------------- | ---------------------------------------------------------------------------------------- | | Client ID | Client identifier provisioned by NielsenIQ for your subscription | | Client Secret | Client secret paired with the Client ID | | API Key | API key issued by NielsenIQ (used in place of client credentials for some data services) | ## Available Data Once connected, BonData can sync the following NielsenIQ data: * **Products / Items** - Product and item reference data including UPC/EAN, brand, and manufacturer * **Markets** - Retail markets, channels, and geographies used to slice measurement data * **Periods** - Time periods (weekly, monthly, quarterly) available in your subscription * **Categories** - Category and subcategory hierarchy used to organize items and facts * **Facts / Measures** - Measurement values such as sales value, sales volume, and distribution (ACV/PCV) # Plex Source: https://docs.bondata.ai/integrations/enterprise/plex Connect BonData to Rockwell Plex for manufacturing, inventory, and production data Plex is Rockwell Automation's cloud-based smart manufacturing platform, combining ERP and MES to manage parts, inventory, production, and quality across discrete and process manufacturers. With BonData, you can connect to your Plex account to read, enrich, and sync your manufacturing data within Agent workflows. ## Plex API Key Setup BonData connects to Plex through its REST and Data Source APIs, authenticating with an API key scoped to your customer account. ### Step 1: Find Your Customer ID 1. Log in to Plex 2. Your **Customer ID** (PCN) identifies your Plex account and facility 3. Note this value - it is sent with every API request to route it to the correct account ### Step 2: Create an API Key 1. In the Plex UI, open the **Web Services / Developer Portal** (or work with your Plex administrator) 2. Register an application for BonData and request access to the REST and Data Source APIs 3. Generate an **API Key** for the integration ### Step 3: Assign Data Source Access 1. Ensure the API key's account has access to the data sources you plan to use (for example inventory, production, and part data sources) 2. Confirm the account has read permissions for each area Plex separates its modern REST APIs from the legacy Data Source (SOAP/JSON) APIs. BonData can use either; API key and Customer ID authentication applies to both. ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Plex** 2. Enter your **API Key** and **Customer ID** 3. Click **Connect** ## Required Fields | Field | Description | | ----------- | --------------------------------------------------------------------- | | API Key | API key generated for the BonData integration | | Customer ID | Your Plex Customer ID (PCN) that identifies your account and facility | ## Available Data Once connected, BonData can sync the following Plex records: * **Parts** - Part master records with specifications and status * **Inventory** - Inventory balances by part, location, and lot * **Production Orders** - Production orders and their status * **Work Centers** - Work center definitions and capacity * **Containers** - Container and serial records tracked on the floor * **Customers** - Customer master records and terms * **Suppliers** - Supplier master records * **Shipments** - Outbound shipments and their line items # Tulip Source: https://docs.bondata.ai/integrations/enterprise/tulip Connect BonData to Tulip for frontline operations and manufacturing app data Tulip is a frontline operations platform that lets manufacturers build no-code apps to guide operators, capture production data, and connect machines on the shop floor. With BonData, you can connect to your Tulip workspace to read, enrich, and sync your operations and production data within Agent workflows. ## Tulip API Key Setup BonData connects to Tulip using a Bot API token, which is an API key and secret pair generated from your workspace settings. ### Step 1: Confirm Your Workspace URL 1. Log in to Tulip 2. Your workspace base URL is the host of your Tulip instance, for example `https://yourcompany.tulip.co` 3. Note this URL - BonData uses it as the base for the Tulip API ### Step 2: Create an API Token (Bot) 1. Go to **Settings** → **API Tokens** 2. Click **Create API Token** 3. Enter a name (for example `BonData`) and select the **scopes** that grant read access to Tables, Apps, and Machines 4. Click **Create** ### Step 3: Copy the API Key and Secret 1. Tulip displays the **API Key** and **Secret** once, on creation 2. **Copy both values immediately** - the secret cannot be retrieved again Tulip API tokens are scoped per workspace. If you use multiple workspaces, create a token in each workspace you want BonData to access. ### Step 4: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Tulip** 2. Enter your **Workspace URL**, **API Key**, and **API Secret** 3. Click **Connect** ## Required Fields | Field | Description | | ------------- | ---------------------------------------------------------------------- | | Workspace URL | Your Tulip workspace host (for example `https://yourcompany.tulip.co`) | | API Key | API Key from Settings → API Tokens | | API Secret | Secret shown once when the API token is created | ## Available Data Once connected, BonData can sync the following Tulip data: * **Tables and Records** - Tulip Tables and their records for production and reference data * **Apps** - App definitions and metadata * **App Completions** - Completed app runs with captured field values * **Machines** - Connected machine definitions and attribute data * **Stations** - Shop-floor stations and their assignments * **Users** - Operator and workspace user records # HiBob Source: https://docs.bondata.ai/integrations/hr-people/hibob Connect BonData to HiBob for HR management data HiBob is a modern HR management platform designed for mid-sized and enterprise companies, covering onboarding, time off, performance, and people analytics. With BonData, you can connect to your HiBob account to read and analyze employee and company data within Agent workflows. ## HiBob Service User Setup Follow these steps to create a service user for BonData. ### Step 1: Access Service Users 1. Log in to [HiBob](https://app.hibob.com/) as an admin 2. Go to **Settings** → **Integrations** → **Service Users** ### Step 2: Create a Service User 1. Click **Add Service User** 2. Enter a name (e.g., `BonData Integration`) 3. Select the required permissions: * **Read employees** - to access employee data * **Read company** - to access company information 4. Click **Create** ### Step 3: Copy Credentials After creation, you'll see: * **Service User ID** - this is your username * **Token** - this is your password Copy both values - the token won't be shown again. ### Step 4: Enter Credentials Enter the Service User ID as username and Token as password in BonData. [Learn more about HiBob Service Users](https://apidocs.hibob.com/docs/api-service-users) ## Required Fields | Field | Description | | -------- | -------------------------- | | Username | Service User ID from HiBob | | Password | Token from HiBob | # Brevo Source: https://docs.bondata.ai/integrations/marketing-sales/brevo Connect BonData to Brevo for email marketing data Brevo (formerly Sendinblue) is an all-in-one marketing platform for email campaigns, automation, SMS, and CRM. With BonData, you can connect to your Brevo account to read and analyze contact, campaign, and engagement data within Agent workflows. ## Brevo API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access SMTP & API Settings 1. Log in to [Brevo](https://app.brevo.com/) 2. Click your profile icon in the top-right 3. Go to **SMTP & API** ### Step 2: Create an API Key 1. Click the **API Keys** tab 2. Click **Generate a new API key** 3. Enter a name (e.g., `BonData Integration`) 4. Click **Generate** 5. **Copy the API key** - it won't be shown again ### Step 3: Enter Credentials Enter your Brevo API key in BonData. ## Required Fields | Field | Description | | ------- | -------------------------------------- | | API Key | API key from Brevo SMTP & API settings | # G2 Source: https://docs.bondata.ai/integrations/marketing-sales/g2 Connect BonData to G2 for buyer intent signals, reviews, and account data G2 is the world's largest software marketplace, where millions of buyers research products through reviews, comparisons, and buyer intent signals. With BonData, you can connect to your G2 account to read, enrich, and sync your marketing and sales intelligence data - including buyer intent and reviews - within Agent workflows. ## G2 API Token Setup G2 exposes its data through an API Token generated in My.G2. API access requires an eligible G2 subscription (such as Buyer Intent or a Marketing Solutions plan). ### Step 1: Open Integration Settings 1. Log in to [My.G2](https://my.g2.com/) 2. Click **Integrations** in the left navigation 3. Select the **API** section The API and Buyer Intent data feeds are available only on eligible G2 plans. If you don't see the API section, contact your G2 account manager to confirm your subscription includes API access. ### Step 2: Generate an API Token 1. Click **Generate Token** (or **Create Token**) 2. Give the token a descriptive name, e.g. `BonData` 3. Copy the generated **API Token** - it is shown only once Store the token somewhere safe immediately. If you lose it, you'll need to revoke and regenerate a new token from the same screen. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **G2** 2. Enter your **API Token** 3. Click **Connect** ## Required Fields | Field | Description | | --------- | ----------------------------------------------- | | API Token | Token generated from My.G2 → Integrations → API | ## Available Data Once connected, BonData can sync the following G2 data: * **Buyer Intent** - Signals showing which companies are researching your product and category * **Company / Account Data** - Firmographics for accounts appearing in your intent feed * **Reviews** - Reviews left on your products, including ratings and structured responses * **Review Responses** - Vendor responses to reviews * **Competitor Comparisons** - Head-to-head comparison views between your product and competitors # Gong Source: https://docs.bondata.ai/integrations/marketing-sales/gong Connect BonData to Gong for revenue intelligence data Gong is a revenue intelligence platform that captures and analyzes customer interactions across calls, emails, and meetings to deliver insights that help teams close more deals. With BonData, you can connect to your Gong account to read and analyze call, deal, and user data within Agent workflows. ## Gong API Access Setup Follow these steps to create API credentials for BonData. ### Step 1: Access API Settings 1. Log in to [Gong](https://app.gong.io) as an admin 2. Click **Company Settings** (gear icon in top-right) 3. Go to **Ecosystem** → **API** ### Step 2: Create API Credentials 1. Click **Create API Access Key** 2. Enter a name (e.g., `BonData Integration`) 3. Select the required scopes: * **api:calls:read:basic** - to read call metadata * **api:calls:read:media-url** - to access recordings (optional) * **api:users:read** - to read user information 4. Click **Create** ### Step 3: Copy Credentials After creation, you'll see: * **Access Key** - a unique identifier for API access * **Secret Key** - the secret used for authentication Copy both values immediately - the Secret Key won't be shown again. ### Step 4: Enter Credentials Enter your Access Key and Secret Key in BonData. ## Required Fields | Field | Description | | ---------- | --------------------------------- | | Access Key | Access Key from Gong API settings | | Secret Key | Secret Key from Gong API settings | # HubSpot Source: https://docs.bondata.ai/integrations/marketing-sales/hubspot Connect BonData to HubSpot to sync your CRM data including contacts, companies, and deals HubSpot is an all-in-one CRM platform for marketing, sales, customer service, and content management. With BonData, you can connect to your HubSpot account to read, enrich, and sync your CRM data - including contacts, companies, deals, and more - within Agent workflows. ## OAuth Authentication BonData connects to HubSpot using OAuth 2.0, which provides secure access to your HubSpot data. ### Connect Your Account 1. In BonData, navigate to **Integrations** and select **HubSpot** 2. Click **Connect** 3. You'll be redirected to HubSpot to authorize the connection 4. Sign in to your HubSpot account and approve the access request 5. You'll be redirected back to BonData once connected BonData requests read access to your CRM data. You can review and revoke access at any time from your HubSpot account settings. ## Available Data Once connected, BonData can sync the following HubSpot objects: * **Contacts** - People in your CRM * **Companies** - Organizations in your CRM * **Deals** - Sales opportunities * **Tasks** - Activities and to-dos * **Owners** - Users who own records # LinkedIn Source: https://docs.bondata.ai/integrations/marketing-sales/linkedin Connect BonData to LinkedIn Marketing for Pages, followers, and ad campaign data LinkedIn is the leading professional network, and its Marketing and Pages APIs expose organization analytics, follower data, and advertising performance. With BonData, you can connect to your LinkedIn account to read, enrich, and sync your organic and paid marketing data within Agent workflows. ## LinkedIn OAuth 2.0 Setup LinkedIn uses OAuth 2.0 with an approved Developer app. You'll create an app, request the appropriate member and organization scopes, then authorize BonData. ### Step 1: Create a LinkedIn Developer App 1. Go to the [LinkedIn Developer Portal](https://www.linkedin.com/developers/apps) 2. Click **Create app** 3. Associate the app with the **Company Page** you want to manage 4. Complete verification of the Page association BonData requires an **approved** LinkedIn Developer app. Access to the Marketing Developer Platform (for ad accounts, campaigns, and Lead Gen Forms) must be requested and approved by LinkedIn before those scopes become available. ### Step 2: Request Products and Scopes 1. On your app's **Products** tab, add **Community Management API** (for Pages and analytics) and **Marketing Developer Platform** (for advertising) 2. Ensure the relevant OAuth scopes are enabled, such as `r_organization_social`, `rw_organization_admin`, `r_ads`, and `r_ads_reporting` ### Step 3: Connect Your Account in BonData 1. In BonData, navigate to **Integrations** and select **LinkedIn** 2. Click **Connect** 3. You'll be redirected to LinkedIn to authorize the requested scopes 4. Sign in, select the organization to grant access to, and click **Allow** 5. You'll be redirected back to BonData once connected The signed-in member must be an admin of the Company Page and, for advertising data, have access to the relevant Ad Account. ## Required Fields | Field | Description | | ------------- | ----------------------------------------------------------------------- | | Authorization | OAuth 2.0 connection completed through the LinkedIn consent screen | | Organization | The Company Page / organization to sync (selected during authorization) | ## Available Data Once connected, BonData can sync the following LinkedIn data: * **Organization / Company Pages** - Page profiles and metadata * **Followers** - Follower counts and follower demographics * **Share / Post Analytics** - Impressions, clicks, reactions, and engagement per post * **Ad Accounts** - Advertising accounts you have access to * **Campaigns** - Ad campaigns, campaign groups, and creatives with performance metrics * **Lead Gen Forms** - Lead Gen Form definitions and captured lead responses # Mailchimp Source: https://docs.bondata.ai/integrations/marketing-sales/mailchimp Connect BonData to Mailchimp for audiences, campaigns, and email engagement data Mailchimp is an email marketing and automation platform used to manage audiences, send campaigns, and track engagement. With BonData, you can connect to your Mailchimp account to read, enrich, and sync your marketing data - including audiences, members, and campaign performance - within Agent workflows. ## Mailchimp Authentication Setup BonData supports connecting to Mailchimp with OAuth or with an API Key. OAuth is the simplest option; an API Key is useful for service accounts and headless setups. 1. In BonData, navigate to **Integrations** and select **Mailchimp** 2. Click **Connect** 3. You'll be redirected to Mailchimp to authorize the connection 4. Sign in and click **Allow** to grant access 5. You'll be redirected back to BonData once connected ### Step 1: Generate an API Key 1. Log in to [Mailchimp](https://login.mailchimp.com/) 2. Click your profile name in the bottom-left, then **Account & billing** 3. Go to **Extras** → **API keys** 4. Click **Create A Key** and copy the generated key ### Step 2: Note Your Data Center Your API key ends in a data center suffix, for example `-us21`. This suffix identifies your Mailchimp server region and is required to build the API endpoint. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Mailchimp** 2. Enter your **API Key** and **Data Center** 3. Click **Connect** The data center is the part after the dash in your API key. If your key is `a1b2c3...-us21`, your data center is `us21` and all requests are routed to `https://us21.api.mailchimp.com`. ## Required Fields | Field | Description | | ----------- | ------------------------------------------------------------------ | | API Key | Key generated from Account → Extras → API keys (API Key auth only) | | Data Center | Region suffix from your API key, e.g. `us21` (API Key auth only) | ## Available Data Once connected, BonData can sync the following Mailchimp data: * **Audiences / Lists** - Your subscriber lists with settings and stats * **Members / Contacts** - Individual subscribers with status, merge fields, and engagement * **Campaigns** - Sent, draft, and scheduled email campaigns * **Reports** - Open rates, click rates, bounces, and other campaign metrics * **Automations** - Automated customer journeys and their emails * **Segments** - Saved and static segments within an audience * **Tags** - Contact tags used for organizing and targeting members # Marketo Source: https://docs.bondata.ai/integrations/marketing-sales/marketo Connect BonData to Adobe Marketo Engage for leads, activities, and campaign data Adobe Marketo Engage is a marketing automation platform for lead management, email marketing, and multi-channel campaign orchestration. With BonData, you can connect to your Marketo instance to read, enrich, and sync your marketing data - including leads, activities, and program performance - within Agent workflows. ## Marketo REST API Setup Marketo authenticates through a Custom Service in LaunchPoint. You'll need a **Client ID**, a **Client Secret**, and your instance **Endpoint URL** (the Munchkin-based REST endpoint). ### Step 1: Create a Custom Service in LaunchPoint 1. Log in to [Marketo](https://login.marketo.com/) as an admin 2. Go to **Admin** → **Integration** → **LaunchPoint** 3. Click **New** → **New Service** 4. Set **Service** to **Custom**, give it a display name (e.g. `BonData`) 5. Select an **API Only** user as the associated user, then click **Create** Create the API Only user first under **Admin** → **Users & Roles**, assigning it a role with **Access API** permissions (Read-Only Lead, Read-Only Activity, etc.). Marketo requires the service to be tied to an API user. ### Step 2: Retrieve Your Credentials and Endpoint 1. On the LaunchPoint page, click **View Details** next to your new service 2. Copy the **Client Id** and **Client Secret** 3. Go to **Admin** → **Integration** → **Web Services** 4. Under **REST API**, copy your **Endpoint** URL - it looks like `https://123-ABC-456.mktorest.com/rest` The numeric prefix in your endpoint (e.g. `123-ABC-456`) is your Munchkin ID. Use the full REST endpoint, not the Identity or SOAP URL. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Marketo** 2. Enter your **Client ID**, **Client Secret**, and **Endpoint URL** 3. Click **Connect** BonData exchanges your credentials for a short-lived access token and refreshes it automatically. ## Required Fields | Field | Description | | ------------- | ---------------------------------------------------------------------------------------------------- | | Client ID | Client Id from your LaunchPoint Custom Service | | Client Secret | Client Secret from your LaunchPoint Custom Service | | Endpoint URL | REST endpoint from Admin → Integration → Web Services (e.g. `https://123-ABC-456.mktorest.com/rest`) | ## Available Data Once connected, BonData can sync the following Marketo data: * **Leads** - Person records with standard and custom fields * **Activities** - Lead activity history such as email opens, clicks, form fills, and page visits * **Programs** - Marketing programs and their metadata * **Campaigns** - Batch and trigger smart campaigns * **Lists** - Static lists and their membership * **Opportunities** - Sales opportunities and opportunity roles synced into Marketo * **Companies** - Company records associated with leads # Gmail Source: https://docs.bondata.ai/integrations/notifications/gmail Connect BonData to Gmail to read messages and send email Gmail is Google's email service, available to individuals and as part of Google Workspace. With BonData, you can connect to your Gmail account to read messages and send email as part of Agent workflows - using it both as a data source and as a notification channel. ## Gmail OAuth Setup BonData connects to Gmail using OAuth 2.0, so you authorize access with your Google account without sharing your password. ### Step 1: Start the Connection 1. In BonData, navigate to **Integrations** and select **Gmail** 2. Click **Connect with Google** ### Step 2: Sign In with Google 1. You'll be redirected to Google's secure sign-in page 2. Choose the Google account you want to connect 3. If you belong to multiple Google Workspace accounts, select the correct one ### Step 3: Grant Access 1. Review the permissions BonData requests 2. Click **Allow** to grant access 3. You'll be redirected back to BonData once the connection is authorized BonData requests scopes to **read** your mail (`gmail.readonly`) and to **send** email on your behalf (`gmail.send`). You can review or revoke access at any time from your [Google account permissions](https://myaccount.google.com/permissions). Because Gmail is both a data source and a send channel, you can build workflows that read incoming messages, act on them, and reply or notify a recipient - all within a single Agent. ## Required Fields OAuth authentication is handled entirely through Google. No additional fields are required after you authorize the connection. ## Available Data Once connected, BonData can sync the following Gmail data: * **Messages** - Emails from your mailbox, including headers and body * **Threads** - Conversations grouping related messages * **Labels** - Your Gmail labels and folder structure * **Drafts** - Unsent draft messages BonData can also **send email** as an action, letting Agents deliver notifications and replies directly from your Gmail account. # SendGrid Source: https://docs.bondata.ai/integrations/notifications/sendgrid Connect BonData to SendGrid to send automated emails from your playbooks SendGrid (by Twilio) is a cloud-based email delivery platform for transactional and marketing emails, trusted by developers for reliable, scalable email infrastructure. With BonData, you can connect to your SendGrid account to send automated emails from your Agent workflows. ## API Key Authentication BonData connects to SendGrid using an API key for secure email sending. ### Step 1: Create an API Key 1. Go to [SendGrid Dashboard](https://app.sendgrid.com/) 2. Navigate to **Settings** → **API Keys** 3. Click **Create API Key** 4. Give it a name (e.g., `BonData Integration`) 5. Select **Restricted Access** and enable: * **Mail Send** → Full Access 6. Click **Create & View** 7. Copy the API key immediately (it won't be shown again) ### Step 2: Connect in BonData 1. In BonData, navigate to **Integrations** and select **SendGrid** 2. Enter your API Key 3. Click **Connect** ## Required Fields | Field | Description | | ------- | ------------------------------------------- | | API Key | SendGrid API key with Mail Send permissions | Make sure your SendGrid account has verified sender identities configured before sending emails. ## Using SendGrid in Playbooks Once connected, you can use SendGrid in your playbooks to send automated emails. ### Send Email Node Add a **Send Email** node to your playbook: * **Subject** - Email subject line * **Message Template** - Email body content * **To Emails** - Recipient addresses (can use `{{email_field}}`) * **From Email** - Sender address (must be verified in SendGrid) * **CC/BCC** - Optional copy recipients ### Message Templating Use `{{field_name}}` syntax to include dynamic data: ``` Hi {{customer_name}}, Your order #{{order_number}} has been confirmed. Total: ${{total_amount}} ``` ## Capabilities * Send plain text or HTML emails * Dynamic recipient addresses from workflow data * CC and BCC support * Templated subject lines and body content * Bulk email sending with personalization # Slack Source: https://docs.bondata.ai/integrations/notifications/slack Connect BonData to Slack to send automated messages and notifications to your channels Slack is a business communication platform for team messaging, file sharing, and workflow automation. With BonData, you can connect to your Slack workspace to send automated notifications and alerts from your Agent workflows directly to channels and users. ## OAuth Authentication BonData connects to Slack using OAuth 2.0 for secure access to send messages to your workspace. ### Connect Your Workspace 1. In BonData, navigate to **Integrations** and select **Slack** 2. Click **Connect** 3. You'll be redirected to Slack to authorize the connection 4. Select the workspace you want to connect 5. Review the permissions and click **Allow** 6. You'll be redirected back to BonData once connected BonData requests permissions to send messages to channels and direct messages. The integration can only post to channels it has been invited to. ## Using Slack in Playbooks Once connected, you can use Slack in your playbooks to send automated notifications. ### Slack Action Node Add a **Send Slack Message** node to your playbook to send notifications: * **Single Message** - Title/header shown for individual records * **Aggregated Message** - Body content for grouped records * **Channels** - List of channels to send to (e.g., `#alerts`, `#notifications`) ### Message Templating Use `{{field_name}}` syntax to include dynamic data in your messages: ``` Account {{account_name}} has revenue of ${{annual_revenue}} ``` ## Capabilities * Send messages to public and private channels * Send direct messages to users * Dynamic message content using workflow data * Batch multiple records into single notifications # Microsoft Teams Source: https://docs.bondata.ai/integrations/notifications/teams Connect BonData to Microsoft Teams to send automated messages and notifications Microsoft Teams is a collaboration platform for chat, video meetings, file sharing, and app integrations within the Microsoft 365 ecosystem. With BonData, you can connect to your Teams organization to send automated notifications and alerts from your Agent workflows directly to channels and users. ## OAuth Authentication BonData connects to Microsoft Teams using OAuth 2.0 for secure access to send messages to your teams and channels. ### Connect Your Organization 1. In BonData, navigate to **Integrations** and select **Microsoft Teams** 2. Click **Connect** 3. You'll be redirected to Microsoft to authorize the connection 4. Sign in with your Microsoft account 5. Review the permissions and click **Accept** 6. You'll be redirected back to BonData once connected BonData requests permissions to send messages to Teams channels. An admin may need to approve the connection for your organization. ## Using Teams in Playbooks Once connected, you can use Microsoft Teams in your playbooks to send automated notifications. ### Teams Action Node Add a **Send Teams Message** node to your playbook to send notifications: * **Message Template** - Content of the message * **Title** - Header shown on the message card * **Team Name** - The team to post to * **Channel Name** - The channel within the team (e.g., `General`, `Alerts`) ### Message Templating Use `{{field_name}}` syntax to include dynamic data in your messages: ``` Account {{account_name}} has revenue of ${{annual_revenue}} ``` ## Capabilities * Send messages to team channels * Send direct messages to users * Rich Adaptive Card formatting * Dynamic message content using workflow data * Automatic or approval-based message sending # Crunchbase Source: https://docs.bondata.ai/integrations/other/crunchbase Connect BonData to Crunchbase for company, funding, and investor data Crunchbase is the leading platform for private company data, covering funding rounds, acquisitions, investors, and business relationships across the startup and venture ecosystem. With BonData, you can connect to your Crunchbase account to enrich your data with company profiles, funding history, and investor information within Agent workflows. ## Crunchbase API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Log in to [Crunchbase](https://www.crunchbase.com/) 2. Click your profile icon in the top-right 3. Go to **Settings** → **Integrations** → **Crunchbase API** ### Step 2: Copy Your API Key 1. Your **User Key** is displayed on the API page 2. Click **Copy** to copy the key If you don't see an API key, your Crunchbase plan may not include API access. Contact your Crunchbase account manager to enable API access. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Crunchbase** 2. Enter your **API Key** 3. Click **Connect** ## Required Fields | Field | Description | | ------- | -------------------------------------------------------------------------------- | | API Key | User Key from Crunchbase API settings (Settings → Integrations → Crunchbase API) | ## Available Data Once connected, BonData can sync the following Crunchbase data: * **Organizations** - Company profiles with firmographics, funding, and operating status * **People** - Profiles of founders, executives, and investors * **Funding Rounds** - Details on investments including amounts, types, and investors * **Acquisitions** - M\&A activity with acquirer, acquiree, and deal terms * **IPOs** - Public offerings with stock symbols and exchange data * **Jobs** - Executive and board member positions at organizations * **Funds** - Investment fund details and fund owners * **Investments** - Individual investment records linking investors to funding rounds # CSV Files Source: https://docs.bondata.ai/integrations/other/csv Upload and sync data from CSV files directly into BonData CSV (Comma-Separated Values) is a universal file format for tabular data, supported by virtually every data tool and spreadsheet application. With BonData, you can upload CSV files directly to create data entities that integrate seamlessly with your Agent workflows - no external system required. ## File Upload BonData allows you to upload CSV files directly to create data entities that can be used in your playbooks. ### Supported File Formats * **CSV** - Comma-separated values * **TSV** - Tab-separated values * Standard text encodings (UTF-8 recommended) ### Step 1: Prepare Your File Ensure your CSV file is properly formatted: 1. **Header Row**: The first row should contain column names 2. **Consistent Data**: Each row should have the same number of columns 3. **Clean Data**: Remove any special characters that might cause parsing issues ### Step 2: Upload in BonData 1. Navigate to the Integrations section 2. Select **CSV** as the integration type 3. Click **Upload File** and select your CSV file 4. BonData will automatically detect columns and data types ### Step 3: Configure the Entity After upload, you can: * Set a primary key column for record identification * Adjust column data types if needed * Name your entity for easy reference ## No Authentication Required CSV file uploads don't require any external authentication. Files are securely stored in BonData's infrastructure. File size limits may apply depending on your plan. Contact support for large file uploads. ## Best Practices * **Primary Keys**: Always include a unique identifier column for reliable data syncing * **Date Formats**: Use ISO 8601 format (YYYY-MM-DD) for dates * **Numbers**: Avoid formatting (no commas, currency symbols) * **Text**: Enclose text with commas in double quotes ## Available Operations With CSV data in BonData, you can: * **Join with other data sources** - Combine CSV data with your CRM, databases, etc. * **Transform and enrich** - Apply transformations in playbooks * **Export** - Use CSV data as a source for other integrations * **Schedule updates** - Re-upload files to update the data # Dun & Bradstreet Source: https://docs.bondata.ai/integrations/other/dnb Connect BonData to Dun & Bradstreet Direct+ for company enrichment, firmographics, and risk data Dun & Bradstreet Direct+ is a data enrichment platform built on the D-U-N-S Number, providing authoritative firmographics, corporate hierarchies, financials, and risk scores for companies worldwide. With BonData, you can connect to your D\&B Direct+ account to enrich your data with company profiles and risk intelligence within Agent workflows. ## Dun & Bradstreet API Key Setup D\&B Direct+ authenticates with a **Client ID** (API Key) and **Client Secret**, which BonData exchanges for an OAuth access token. ### Step 1: Access the Direct+ Developer Portal 1. Log in to the [D\&B Direct+ Developer Portal](https://directplus.documentation.dnb.com/) 2. Open **My Account** → **Credentials** (or **API Keys**) Direct+ credentials are provisioned per subscription. If you don't see a Client ID and Secret, contact your D\&B account manager to enable API access and the data blocks you need. ### Step 2: Copy Your Client ID and Secret 1. Locate your **Key** (Client ID) and **Secret** (Client Secret) 2. Copy both values D\&B uses these credentials to issue a short-lived OAuth bearer token. BonData handles the token exchange and refresh for you - you only need to supply the Client ID and Secret. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **Dun & Bradstreet** 2. Enter your **Client ID** and **Client Secret** 3. Click **Connect** ## Required Fields | Field | Description | | ------------- | ----------------------------------------- | | Client ID | Key from your D\&B Direct+ credentials | | Client Secret | Secret from your D\&B Direct+ credentials | ## Available Data Once connected, BonData can enrich and sync the following Dun & Bradstreet data: * **Company Profiles** - Company records keyed by **D-U-N-S Number** * **Firmographics** - Industry codes, employee counts, revenue, and address details * **Corporate Linkage / Hierarchy** - Parent, subsidiary, and ultimate-parent relationships * **Financials** - Reported and modeled financial statement data * **Risk Scores** - Creditworthiness and risk indicators including **Paydex** and **Failure Score** # EVC-Net Source: https://docs.bondata.ai/integrations/other/evcnet Connect BonData to EVC-Net EVC-Net is a fleet management and EV charging operations platform. With BonData, you can connect to your EVC-Net instance to read and analyze operational and fleet data within Agent workflows. ## EVC-Net API Setup Follow these steps to get your API credentials for BonData. ### Step 1: Access API Settings 1. Log in to your EVC-Net account 2. Navigate to your account settings or API section 3. Request API access if not already enabled ### Step 2: Get Your API Key 1. Locate your API key in the settings 2. **Copy the API key** ### Step 3: Get Your EVC-Net URL Your EVC-Net URL is in the format: * `https://yourcompany.evc-net.com` ### Step 4: Enter Credentials Enter your URL and API key in BonData. ## Required Fields | Field | Description | | ------- | ------------------------------------------ | | URL | Your EVC-Net instance URL | | API Key | API key from your EVC-Net account settings | # File Upload Source: https://docs.bondata.ai/integrations/other/file-upload Upload ad-hoc files and sync their data directly into BonData File Upload is BonData's general-purpose uploader for ad-hoc data files. When you have a one-off export or a file that doesn't warrant a live connection, you can upload it directly to create data entities that integrate seamlessly with your Agent workflows - no external system required. ## Uploading a File BonData reads your file, infers its schema, and creates an entity you can use in playbooks. ### Step 1: Add the Data Source 1. Navigate to **Integrations** and click **Add Data Source** 2. Select **File Upload** as the source type ### Step 2: Upload Your File 1. Drag and drop your file into the upload area, or click to browse and select it 2. BonData inspects the file and detects its format automatically 3. Columns, data types, and row counts are inferred from the contents ### Step 3: Review and Confirm 1. Review the detected schema and adjust column types if needed 2. Name your entity for easy reference 3. Confirm to create the entity Supported formats: **CSV**, **XLSX**, and **JSON**. BonData chooses the right parser based on the file, so you can upload any of these through the same flow. ## Primary Key Detection BonData automatically detects a primary key by finding a field whose value is unique and present across every row. If no single field is unique, BonData supports composite keys - a combination of fields that together uniquely identify each record. You can override the detected key before confirming. ## Required Fields | Field | Description | | ----------- | ------------------------------------------------------------------------------------------------- | | File | The file to upload (CSV, XLSX, or JSON) | | Primary Key | Unique field (or composite of fields) identifying each record - auto-detected, override if needed | ## Available Data * **Records** - Each row or object in the file becomes a record in the entity * **Inferred schema** - Column names and data types detected from the file contents To update the data, re-upload a new version of the file. BonData re-reads it and applies changes by primary key. # JSON Source: https://docs.bondata.ai/integrations/other/json Upload and sync data from JSON and JSON Lines files directly into BonData JSON is the universal format for structured and semi-structured data, produced by virtually every API and application. With BonData, you can upload a JSON file - or paste JSON directly - to create data entities that integrate seamlessly with your Agent workflows, no external system required. ## Uploading a File BonData reads your JSON, flattens nested structure into columns, and creates an entity you can use in playbooks. ### Step 1: Add the Data Source 1. Navigate to **Integrations** and click **Add Data Source** 2. Select **JSON** as the source type ### Step 2: Provide Your JSON 1. Drag and drop a `.json` or `.jsonl` file, click to browse, or paste JSON directly into the editor 2. BonData parses the content and detects the record structure: * An **array of objects** - each object becomes a row * **JSON Lines** (`.jsonl`) - each line is parsed as one record * A **single object** - imported as one record ### Step 3: Review and Confirm 1. Review the flattened columns and adjust data types if needed 2. Name your entity for easy reference 3. Confirm to create the entity Nested objects are flattened into dot-notation columns (for example, `address.city`), and arrays of records are expanded into rows so the data lands in a clean tabular shape. ## Primary Key Detection BonData automatically detects a primary key by finding a field whose value is unique and present across every record. If no single field is unique, BonData supports composite keys - a combination of fields that together uniquely identify each record. You can override the detected key before confirming. ## Required Fields | Field | Description | | ----------- | ------------------------------------------------------------------------------------------------- | | File | The `.json` or `.jsonl` file to upload, or pasted JSON content | | Primary Key | Unique field (or composite of fields) identifying each record - auto-detected, override if needed | ## Available Data * **Records** - Each object (or JSON Lines row) becomes a record in the entity * **Flattened fields** - Nested objects flattened into columns, arrays of records expanded into rows Supported formats: standard **JSON** and **JSON Lines** (`.jsonl`). To refresh the data, re-upload an updated file - BonData re-parses it and applies changes by primary key. # PagerDuty Source: https://docs.bondata.ai/integrations/other/pagerduty Connect BonData to PagerDuty for incident management data PagerDuty is a digital operations management platform for incident response, on-call scheduling, and event-driven automation. With BonData, you can connect to your PagerDuty account to read and analyze incident, service, and on-call data within Agent workflows. ## PagerDuty API Key Setup Follow these steps to create an API key for BonData. ### Step 1: Access API Settings 1. Log in to [PagerDuty](https://app.pagerduty.com) 2. Go to **Integrations** → **Developer Tools** → **API Access Keys** ### Step 2: Create an API Key 1. Click **Create New API Key** 2. Enter a description (e.g., `BonData Integration`) 3. Choose the key type: * **Read-only** - for read access only * **Full Access** - for read and write access 4. Click **Create Key** ### Step 3: Copy the API Key **Copy the key immediately** - it starts with `u+` and won't be shown again. ### Step 4: Enter Credentials Enter your PagerDuty API key in BonData. For enhanced security, consider using a read-only key if BonData only needs to read data. ## Required Fields | Field | Description | | ------- | --------------------------------------------- | | API Key | API Access Key from PagerDuty Developer Tools | # Synccentric Source: https://docs.bondata.ai/integrations/other/synccentric Connect BonData to Synccentric for Amazon product data lookups Synccentric is an Amazon product data platform that provides real-time access to product information, pricing, and catalog data via ASIN lookups. With BonData, you can use Synccentric in your Agent workflows to enrich records with Amazon product details - including titles, brands, pricing, dimensions, and more. ## Synccentric API Key Setup Follow these steps to connect BonData to your Synccentric account for Amazon product searches. ### Step 1: Access API Settings 1. Go to [Synccentric](https://app.synccentric.com/) 2. Sign in to your account 3. Navigate to your API settings ### Step 2: Get Your API Key 1. Copy your API key from the settings page ### Step 3: Enter Credentials Enter your Synccentric API key in BonData. Synccentric is used for Amazon product data lookups within Agent workflows. It supports both quick lookups (up to 5,000 ASINs) and bulk searches for larger datasets. ## Required Fields | Field | Description | | ----------- | -------------------------------------- | | API Key | API key from your Synccentric account | | Campaign ID | Optional campaign ID to scope searches | # Excel Source: https://docs.bondata.ai/integrations/other/xlsx Upload and sync data from Excel workbooks directly into BonData Excel is the most widely used spreadsheet format for tabular business data, from account lists to product catalogs. With BonData, you can upload an Excel workbook directly to create data entities that integrate seamlessly with your Agent workflows - no external system required. ## Uploading a File BonData reads your workbook, discovers every sheet, and turns each one into its own entity. ### Step 1: Prepare Your Workbook 1. **Header Row**: The first populated row of each sheet is used as the column names 2. **One table per sheet**: Each worksheet becomes a separate entity, named after the sheet 3. **Consistent rows**: Keep the same columns across all rows in a sheet ### Step 2: Upload in BonData 1. Navigate to **Integrations** and click **Add Data Source** 2. Select **Excel** as the source type 3. Drag and drop your `.xlsx` or `.xls` file, or click to browse and select it 4. BonData scans the workbook and lists each sheet with its detected columns and row count ### Step 3: Select Sheets and Confirm 1. Choose which sheets to import as entities 2. Review the detected columns for each sheet 3. Confirm to create the entities Each sheet is read using its header row to determine columns, and rows below the header become records. Empty leading rows are skipped when locating the header. ## Primary Key Detection BonData automatically detects a primary key by finding a column whose value is unique and present across every row in the sheet. If no single column is unique on its own, BonData supports composite keys - a combination of columns that together uniquely identify each row. You can override the detected key when confirming the entity. ## Required Fields | Field | Description | | ----------- | ------------------------------------------------------------------------------------------------ | | File | The `.xlsx` or `.xls` workbook to upload | | Primary Key | Unique column (or composite of columns) identifying each row - auto-detected, override if needed | ## Available Data * **Sheets as entities** - Every worksheet in the workbook becomes its own entity * **Columns from the header row** - Column names and data types inferred from the sheet header and values Supported formats: **.xlsx** and **.xls**. To refresh the data, re-upload an updated workbook - BonData re-reads the sheets and applies changes by primary key. # ZoomInfo Source: https://docs.bondata.ai/integrations/other/zoominfo Connect BonData to ZoomInfo to sync your sales intelligence data ZoomInfo is a B2B sales intelligence platform that provides comprehensive company and contact data, intent signals, and go-to-market insights. With BonData, you can connect to your ZoomInfo account to read and enrich your sales data with firmographic, contact, and intent information within Agent workflows. ## API Authentication Setup BonData connects to ZoomInfo using API key authentication with a username, client ID, and private key. ### Step 1: Access API Settings 1. Log in to [ZoomInfo](https://app.zoominfo.com) as an admin 2. Go to **Admin Portal** → **Integrations** → **API & Webhooks** ### Step 2: Create API Credentials 1. Click **Create API Key** (or locate your existing credentials) 2. Copy your **Client ID** 3. Generate a **Private Key** and download the key file Save the private key file immediately - it cannot be retrieved again after generation. If lost, you'll need to generate a new one. ### Step 3: Enter Credentials in BonData 1. In BonData, navigate to **Integrations** and select **ZoomInfo** 2. Enter your **Username** (your ZoomInfo login email) 3. Enter your **Client ID** from the Admin Portal 4. Upload your **Private Key** file (or paste the key text) 5. Click **Connect** ## Required Fields | Field | Description | | ----------- | -------------------------------------------------------------------- | | Username | Your ZoomInfo username used for API authentication | | Client ID | Client ID from ZoomInfo Admin Portal (Integrations > API & Webhooks) | | Private Key | Private key file generated from ZoomInfo Admin Portal | ## Available Data Once connected, BonData can sync the following ZoomInfo data: * **Contacts** - People records with direct dials, emails, and job details * **Companies** - Organization profiles with firmographic data * **Intent Signals** - Buying intent data based on topic research * **Scoops** - Business event alerts (funding, leadership changes, etc.) # Access control Source: https://docs.bondata.ai/platform/access-control Roles, permissions, and how authorization is enforced inside BonData. BonData enforces authorization at the API tier on every request. Each request carries a Descope-issued JWT; the API validates the JWT, resolves it to a user record and the tenant the user belongs to, and then checks the user's role against the action being requested. ## Tenancy Every request is scoped to a single tenant. Tenant isolation is enforced at the application layer: queries against the operational database and the data lake are filtered by tenant; object-storage keys are namespaced by tenant; integration credentials are stored per-tenant. A user can only ever see data belonging to the tenant they are signed in to. In Cloud-Prem, the entire deployment serves a single tenant and lives in the customer's own AWS account, so this isolation is reinforced by physical separation. ## Roles Users belong to one of several roles within a tenant. Roles control which actions the user can take in the user-facing application, managing integrations, building and running agents, viewing data, inviting users, and so on. Administrative actions, provisioning tenants, managing subscriptions, viewing platform-level diagnostics, are performed in the **separate management application**, which uses a different Descope project. A user with management access in one application does **not** automatically have access in the other; access has to be granted explicitly. ## Admin separation The split between the user-facing application and the management application is operationally important: it means a compromised end-user account, even an administrator within a tenant, cannot reach the platform-management surface that BonData operators use. The two applications run as separate Kubernetes Deployments, behind separate Descope projects, with separate session tokens. ## API tokens Programmatic access uses tenant-scoped API tokens. A token carries the role of the user or service account it was issued for; the same authorization checks run on every API request whether it originated from a browser session or a token. ## Principle of least privilege Inside the cluster, services authenticate to AWS through IRSA-bound IAM roles. Each service has its own role, scoped to only the AWS actions and resources it needs, the API does not have the same AWS permissions as the data-refinery runner, for example. The same principle applies to integration credentials: each integration's credentials are scoped to the OAuth permissions or database privileges the integration actually requires. # Application architecture Source: https://docs.bondata.ai/platform/application-architecture What BonData is, how the application is built, and how work flows through it. BonData is a master data management (MDM) and AI automation platform. Users connect their business systems as **integrations**, let AI match and unify records across them with **bonds**, build **agents** that automate data work across those systems, and either run agents on demand or schedule them. An agent is a graph of **nodes** (data fetch, filter, transform, AI enrichment, code execution, action) that the platform executes in order, reading from the connected integrations and writing the result back as a notification, an export, or an update to a record in one of the source systems. The platform that runs all of this is the same in every deployment, multi-tenant Cloud SaaS, single-tenant Dedicated Cloud in a BonData-operated account, or single-tenant Cloud-Prem inside a customer's AWS account. This page describes the application itself: its user-facing surfaces, the services that execute work, and the data layer underneath. For how the platform is arranged in each deployment, see [Deployment scenarios](/platform/deployment-scenarios/overview). ## Workflow overview A user signs in through one of the access-layer surfaces, typically the webapp, where they build and run agents, browse the connected data warehouse, and chat with the AI assistant. The webapp talks to the user-facing API. The API authenticates the request, resolves the caller to a tenant, and either serves a synchronous response from the operational database or enqueues an asynchronous job on the message broker. When an agent runs, a workflow runner picks up the job and walks the agent's node graph in topological order. Data nodes pull records from connected integrations; transform and filter nodes run in-memory; enrichment nodes call AI providers or run generated code in a sandboxed microVM; action nodes write back to integrations or deliver notifications. Each step is logged with a tenant identifier and a request ID so the entire run can be traced end-to-end. The same workflow engine powers the chat agent, which uses the MCP server to expose BonData's tool surface to an LLM, so a user can ask the assistant to run an agent, query the data warehouse, or take an action, and the same authorization and tenancy rules apply. ### Chat agent guardrails The chat agent inherits the calling user's identity end-to-end: every tool invocation runs under the user's tenant, role, and integration scopes, and is subject to the same authorization checks as a direct API call. The agent cannot access data or invoke integrations the user is not already entitled to. Sensitive actions surface a confirmation step in the chat UI before they execute. All agent activity is logged with the same request ID, tenant, and user attribution as the rest of the platform (see [Audit logging](/platform/audit-logging)). ## Core components BonData is organized into three layers, an access layer, an application layer, and a data and messaging layer. ### Access layer External traffic reaches BonData through **Cloudflare**, which provides DNS, TLS termination, web-application firewall rules, and DDoS protection at the edge. From Cloudflare, traffic is forwarded to an **AWS Application Load Balancer**, which terminates a second TLS hop using a certificate from **AWS Certificate Manager** and routes to services running in the cluster. For deployments that cannot accept inbound traffic at all, the Cloudflare Tunnel controller dials outbound from the cluster and Cloudflare brings traffic over the tunnel. ### Application layer The application layer runs on **Amazon EKS** with workloads in private subnets across three availability zones. It is composed of: * **API services.** A user-facing FastAPI service, a separate management API, and an MCP server that exposes BonData's tool surface to AI clients over the [Model Context Protocol](https://modelcontextprotocol.io) with Server-Sent Events for streaming. * **Web applications.** A user-facing React webapp built with Vite, an administrative webapp, and a chat-agent service that uses the Anthropic SDK and acts as an MCP client. * **Workflow engine.** Workflows are graphs of nodes (data fetch, filter, transform, enrichment, action). When a workflow runs, the API enqueues a job on the broker and a workflow runner picks it up. * **Asynchronous runners.** Two kinds of pod do most of the heavy work. Queue consumers subscribe to the broker and execute workflow jobs, integration syncs, and data refinement. Scheduled runners run on intervals, refreshing integration credentials, monitoring integration health, delivering notifications, aggregating data quality, and reconciling state. * **Sandboxed code execution.** When a workflow needs to run generated code, the code-execution node sends the generated code and the input variables the workflow node passes (not the full workflow state) to **e2b Code Interpreter**, where it executes in an ephemeral Firecracker microVM hosted in the United States. Each sandbox is kernel-isolated and destroyed at the end of the execution. Network access from inside the sandbox depends on the workflow's configuration. e2b maintains its own compliance posture at [trust.e2b.dev](https://trust.e2b.dev), which customers can review as part of their vendor due diligence. Authentication, authorization, and tenant resolution happen at the API tier on every request; see [Authentication](/platform/authentication) and [Access control](/platform/access-control). ### Data and messaging layer State is held in a small set of managed AWS services and one in-cluster cache: | Layer | Service | | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Operational database | Amazon RDS for PostgreSQL with the `pgvector` extension. Holds users, tenants, agent definitions, integration metadata, audit records, and vector embeddings. | | Data lake | Apache Iceberg tables on Amazon S3, queried with AWS Athena, catalogued with AWS Glue. Holds raw and refined integration data and large analytic datasets. | | Analytics | Amazon Redshift Serverless. Loaded by the data pipeline; not on the user request path. | | Cache | Clustered in-cluster Redis. Deduplication, session caching, runtime caches. | | Object storage (internal) | Private Amazon S3 bucket for internal application artifacts. SSE-S3 at rest, versioning enabled. | | Object storage (public) | Amazon S3 bucket fronted by Amazon CloudFront for user-published outputs. Only artifacts a user has explicitly published are exposed, and only via signed CloudFront URLs. | | Messaging | Amazon MQ for RabbitMQ in a multi-AZ clustered configuration in production. AMQPS only, port 5671. | Job payloads on the broker are typically small references (record IDs, S3 keys) rather than the records themselves; the records are read on demand from RDS or S3. ## AI providers The default LLM is **Anthropic Claude**. Workflows can be configured to use **Google Gemini** or **OpenAI** models. All model calls are HTTPS egress; no model-provider component is deployed in the cluster. Anthropic, Google, and OpenAI API usage is governed by each provider's commercial terms, which prohibit using customer inputs and outputs for model training. ### Embeddings Two embedding options are supported: * **OpenAI `text-embedding-3-small`** (default). Used in Cloud SaaS and as the default in Cloud-Prem. HTTPS egress to OpenAI; not used for training under OpenAI's commercial API terms. * **AWS Bedrock Titan Embeddings** (enterprise packages only). Runs inside the customer's AWS region in their Cloud-Prem deployment, so the embedding call never leaves the customer's AWS account. Available on enterprise-tier engagements; selected at deployment time. ## Identity Identity is provided by **Descope**, with separate Descope projects for the user-facing application and the management application. SSO over SAML or OIDC, MFA, and session controls are configured in Descope. Applications validate Descope-issued JWTs locally on every request. See [Authentication](/platform/authentication). ## Secrets All credentials and application-layer encryption keys are stored in **AWS Secrets Manager** and synced into the cluster by the **External Secrets Operator**. No long-lived AWS keys live in the cluster, in CI, or in the codebase. See [Secrets management](/platform/secrets-management). ## Observability | Layer | Service | | ------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | Errors | Sentry | | Logs | New Relic, shipped via Fluent Bit | | Metrics | New Relic Kubernetes exporter and in-cluster Prometheus (`kube-prometheus-stack`) | | Audit and request tracing | Structured JSON logs across all services, with a request ID that ties every downstream log line to the originating request | See [Audit logging](/platform/audit-logging) for what is captured and where it lives. ## Ports and protocols | Service | Port | Protocol | Direction | Notes | | ----------------------------------------------- | ---- | -------------- | ---------- | ------------------------------------------------ | | Cloudflare → ALB | 443 | TCP / TLS 1.2+ | Inbound | TLS re-terminated at the ALB. | | ALB → API services | 8000 | HTTP | In-cluster | Internal, behind the ALB. | | ALB → MCP server | 8081 | HTTP + SSE | In-cluster | Server-Sent Events for streaming tool calls. | | API / runners → RDS PostgreSQL | 5432 | TCP | In-cluster | TLS in transit. | | API / runners → Amazon MQ | 5671 | AMQPS | In-cluster | TLS in transit. | | API / runners → Redis | 6379 | TCP | In-cluster | | | API / runners → AI providers | 443 | HTTPS | Outbound | Anthropic, OpenAI, Google, e2b. | | API / runners → integration endpoints | 443 | HTTPS | Outbound | Per-integration SaaS or warehouse APIs. | | External Secrets Operator → AWS Secrets Manager | 443 | HTTPS | Outbound | IRSA-bound, scoped to the BonData secret prefix. | ## High availability Workloads are distributed across three availability zones. **Amazon EKS** manages the Kubernetes control plane with multi-AZ redundancy under AWS's EKS service-level agreement. A NAT gateway is provisioned in each AZ so an AZ failure does not sever cluster egress. The **API tier** runs with multiple replicas across AZs behind a cross-zone-balanced **Application Load Balancer**; unhealthy targets are removed automatically via ALB health checks. **Amazon RDS** runs **Multi-AZ** with synchronous standby replication and automated failover. **Amazon MQ** (RabbitMQ) runs in a **clustered multi-AZ** configuration with mirrored durable queues so in-flight messages survive a broker failover. # Audit logging Source: https://docs.bondata.ai/platform/audit-logging What BonData logs, where the logs live, and how customers can access them. BonData emits structured JSON logs from every service. Logs are shipped out of the cluster by **Fluent Bit** and aggregated in **New Relic**; runtime errors are tracked separately in **Sentry**; and platform metrics are scraped by an in-cluster **Prometheus** alongside a New Relic Kubernetes exporter. ## What is logged Every BonData service emits a structured record on the events that matter for an audit trail: * **API requests**: the HTTP method and path, the tenant and user the request was attributed to, the duration, the response status, and a request ID that ties together every downstream log line. * **Authentication events**: successful sign-ins, failed sign-ins, MFA challenges, session refreshes, and sign-outs. * **Agent runs**: the agent ID, the trigger, the user who started the run, the nodes that executed, and the final outcome. * **Integration operations**: when a credential is added, refreshed, used, or revoked. * **Administrative actions**: changes made in the management application, including tenant provisioning, role changes, and configuration updates. All log records include a tenant identifier and the request ID, so an audit reviewer can reconstruct an end-to-end trail from a single log line. ## Where logs live In Cloud SaaS, logs are aggregated in **New Relic**. Retention follows the New Relic plan BonData operates under. Runtime errors are captured in **Sentry** (UI, API, and backend each in their own Sentry project) with stack traces and request metadata; PII filtering is enabled. In Cloud-Prem, the same log stream is available in the customer's own account. EKS audit logs and CloudWatch Logs accumulate in the customer's AWS account by default. Customers can additionally forward application logs to their own SIEM, Splunk, Datadog, Panther, and similar destinations are supported via a Fluent Bit output configuration. ## AWS-side audit For both deployment models, AWS CloudTrail records every API action against AWS resources, including every action taken by the BonData operator role in Cloud-Prem. CloudTrail is the customer's primary audit surface for operator actions in their own AWS account. ## Request IDs A single request ID is injected at the ingress layer and propagated through every downstream service. The ID appears in API logs, agent run logs, integration call logs, and Sentry events, so any user-visible event can be traced through the system without correlating timestamps. # Authentication Source: https://docs.bondata.ai/platform/authentication How users sign in to BonData and how identities are federated to enterprise identity providers. BonData uses **Descope** as its identity provider. Two separate Descope projects are maintained, one for the user-facing application and one for the management application, so that administrative access is operationally distinct from end-user access. ## Sign-in methods **Enterprise SSO is the only supported sign-in method.** The customer's IdP is the sole entry point: authentication, MFA policy, and session controls all flow from the IdP, and revoking a user in the IdP revokes their BonData access on the next token refresh. * **SAML 2.0**: connect to Okta, Azure AD / Entra ID, Google Workspace, Ping, OneLogin, or any SAML 2.0 IdP. * **OpenID Connect (OIDC)**: connect to any OIDC IdP. ## Active Directory and LDAP Customers running on-premise Active Directory or LDAP federate to BonData through their existing identity provider over SAML 2.0 or OIDC. Descope explicitly documents integrations with **Microsoft Entra ID** (Azure AD), **Okta**, and **Google Workspace**; any other standards-compliant SAML 2.0 or OIDC IdP, including **ADFS**, **Ping Identity**, **OneLogin**, and **JumpCloud**: works the same way. The IdP authenticates the user against the customer's directory; BonData receives the federated identity. Users get true single sign-on with the credentials they already use in the customer's environment. ## User provisioning and deprovisioning User lifecycle, joiners, movers, leavers, is synchronized from the customer's IdP via **SCIM 2.0**. Descope's published SCIM setup guides cover **Okta** and **Microsoft Entra ID**; other SCIM-2.0-compliant IdPs (Ping Identity, and others) integrate the same way. When a user is disabled in the IdP or removed from a group, the change propagates to BonData on the user's next sign-in or token refresh, and their access is revoked. Group memberships in the IdP are mapped to BonData roles, so a user moving between teams in the directory automatically picks up the right permissions on next sign-in. ## Multi-factor authentication MFA is enforced according to the policy configured for the tenant. When SSO is used, MFA is delegated to the IdP and inherits whatever step-up policies the customer has configured there. ## Session handling After a successful sign-in, Descope issues a short-lived JWT. The BonData applications validate this JWT locally on every request, so transient Descope outages do not log out active sessions. Sessions are refreshed automatically through the standard OIDC refresh-token flow until the configured idle timeout is reached. Sessions can be revoked centrally, an administrator removing a user in the IdP causes the user's next refresh attempt to fail, ending the session. ## What customers can configure * The IdP and protocol (SAML or OIDC). * Idle session timeout. * MFA policy at the IdP (BonData inherits whatever the IdP enforces). Configuration is done through the management application; changes take effect immediately for subsequent sign-ins. # Compliance Source: https://docs.bondata.ai/platform/compliance Regulatory compliance frameworks BonData operates against. BonData meets the IT control requirements for multiple regulatory and industry compliance frameworks. The platform's deployment models, Cloud SaaS and Cloud-Prem, give customers a choice in where the boundary of responsibility sits between BonData and the customer's own controls. ## SOC 2 Type II Report BonData has completed its SOC 2 Type II audit. The report is available under NDA via `security@bondata.ai`. ### Key benefits A SOC 2 Type II report provides an in-depth analysis of a cloud service provider's controls against the AICPA's Trust Services Criteria, Security, Availability, Processing Integrity, Confidentiality, and Privacy. The report is produced by an independent auditor, includes detailed descriptions of the controls in place, and tests their operational effectiveness over a defined audit window. ## ISO 27001 Certification BonData is ISO 27001 certified. The certificate is available under NDA via `security@bondata.ai`. ### Key benefits ISO 27001 is the international standard for the comprehensive management of information security. Certification demonstrates that an organization employs a framework of legal, physical, and technical controls to manage information risk, covering personnel security, asset management, access control, cryptography, operations security, communications, supplier relationships, and incident management. ## GDPR Compliance BonData processes customer personal data as a Data Processor and complies with the EU General Data Protection Regulation. A Data Processing Agreement, with the EU Standard Contractual Clauses incorporated, is available to customers. ### Key benefits The GDPR governs the way personal data of individuals in the European Union is collected, stored, processed, and erased. It standardizes data-protection law across the EU and grants individuals enforceable rights including access, rectification, erasure, restriction of processing, and portability of their personal data. # Amazon EKS reference architecture Source: https://docs.bondata.ai/platform/deployment-scenarios/amazon-eks The EKS cluster, networking, storage, and IAM model BonData provisions for Cloud-Prem on AWS. A Cloud-Prem deployment provisions an **Amazon Elastic Kubernetes Service (EKS)** cluster inside the customer's AWS account. This page describes the cluster, networking, storage, and IAM configuration BonData provisions during onboarding, the same shape the customer's security and platform teams will see when they review the Terraform module before applying it. The multi-tenant Cloud SaaS uses the same EKS configuration internally, but only the Cloud-Prem customer sees it in their own account. ## Cluster The cluster is provisioned with Terraform using the official `terraform-aws-modules/eks` module. AWS manages the control plane; BonData manages the cluster configuration, node groups, and the workloads inside the cluster. The control plane is private. The cluster is upgraded to a supported Kubernetes minor version on a regular cadence and **never runs a version past AWS's end-of-standard-support date** for that release. **IAM Roles for Service Accounts (IRSA)** is enabled cluster-wide. Every BonData service that needs to call an AWS API runs as a Kubernetes service account bound to a scoped IAM role, there are no long-lived AWS access keys mounted in pods, in the cluster, or in CI. ## Add-ons The following EKS managed add-ons are installed: * **AWS VPC CNI**: pod networking. Configured with prefix delegation for IP-address density. * **AWS EBS CSI driver**: persistent volumes backed by Amazon EBS. * **AWS EFS CSI driver**: shared filesystems backed by Amazon EFS, used where pods need shared-read semantics. * **CoreDNS**: in-cluster DNS resolution. * **kube-proxy**: Service routing on each node. The EBS and EFS CSI drivers run with IRSA-bound IAM roles scoped to the actions each driver requires. ## Node groups Workloads run on **EKS managed node groups** with separate node groups per workload class, for example, general application workloads, observability workloads, and stateful workloads are isolated on their own node groups via Kubernetes taints and labels. This keeps a noisy or failing workload class from affecting the rest of the cluster. All worker nodes use: * **AWS Graviton (ARM64) instances**: `AL2023_ARM_64_STANDARD` AMI family. * **On-demand capacity** for predictable performance. * **Encrypted EBS root volumes** (gp3), with KMS encryption and `delete_on_termination` enabled. * **IMDSv2 required**: token-bound instance metadata access; IMDSv1 is disabled. Each node group is sized independently and can scale within its declared min/max bounds. ## Networking The cluster lives in a dedicated VPC with three availability zones. * **Private subnets** host all workloads and the EKS control plane endpoints. Three subnets, one per AZ. * **Public subnets** host the NAT gateway and the Application Load Balancers that terminate inbound TLS. Three subnets, one per AZ. * A separate set of larger subnets is reserved for the VPC CNI's secondary ENIs (prefix delegation), so the cluster can host a high pod density without exhausting the primary subnet ranges. * The public and private subnets are tagged for ELB discovery so the AWS Load Balancer Controller can attach internal and internet-facing load balancers to the right tier. Outbound traffic exits via the **NAT gateway**. No public IP is assigned to any worker node. The cluster does not accept inbound traffic from the public internet directly, public ingress arrives at Cloudflare first and is forwarded to the ALBs inside the VPC. ## Load balancing and DNS The **AWS Load Balancer Controller** runs in the cluster (with an IRSA-bound IAM role) and provisions Application Load Balancers from Kubernetes Ingress resources. TLS certificates are issued by **AWS Certificate Manager** and attached to the ALB listeners. **external-dns** keeps Route 53 records aligned with in-cluster ingress definitions. ## Storage Stateful pods get persistent volumes from the **AWS EBS CSI driver**: encrypted gp3 volumes attached to the same AZ as the pod. Where pods need shared-read filesystem semantics, the **AWS EFS CSI driver** provides cross-AZ shared filesystems. EBS-backed StatefulSets are pinned to the AZ where their persistent volumes live, so a rolling node replacement brings the pod back where its volume can attach. ## Identity, secrets, and observability inside the cluster * **Identity to AWS** is via IRSA for every service that needs it. Per-service IAM roles, scoped to actions. * **Secrets** are pulled from AWS Secrets Manager by the **External Secrets Operator** and exposed as Kubernetes secrets to the pods that need them. See [Secrets management](/platform/secrets-management). * **Logs** are forwarded out of the cluster by Fluent Bit. **Metrics** are scraped by an in-cluster Prometheus stack and forwarded by the New Relic Kubernetes exporter. **Errors** are captured by Sentry. See [Audit logging](/platform/audit-logging). ## High availability The cluster spans three availability zones. **Amazon EKS** manages the Kubernetes control plane with multi-AZ redundancy under AWS's EKS service-level agreement. A NAT gateway is provisioned in each AZ so an AZ failure does not sever cluster egress. The **API tier** runs with multiple replicas distributed across AZs behind a cross-zone-balanced **Application Load Balancer**; unhealthy targets are removed automatically via ALB target health checks. **Amazon RDS** (the operational database) runs **Multi-AZ** with synchronous standby replication and automated failover. **Amazon MQ** (the message broker) runs in a **clustered multi-AZ** configuration with mirrored durable queues so in-flight messages survive a broker failover. # Cloud-Prem on AWS Source: https://docs.bondata.ai/platform/deployment-scenarios/cloud-prem-aws Single-tenant BonData deployment inside the customer's own AWS account. **Cloud-Prem** is BonData's deployment model for organizations that require their data and compute to remain in their own cloud account. The customer owns the AWS account; BonData operates the software inside it via an IAM role the customer creates and can revoke at any time. The software running in the customer's account is functionally identical to Cloud SaaS, same APIs, same runners, same data layer, same AI surface. The difference is that the entire stack is single-tenant, dedicated, and bounded by the customer's AWS account. ## How it works A dedicated AWS account holds the BonData environment, VPC, EKS cluster, RDS PostgreSQL instances, AWS MQ broker, S3 buckets, KMS keys. The customer creates an IAM role (`BonDataOperator`) that BonData uses to provision (Terraform) and operate (Helm). The deployment is published as `{customer}.app.bondata.ai` through a BonData-managed Cloudflare subdomain, the customer does not need to configure DNS. The EKS cluster that BonData provisions, node groups, networking, add-ons, IAM, is documented in [Amazon EKS reference architecture](/platform/deployment-scenarios/amazon-eks). The customer's data never leaves their AWS account, except for HTTPS calls to AI model providers (Anthropic, OpenAI, Google, e2b), which cross the customer's egress. ## What's the same as Cloud SaaS * Every service runs unchanged: API, management API, MCP server, workflow runners, webapps, chat agent. * The data layer is identical: RDS PostgreSQL, Iceberg on S3 + Athena + Glue, Redshift Serverless, in-cluster Redis. * The messaging fabric is Amazon MQ running RabbitMQ. * The identity provider is Descope, with a dedicated project for the customer. * The CI/CD pipeline is the same; customers pull signed container images from BonData's ECR via a pull-through cache in their own account. ## What's different | | Cloud SaaS | Cloud-Prem | | ------------------------- | ---------------------------------- | ------------------------------------------------- | | Tenancy | Multi-tenant | Single-tenant, dedicated | | AWS account | BonData's | Customer's | | Region | US by default, EU on request | Customer's choice | | Public surface | `app.bondata.ai` | `{customer}.app.bondata.ai` | | Operator access | BonData internal SSO | BonData SSO + AssumeRole into customer's IAM role | | Egress to model providers | Via BonData's NAT | Via customer's NAT | | AWS bill | Included in subscription | Direct to customer | | Upgrade cadence | Rolling, gated by CI + peer review | Scheduled with customer | ## AWS account requirements * A dedicated AWS account for the deployment, separate from the customer's primary production workload. * A region where Amazon EKS, RDS for PostgreSQL, Amazon MQ for RabbitMQ, S3, and AWS Secrets Manager are all available. Regions BonData validates by default: **US East (Virginia)**, **US West (Oregon)**, and **EU West (Ireland)**. Other regions, including EU Central (Frankfurt), are available on request. * AWS Organizations SCPs are permitted; BonData publishes the actions the deployment requires so they can be allow-listed at the OU level. * Service quotas for EKS clusters, RDS instances, AWS MQ brokers, and NAT gateways must be sufficient before provisioning. ## IAM The customer creates a single IAM role, `BonDataOperator`, that BonData assumes for both Terraform provisioning and ongoing operation. **Trust policy.** Trusts a BonData deploy account (account ID shared during onboarding) with an `sts:ExternalId` condition keyed to the customer's account. **Permissions.** Least-privilege, broken down by service. No `*:*`, no `iam:*`, no `s3:*`. | Service | Actions (summary) | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | EKS | Describe/list cluster and node groups; create, update, and delete clusters, node groups, and addons. | | EC2 (VPC, SG, NAT, EBS) | Scoped to resources tagged `bondata:managed=true`. Includes VPC, subnet, security group, NAT gateway, and EBS lifecycle actions. | | RDS | Describe/list and create/modify/delete DB instances, subnet groups, and parameter groups, scoped to instances tagged `bondata:managed=true`. | | Amazon MQ | Describe, list, create, update, and delete brokers. | | S3 | Object, policy, and bucket actions scoped to buckets prefixed `bondata-{customer}-*`. | | KMS | Create, describe, encrypt, decrypt, and generate data keys on BonData-tagged keys. Customer-managed keys, when used, remain under customer control. | | AWS Secrets Manager | Get/put secret value, create secret, describe, scoped to secrets prefixed `bondata/{customer}/*`. | | ECR (pull-through) | Authorization and image pull on the BonData registry. | | IAM | Create role, attach policy, pass role, only for roles prefixed `bondata-` (used for IRSA service accounts). No user creation. | | CloudWatch Logs | Create log group, put log events on `bondata/*` log groups. | | Route 53 | Manage records on the private zone created by Terraform. The public zone (`{customer}.app.bondata.ai`) is managed on BonData's Cloudflare. | The exact JSON is published with the Terraform module so customers can review it line by line. Disabling the trust policy or detaching the role's permissions is a one-line IAM change on the customer's side; the deployment continues to run, but BonData loses the ability to operate it until the role is restored. ## Network and connectivity **Ingress.** Public access is via Cloudflare on `{customer}.app.bondata.ai`. The Cloudflare Tunnel controller runs in the cluster and dials outbound to Cloudflare; the customer's AWS account does not need to accept inbound from the public internet. An ALB-fronted ingress is available where customer policy requires it. **Egress.** All outbound traffic exits via the VPC NAT gateway. The destinations BonData calls, Anthropic, OpenAI, Google, e2b, and the integration endpoints the customer has activated, must be reachable from the customer's egress. **Connectivity to the customer's data sources.** The BonData deployment runs in the customer's AWS account and reaches the customer's databases, warehouses, and SaaS through whichever path the customer prefers: same-VPC (default), VPC peering, or site-to-site VPN. ## Encryption | Layer | Default | Customer-managed key option | | -------------------------------------------------------- | --------------------------------------- | --------------------------------------------- | | RDS PostgreSQL at rest | AWS KMS (AWS-managed) | Customer KMS key, configurable per engagement | | S3 buckets | SSE-S3; SSE-KMS for sensitive buckets | Customer KMS key, configurable per engagement | | EBS volumes | AWS KMS (AWS-managed) | Customer KMS key, configurable per engagement | | Application-layer (integration credentials, auth tokens) | App-managed keys in AWS Secrets Manager | Customer-KMS-wrapped Secrets Manager | | In transit | TLS 1.2+ at every hop | n/a | ## Operator access and audit All BonData operator access is **outbound** from BonData's network to the customer's AWS API. No inbound rules are added to the customer's account. Operator access is SSO-gated; AssumeRole credentials are session-bound and short-lived; every action is recorded in the customer's CloudTrail under the operator's session name. EKS audit logs and application logs are written to the customer's CloudWatch in the customer's account. Customers can additionally forward application logs to their own SIEM (Splunk, Datadog, Panther, and similar). ## Provisioning lifecycle 1. **Kickoff.** Customer provides an AWS account ID and chosen region. BonData provides the Terraform module and the `BonDataOperator` IAM role definition. 2. **IAM role creation.** Customer creates the role via CloudFormation or Terraform. Trust policy permits the BonData deploy account; permissions are scoped to the action list above. 3. **Terraform apply.** BonData runs Terraform via the role: VPC, EKS, node groups, RDS, Amazon MQ, S3, KMS, IRSA service accounts, Route 53 private zone, AWS Secrets Manager entries. 4. **Helm install.** BonData runs the umbrella Helm chart pinned to a known version. External Secrets Operator pulls credentials from AWS Secrets Manager into Kubernetes secrets. 5. **Cloudflare hook-up.** BonData adds the `{customer}.app.bondata.ai` record on the BonData Cloudflare zone and configures the Cloudflare Tunnel ingress in the customer's cluster. 6. **Identity onboarding.** A dedicated Descope project for the customer is provisioned. SSO is configured to the customer's IdP. First admin user is invited. 7. **Cutover.** Customer begins using the deployment. BonData operates and monitors. Total elapsed time from kickoff to live deployment depends on the customer's internal security, IAM, and procurement review cycles and is scoped jointly during onboarding. Contact us to kick off the engagement. We'll walk through the AWS account requirements, IAM trust policy, and Terraform module with your security and platform teams, and agree a target onboarding schedule. ## Backups, disaster recovery, and upgrades * **Backups.** RDS automated backups with point-in-time recovery, inside the customer's account. S3 versioning enabled on internal storage. Iceberg snapshots provide time-travel on the data lake. * **Disaster recovery.** Multi-AZ within the chosen region by default. Cross-region DR is scoped per engagement. * **Upgrades.** New BonData versions are applied via Helm by BonData against the customer's cluster, on a schedule agreed with the customer. Rolling updates; zero downtime for the API tier. # Cloud SaaS Source: https://docs.bondata.ai/platform/deployment-scenarios/cloud-saas Multi-tenant deployment operated entirely by BonData. **Cloud SaaS** is BonData's multi-tenant deployment model, intended for **proofs of concept and customers on lower-tier packages**. A single multi-tenant environment, operated entirely by BonData, serves these customers; tenants are isolated logically at the application layer and share the same managed AWS services in BonData's AWS account. Enterprise customers and any customer with regulatory, contractual, or sovereignty requirements should use [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws) instead - same software, single-tenant, running inside an AWS account the customer owns. Cloud SaaS removes operational burden for the customers it targets: no AWS account to provision, no networking to configure, no upgrade cycle to schedule, and the same release cadence and operational telemetry that BonData uses internally. ## Region and environment Cloud SaaS is hosted on AWS in a dedicated production account with its own VPC, EKS cluster, RDS instance, message broker, and secret store. The **United States** is the default region; **EU** hosting is available on customer request. ## Tenancy and isolation Tenant isolation is enforced at the application layer on every request, in three places: * **Database queries** against the operational database and the data lake are filtered by tenant. A query that does not carry a tenant identifier is rejected at the API boundary. * **Object-storage keys** in the internal S3 bucket are namespaced by tenant. Cross-tenant key access is not possible because the API never issues a key for a tenant other than the caller's. * **Integration credentials** are stored per-tenant. A workflow runs as a specific user in a specific tenant, and the credentials used for any integration call are resolved from that tenant's credential set. In addition, the user-facing application and the management application run as separate Kubernetes Deployments behind separate Descope projects. A user with administrative permissions inside a tenant cannot reach the platform-management surface. ## Encryption | Layer | Cloud SaaS | | -------------------------------------------------------- | ------------------------------------------------------- | | RDS PostgreSQL at rest | AWS KMS (AWS-managed key) | | S3 buckets | SSE-S3; SSE-KMS (AWS-managed key) for sensitive buckets | | EBS volumes | AWS KMS (AWS-managed key) | | Application-layer (integration credentials, auth tokens) | App-managed keys stored in AWS Secrets Manager | | In transit | TLS 1.2+ at every hop | **Customer-managed encryption keys (BYOK) are not available in Cloud SaaS.** Customers who require BYOK should choose [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws#encryption), which supports customer-managed AWS KMS keys for RDS, S3, EBS, and application-layer encryption. ## Public surface | Hostname | Purpose | | -------------------- | ------------------------------------------------- | | `app.bondata.ai` | Main user webapp | | `outputs.bondata.ai` | Published outputs (CloudFront-fronted, S3-backed) | All public surface is fronted by **Cloudflare** (DNS, TLS, WAF, DDoS protection). Cloudflare terminates TLS and forwards to an AWS Application Load Balancer inside the cluster's VPC. Published outputs at `outputs.bondata.ai` are served through Amazon CloudFront. Both Cloudflare and CloudFront operate as global edge networks; customers with strict regional-residency requirements for ingress termination or published-output delivery should choose [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws#network-and-connectivity), which supports an ALB-only ingress mode inside the customer's VPC. ## Operational ownership | Area | Owner | | ------------------------------------ | ---------------------------------------------------------------------- | | AWS account, VPC, EKS, RDS, MQ, S3 | BonData | | OS and node patching | BonData (EKS-managed node groups) | | Application code and releases | BonData (Helm-driven deploys, see [Upgrade cadence](#upgrade-cadence)) | | Database backups and PITR | BonData | | Secret rotation | BonData | | Monitoring, alerting, on-call | BonData | | Customer user accounts and roles | Customer | | Customer SSO configuration | Shared, customer provides IdP, BonData configures Descope | | Integration credential authorization | Customer (authorizes OAuth scopes / provides credentials) | ## Operator access BonData operator access to the Cloud SaaS environment is **SSO-gated** through BonData's internal identity provider, uses **short-lived AssumeRole credentials** with session-bound names, and is **outbound-only** from BonData's network - no inbound access from the public internet to operator tooling. All operator activity is recorded in BonData's internal CloudTrail and SSO logs. **Tenant-scoped operator-access extracts are available on request as part of enterprise-tier SaaS contracts**, via `security@bondata.ai`, within the SLA defined in the contract. Customers requiring continuous, customer-visible CloudTrail logging of every operator action should use [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws#operator-access-and-audit), where every BonData action is recorded in the customer's own CloudTrail in real time. ## AI and embedding providers LLM calls and embedding generation in Cloud SaaS use the same default AI providers documented on the [Application architecture](/platform/application-architecture#ai-providers) page. Customers requiring an embedding option that keeps the call inside their own AWS account (AWS Bedrock Titan) should choose [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws). ## Backups and disaster recovery * **Backups.** RDS automated backups with point-in-time recovery. S3 versioning enabled on internal buckets. Iceberg snapshots provide time-travel on the data lake. * **Disaster recovery.** Multi-AZ within the deployment region by default; cross-region DR is available on request. * **RPO and RTO.** Specific recovery-point and recovery-time objectives are documented in the engagement contract for enterprise-tier SaaS customers. ## Upgrade cadence Every change to production goes through the same release pipeline: a passing CI suite (unit, integration, and tenancy-isolation tests), peer-reviewed pull-request approval, and manual dispatch by an authorized release operator. Deploys are rolling updates only, no in-place upgrades; the API tier runs with multiple replicas across availability zones so customer requests are not interrupted during a deploy. Helm rollback to the previous chart revision is available if a regression surfaces post-deploy. Sentry releases are created on every production deploy for error-to-commit traceability. ## When to choose a single-tenant model instead Choose [Dedicated Cloud](/platform/deployment-scenarios/dedicated-cloud) if you need single-tenant isolation with no shared services and a choice of region, but want BonData to continue owning and operating the AWS account. Same software, dedicated environment, fully managed. Choose [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws) if you have a regulatory, contractual, or sovereignty requirement to keep customer data inside an AWS account you own, or you require customer-managed encryption keys (BYOK). Same software, single-tenant, runs inside an AWS account you own. # Dedicated Cloud Source: https://docs.bondata.ai/platform/deployment-scenarios/dedicated-cloud Single-tenant BonData environment in a dedicated, BonData-operated AWS account. **Dedicated Cloud** is BonData's single-tenant deployment model for enterprise customers who need a fully isolated environment and a choice of region, but do not want to own or operate the underlying AWS account themselves. The environment is single-tenant and dedicated to one customer, hosted in a separate AWS account that BonData owns, operates, and bills - there are no other tenants in the environment and no shared services. It sits between the two other models: more isolated than [Cloud SaaS](/platform/deployment-scenarios/cloud-saas), which is multi-tenant and shares infrastructure; lighter to adopt than [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws), which runs inside the customer's own AWS account and requires the customer to provision IAM, networking, and quotas. The software is functionally identical across all three - same APIs, same runners, same data layer, same AI surface. Customers who require their data and compute to remain inside an account **they** own, or who require customer-managed encryption keys (BYOK), should choose [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws) instead. ## Region and environment Each Dedicated Cloud customer gets a separate AWS account with its own VPC, EKS cluster, RDS instance, Amazon MQ broker, S3 buckets, and secret store. Nothing is shared with any other customer. Unlike Cloud SaaS, which defaults to the United States, **the customer chooses the region** at deployment time, so data residency requirements (EU, and other regions on request) are met by where the environment is provisioned. Regions BonData validates by default: **US East (Virginia)**, **US West (Oregon)**, and **EU West (Ireland)**; other regions, including EU Central (Frankfurt), are available on request. ## Tenancy and isolation The environment is **single-tenant by construction**: there is exactly one tenant in the account, and isolation comes from the account and VPC boundary rather than only from application-layer filtering. * The operational database, data lake, object storage, and message broker are dedicated to the one customer. No data path crosses into another customer's environment because no other customer exists in the account. * The user-facing application and the management application still run as separate Kubernetes Deployments behind separate Descope projects, so a user with administrative permissions inside the tenant cannot reach the platform-management surface. ## Encryption | Layer | Dedicated Cloud | | -------------------------------------------------------- | ------------------------------------------------------- | | RDS PostgreSQL at rest | AWS KMS (AWS-managed key) | | S3 buckets | SSE-S3; SSE-KMS (AWS-managed key) for sensitive buckets | | EBS volumes | AWS KMS (AWS-managed key) | | Application-layer (integration credentials, auth tokens) | App-managed keys stored in AWS Secrets Manager | | In transit | TLS 1.2+ at every hop | **Customer-managed encryption keys (BYOK) are not available in Dedicated Cloud**, because the AWS account is owned by BonData. Customers who require BYOK should choose [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws#encryption), which supports customer-managed AWS KMS keys for RDS, S3, EBS, and application-layer encryption inside the customer's own account. ## Public surface | Hostname | Purpose | | --------------------------- | ------------------------------------------------------------------- | | `{customer}.app.bondata.ai` | Main user webapp | | Published outputs | CloudFront-fronted, S3-backed, scoped to the customer's environment | Public access is fronted by **Cloudflare** (DNS, TLS, WAF, DDoS protection) on a dedicated `{customer}.app.bondata.ai` subdomain; the customer does not configure DNS. An ALB-fronted ingress is available where customer policy requires it. ## Operational ownership | Area | Owner | | ------------------------------------ | --------------------------------------------------------- | | AWS account, VPC, EKS, RDS, MQ, S3 | BonData (dedicated account) | | OS and node patching | BonData (EKS-managed node groups) | | Application code and releases | BonData (Helm-driven deploys) | | Database backups and PITR | BonData | | Secret rotation | BonData | | Monitoring, alerting, on-call | BonData | | AWS bill | BonData (included in subscription) | | Customer user accounts and roles | Customer | | Customer SSO configuration | Shared, customer provides IdP, BonData configures Descope | | Integration credential authorization | Customer (authorizes OAuth scopes / provides credentials) | ## Operator access and audit BonData operator access is **SSO-gated** through BonData's internal identity provider, uses **short-lived AssumeRole credentials** with session-bound names, and is **outbound-only** - no inbound access from the public internet to operator tooling. Because the environment is dedicated, every operator action against it is recorded in a **CloudTrail dedicated to that environment**, and BonData provisions a **dedicated Descope project** and SSO configuration to the customer's IdP. Audit extracts for the environment are available to the customer, and application logs can be forwarded to the customer's own SIEM (Splunk, Datadog, Panther, and similar). Customers who require continuous, customer-**owned** CloudTrail of every operator action in an account they control should use [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws#operator-access-and-audit). ## AI and embedding providers LLM calls and embedding generation use the same default AI providers documented on the [Application architecture](/platform/application-architecture#ai-providers) page. The AWS Bedrock Titan embedding option, which keeps the embedding call inside the deployment's AWS region, is available on [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws). ## Backups and disaster recovery * **Backups.** RDS automated backups with point-in-time recovery. S3 versioning enabled on internal buckets. Iceberg snapshots provide time-travel on the data lake. * **Disaster recovery.** Multi-AZ within the chosen region by default; cross-region DR is available on request. * **RPO and RTO.** Specific recovery-point and recovery-time objectives are documented in the engagement contract. ## Upgrade cadence Every change goes through the same release pipeline as the rest of the platform: a passing CI suite (unit, integration, and tenancy-isolation tests), peer-reviewed pull-request approval, and manual dispatch by an authorized release operator. Deploys are rolling updates; the API tier runs with multiple replicas across availability zones so customer requests are not interrupted during a deploy. Because the environment is dedicated, the upgrade window can be scheduled with the customer where contractually required. Helm rollback to the previous chart revision is available if a regression surfaces post-deploy. ## When to choose a different model * Choose [Cloud SaaS](/platform/deployment-scenarios/cloud-saas) if you are running a proof of concept or are on a lower-tier package and do not need single-tenant isolation or region choice. * Choose [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws) if you need the environment to run inside an AWS account **you** own, require customer-managed encryption keys (BYOK), or require continuous CloudTrail logging in your own account. Contact us to scope your dedicated environment. We'll confirm the region, isolation, and audit requirements with your security team and agree an onboarding schedule. # Deployment scenarios Source: https://docs.bondata.ai/platform/deployment-scenarios/overview How BonData's components are arranged for each supported deployment model. BonData runs the same software in every deployment, but the way the components are arranged, what's multi-tenant versus dedicated, whose AWS account they live in, how the public surface is exposed, depends on the operational context the customer needs. The following scenarios are supported. ### [Cloud SaaS](/platform/deployment-scenarios/cloud-saas) Multi-tenant deployment operated entirely by BonData. **Intended for proofs of concept and customers on lower-tier packages** - tenants are isolated logically and share the same infrastructure in BonData's AWS account in the United States. Public surface: `app.bondata.ai`. ### [Dedicated Cloud](/platform/deployment-scenarios/dedicated-cloud) **Single-tenant, fully managed, for enterprise customers.** A dedicated environment with no other tenants and no shared services, hosted in a separate AWS account that BonData owns and operates. The customer chooses the region but does not provision or operate AWS. Public surface: `{customer}.app.bondata.ai`, fronted by BonData's Cloudflare. ### [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws) **Single-tenant, inside the customer's own AWS account.** BonData provisions and operates the stack via an IAM role the customer creates and can revoke at any time. The customer's data never leaves their account, except for HTTPS calls to AI model providers. Supports customer-managed encryption keys (BYOK) and customer-owned CloudTrail. Public surface: `{customer}.app.bondata.ai`, fronted by BonData's Cloudflare. ## At a glance | | Cloud SaaS | Dedicated Cloud | Cloud-Prem on AWS | | ------------------- | ----------------------------- | ------------------------------------------ | ------------------------------------------- | | Tenancy | Multi-tenant | Single-tenant, dedicated | Single-tenant, dedicated | | AWS account | BonData (shared) | BonData (dedicated per customer) | Customer's own | | Region | US default, EU on request | Customer's choice | Customer's choice | | Operated by | BonData | BonData | BonData (via customer IAM role) | | AWS bill | Included in subscription | Included in subscription | Direct to customer | | BYOK (customer KMS) | No | No | Yes | | Operator audit | Internal; extracts on request | Dedicated CloudTrail; extracts to customer | Customer-owned CloudTrail, real time | | Best for | POCs, lower-tier packages | Enterprise needing isolation + residency | Customer-owned cloud, strictest sovereignty | *** The component-level description that both scenarios share lives on the [Application architecture](/platform/application-architecture) page. The EKS cluster, networking, storage, and IAM that BonData provisions inside a customer's AWS account for Cloud-Prem is documented in the [Amazon EKS reference architecture](/platform/deployment-scenarios/amazon-eks). Contact us to scope the right deployment for your enterprise. We'll recommend the path that fits your security, residency, and compliance requirements, and walk through the engagement together. # Privacy Policy Source: https://docs.bondata.ai/platform/privacy-policy How BonData collects, uses, stores, and shares personal information. *Last Updated: January 13, 2026* In order to ensure transparency and give you more control over your personal information, this privacy policy ("Privacy Policy") governs how we, BONDATA LTD ("BonData", "we", "our" or "us") use, collect and store personal information that we collect or receive from or about you ("you") in connection with [https://www.bondata.ai/](https://www.bondata.ai/) (the "Website") and the services we provide (the "Services"). We greatly respect your privacy, which is why we make every effort to provide a platform that would live up to the highest user privacy standards. Please read this Privacy Policy carefully, so you can fully understand our practices in relation to personal data. Important note: Nothing in this Privacy Policy is intended to limit in any way your statutory rights, including your rights to a remedy or other means of enforcement. **Table of contents:** 1. What personal information we collect, why we collect it, and how it is used 2. How we protect and retain your personal information 3. How we share your personal information 4. Your privacy rights 5. International transfers of personal information 6. Use by children 7. Interaction with third party products 8. Analytic tools / Cookies / Third Party Tools 9. Contact us This Privacy Policy can be updated from time to time and, therefore, we ask you to check back periodically for the latest version of this Privacy Policy. If we implement material changes in the way we use your information, in a manner that is different from that stated at the time of collection, we will notify you by posting a notice on our Website or by other means and take any additional steps as required by applicable law. ## 1. What personal information we collect, why we collect it, and how it is used ### (i) We process the following personal information a. **Information provided through the Services.** We collect personal information that you voluntarily provide, such as your full name and email address, as well as any other information that you decide to provide us. In addition, we collect other information as instructed by our customers, which may include personal information such as your full name. We also collect the contact and billing information of our customers. b. **Information provided through the Website.** When you use the Website and contact us, we collect and process full name, email address, and any other information that you decide to provide us. c. **Information automatically collected.** We automatically collect certain information through your use of BonData's Services and Website, such as cookies and similar identifiers ("Technologies"), such as your Internet protocol (IP) address, and other device identifiers that are automatically assigned to your device, browser type and language, hardware type, operating system, internet service provider and other information about actions taken through the use of the Services and Website. d. **Information provided through third-party authentication provider.** BonData may obtain information from third-party authentication providers ("Third Parties"). Such Third Parties are mentioned in Section 8 of this Privacy Policy, and is subject to such Third Party's privacy policies. e. **Information we collect from online interactions.** For example, if you contact us via social media or otherwise interact with our business, including as a representative of a current / prospective customer, supplier, or partner, we track and make a record of those interactions, which may contain your contact details, such as full name, email address, messages and any other information that you decide to provide us with. ### (ii) We process information for the following purposes a. **To provide you and our customers with the Services.** We will use the information, including, without limitation, for the following purposes: (i) allow you to create an account (sign-up), authenticate you and allow you to log-in; (ii) to provide you and our customers the Services and to process your requests; (iii) communicate with you about your use of the Services and for support purposes; (iv) fulfill any instruction and/or request made by you or by our customers in the context of the Services; (v) send you emails and notifications regarding your account or certain features of the Services; (vi) to personalize your experience with our Services; (vii) to allow you to create more users and administrate your users; and (viii) to generally administer and improve the Services. b. **To allow you to make use of our Website.** We will use your information to allow you to make use of our Website, including, (i) to answer your questions and to allow you to communicate with us (e.g., by pressing a button in the website and being redirected to email us); (ii) to allow you to create an account and log-in; (iii) to analyze your use of our Website and to improve our Website; and (iv) to customize your experience. c. **For Administrative Purposes.** BonData use your information (i) to respond to your questions, comments, and other requests for customer support, or information, including information about potential or future services; (ii) to provide you and our customers with the BonData Services; (iii) for internal quality control purposes; (iv) to establish a business relationship; and (v) to generally administer the BonData Services. d. **To Market our Website and Services.** BonData uses information to market the BonData Services. Such use includes (i) notifying you about offers and services that may be of interest to you; (ii) other purposes disclosed at the time you provide information; and (iii) as you otherwise consent. e. **Security purposes.** Some of the abovementioned information will be used for detecting, taking steps to prevent and prosecuting fraud or other illegal activity; to identify and repair errors; to conduct audits; and for security purposes. Information may also be used to comply with applicable laws, with investigations performed by the relevant authorities, law enforcement purposes, and/or to exercise or defend legal claims. f. **De-identified and Aggregated Information Use.** In certain cases, we may or will anonymize or de-identify your Information and further use it for internal and external purposes, including, without limitation, to analyze and improve BonData services (including through the use of artificial intelligence) and for research purposes. We will use this anonymous or de-identified information and/or disclose it to third parties without restrictions (for example, in order to improve our services and enhance your experience with them and/or to develop new product features and improve existing offerings). g. **Cookies and Similar Technologies.** We, as well as third parties that provide content, or other functionality on the BonData Website and Services, use Technologies to automatically collect information through the Website and Services. We use Technologies that are essentially small data files placed on your device that allow us to record certain pieces of information whenever you visit or interact with the Website and Services. If you would like to opt out of the Technologies we employ on the Website and Services, you may do so by blocking, deleting, or disabling them as your browser or device permits. ### (iii) The lawful bases we rely on for processing personal information are (if and when applicable) a. The data subject has given consent to the processing of his or her personal data; b. Processing is necessary for the performance of a contract to which the data subject is party or in order to take steps at the request of the data subject prior to entering into a contract; c. Processing is necessary for compliance with a legal obligation to which the controller is subject; and/or d. Processing is necessary for the purposes of the legitimate interest. ## 2. How we protect and retain your personal information **2.1. Security.** We have implemented and maintain reasonable technical, organizational and security measures designed to protect your information. However, please note that we cannot guarantee that the information will not be compromised as a result of unauthorized penetration to our servers. As the security of information depends in part on the security of the computer, device or network you use to communicate with us and the security you use to protect your user IDs and passwords, please make sure to take appropriate measures to protect this information. **2.2. Retention of your information.** Your information will be stored until we delete our records, and we proactively delete it, or if you send a valid deletion request. Please note that in some circumstances we store your information for longer periods of time, for example (i) where we are required to do so in accordance with legal, regulatory, tax or accounting requirements, or (ii) for us to have an accurate record of your dealings with us in the event of any complaints or challenges, and/or (iii) if we reasonably believe there is a prospect of litigation relating to your information or dealings. ## 3. How we share your personal information We share your information as follows: **3.1.** The information BonData gathers is shared with our partners and other third parties. **3.2.** We may also share information with our affiliated companies about you. **3.3.** We use third party service providers to process your information for the purposes outlined above, including, without limitation: * 3.3.1. With cloud service providers for hosting purposes (e.g., Google Cloud Platform); * 3.3.2. With service providers to facilitate your log-in into our Services (e.g., Descope Inc.); * 3.3.3. With websites and web content creation platforms in order to help us manage our Website (e.g., Wix.com); * 3.3.4. With email providers, marketing, CRM, other similar tool providers; * 3.3.5. With analytic companies, in order to help us understand and analyze information we collect in accordance with this policy. **3.4.** To the extent necessary, with regulators, courts, banks or competent authorities, to comply with applicable laws, regulations and rules (including, without limitation, federal, state or local laws), and requests of law enforcement, regulatory and other governmental agencies or if required to do so by court order, as well as for internal compliance procedures and to protect the safety, security, and integrity of BonData, our Services, customers, employees, property, and the public. **3.5.** If, in the future, we sell or transfer, or we consider selling or transferring, some or all of our business, shares or assets to a third party, we will disclose your information to such third party (whether actual or potential) in connection with the foregoing events (including, without limitation, our current or potential investors). In the event that we are acquired by, or merged with, a third party entity, or in the event of bankruptcy or a comparable event, we reserve the right to transfer, disclose or assign your information in connection with the foregoing events. **3.6.** Where you have otherwise provided your consent to us for sharing or transferring your information. ## 4. Your privacy rights **4.1.** The following rights (which may be subject to certain exemptions or derogations) shall apply to certain individuals (some of which only apply to individuals protected by specific laws): * 4.1.1. You have the right to withdraw consent to the processing, where consent is the basis of processing. * 4.1.2. You have the right to access the personal information that we hold and request further details about how we process it, under certain conditions. * 4.1.3. You have the right to demand rectification of inaccurate personal information about you. We will promptly correct any information found to be incorrect. * 4.1.4. You have the right to object to unlawful data processing under certain conditions. * 4.1.5. You have the right to the erasure of past data about you (your "right to be forgotten") under certain conditions. * 4.1.6. You have the right to demand that we restrict the processing of your personal information, under certain conditions, if you believe we have exceeded the legitimate basis for processing, the processing is no longer necessary, or if you believe your personal information is inaccurate. * 4.1.7. You have the right to data portability of personal information concerning you that you provided us in a structured, commonly used, and machine-readable format, subject to certain conditions. * 4.1.8. The personal information we collect is not used for automated decision-making and profiling, except for automated processes in the context of marketing. As stated above, you can opt out of direct marketing by BonData by contacting BonData directly or by following the instructions through the unsubscribe options in our email messages. **4.2.** You can exercise your rights by contacting us at `privacy@bondata.ai`. You may use an authorized agent to submit a request on your behalf if you provide the authorized agent written permission signed by you. To protect your privacy, we may take steps to verify your identity before fulfilling your request. Subject to legal and other permissible considerations, we will make every reasonable effort to honor your request promptly in accordance with applicable law or inform you if we require further information in order to fulfill your request. When processing your request, we may ask you for additional information to confirm or verify your identity and for security purposes, before processing and/or honoring your request. We reserve the right to charge a fee where permitted by law, for instance if your request is manifestly unfounded or excessive. In the event that your request would adversely affect the rights and freedoms of others (for example, would impact the duty of confidentiality we owe to others) or if we are legally entitled to deal with your request in a different way than initial requested, we will address your request to the maximum extent possible, all in accordance with applicable law. **4.3. Deleting your account.** Should you ever decide to delete your account, you may do so by emailing `privacy@bondata.ai`. If you terminate your account, any association between your account and personal data we store will no longer be accessible through your account. **4.4. Marketing emails - opt-out.** You may choose not to receive marketing email of this type by sending a single email with the subject "BLOCK" to `privacy@bondata.ai`. Please note that the email must come from the email account you wish to block OR if you receive an unwanted email from us, you can use the unsubscribe link found at the bottom of the email to opt out of receiving future emails, and we will process your request within a reasonable time after receipt. ## 5. International transfers of personal information **5.1.** We store the personal data with the following storing companies: Amazon Web Services (AWS). **5.2.** In order to run our business and provide our Website and Services to you, we transfer personal data to certain countries around the world, including to our affiliates and service providers, many of whom are located outside of your jurisdiction. Therefore, your personal data may be processed in countries with privacy laws that are different from privacy laws in your country. Whenever we make such transfers, we will use commercially reasonable efforts to implement an appropriate level of protection to your personal data by implementing at least one of the following safeguards: * 5.2.1. Making sure the destination country has been deemed to provide an adequate level of protection for personal data; and/or * 5.2.2. By executing and implementing onward transfer instruments such as data processing and protection agreements. ## 6. Use by children We do not offer our products or services for use by children and, therefore, we do not knowingly collect information from, and/or about children under the age of 18. If you are under the age of 18, do not provide any information to us without the involvement of a parent or a guardian. In the event that we become aware that you provide information in violation of applicable privacy laws, we reserve the right to delete it. If you believe that we might have any such information, please contact us at `privacy@bondata.ai`. ## 7. Interaction with third party products We enable you to interact with third party websites, mobile software applications and products or services that are not owned, or controlled, by us (each, a "Third Party Service"). We are not responsible for the privacy practices or the content of such Third Party Services. Please be aware that Third Party Services can collect information from you. Accordingly, we encourage you to read the terms and conditions and privacy policies of each Third Party Service. ## 8. Analytic tools / Cookies / Third Party Tools **8.1. Google API.** Our Website and Services uses Google API in order to facilitate features within our Services. For further details please see the Google API terms of service at [https://developers.google.com/terms](https://developers.google.com/terms) and the Google privacy policy at [https://policies.google.com/privacy](https://policies.google.com/privacy). **8.2. Microsoft API.** Our Website and Services uses Microsoft Graph API in order to facilitate features within our Services. For further details please see the Microsoft Graph API terms of use at [https://learn.microsoft.com/en-us/legal/microsoft-apis/terms-of-use](https://learn.microsoft.com/en-us/legal/microsoft-apis/terms-of-use), and Microsoft's privacy policy at [https://privacy.microsoft.com/en-us/privacystatement](https://privacy.microsoft.com/en-us/privacystatement). **8.3. Descope.** Our Website and Services use Descope Inc. in order to authenticate you when you sign-up or log-in. For further details please see the Descope terms of use at [https://www.descope.com/terms](https://www.descope.com/terms), and Descope's privacy policy at [https://www.descope.com/privacy](https://www.descope.com/privacy). **8.4.** We reserve the right to remove or add new analytic tools, cookies, pixels and other tracking technologies. When you visit or log in to our website, cookies and similar technologies may be used by our online data partners or vendors to associate these activities with other personal information they or others have about you, including by association with your email. We (or service providers on our behalf) may then send communications and marketing to these email. ## 9. Contact us If you have any questions, concerns or complaints regarding our compliance with this notice and the data protection laws, or if you wish to exercise your rights, we encourage you to first contact us at `privacy@bondata.ai`. # Secrets management Source: https://docs.bondata.ai/platform/secrets-management How BonData stores credentials, encryption keys, and customer integration secrets. BonData handles credentials in a way that minimizes plaintext exposure and removes long-lived credentials from any place they could be exfiltrated. All sensitive material, database credentials, message-broker credentials, model-provider API keys, application-layer encryption keys, and customer-supplied integration credentials, is stored in a managed secrets vault encrypted at rest, with access scoped to the specific service that needs it. ## Where secrets live In Cloud SaaS, BonData stores all platform secrets in **AWS Secrets Manager**, encrypted at rest with AWS KMS. In Cloud-Prem, the same model applies inside the customer's own AWS account, secrets live in the customer's AWS Secrets Manager, under the customer's KMS keys, accessible only to the BonData services deployed in the customer's account. Each secret has its own version history. Rotation is managed per secret; rotation events are picked up by the running services without restart. ## Customer integration credentials When a user connects an integration, Salesforce, Snowflake, HubSpot, and so on, the OAuth tokens or API keys provided during connection are encrypted at the application layer using a key drawn from the secrets vault, then stored in the operational database. Cleartext credentials exist only inside the running process that performs the integration call, and only for the duration of that call. Each integration credential is scoped to a single tenant. Credentials are never shared across tenants and are not accessible to any service other than the one performing the integration call. Users with the appropriate role can rotate or revoke an integration credential through the user interface at any time; revocation takes effect on the next call. ## CI/CD BonData's build and release pipeline authenticates to AWS via **OpenID Connect federation** into a scoped IAM role, rather than a long-lived access key. No durable AWS credentials exist in CI, in source control, or in the codebase. # Terms of Use Source: https://docs.bondata.ai/platform/terms-of-use The contract that governs use of the BonData site and services. *Last updated: January 13, 2026* Welcome to **[www.bondata.ai](http://www.bondata.ai)** (together with its subdomains, Content, Marks and services, each as defined below, the "Site"). Please read the following Terms of Use (the "Agreement") carefully before using this Site so that you are aware of your legal rights and obligations with respect to BONDATA LTD. ("BonData", "we", "our" or "us"). By accessing or using the Site, you expressly acknowledge and agree that you are entering a legal agreement with us and have understood and agree to comply with, and be legally bound by, this Agreement, together with the Privacy Policy which is hereby incorporated into this Agreement by reference (the date of such acceptance, the "Effective Date"). You hereby waive any applicable rights to require an original (non-electronic) signature or delivery or retention of non-electronic records, to the extent not prohibited under applicable law. If you do not agree to be bound by this Agreement please do not access or use the Site. ## 1. Modifications We reserve the right, at our discretion, to modify this Agreement at any time. Such modification will be effective ten (10) days following posting of the revised Agreement on the Site, and your continued use of the Site thereafter means that you accept those modifications. ## 2. Ability to Accept The Site is only intended for individuals aged eighteen (18) years or older. If you are under 18 years please do not visit or use the Site. ## 3. Site Access For such time as this Agreement is in effect, we hereby grant you a personal, limited, non-exclusive, non-assignable, non-sublicensable, revocable right to access and use the Site solely for your own personal and non-commercial use, and provided that you comply with this Agreement. Except for the foregoing right, we do not grant you any right or licenses to any of our or a third party's Intellectual Property Rights. ## 4. Restrictions As a condition to your right to access and use the Site, you shall not (and shall not permit or encourage any third party to) do any of the following: (a) copy or reproduce the Site; (b) sell, assign, lease, lend, rent, distribute, or make available the Site to any third party, or otherwise offer or use the Site in a time-sharing, outsourcing, or service bureau environment; (c) modify, alter, adapt, arrange, translate, decompile, disassemble, reverse engineer, decrypt, or otherwise attempt to discover the source code or non-literal aspects (such as the underlying ideas, algorithms, structure, sequence, organization, and interfaces) of, the Site; (d) remove, alter, or conceal, in whole or in part, any copyright, trademark, or other proprietary rights notice or legend displayed or contained on or in the Site; (e) circumvent, disable or otherwise interfere with security-related or technical features or protocols of the Site; (f) make a derivative work of the Site, or use the Site to develop any service or product that is the same as (or substantially similar to or competitive with) the Site; (g) publish or transmit any robot, virus, malware, Trojan horse, spyware, or similar malicious item intended (or that has the potential) to damage or disrupt the Site; (i) take any action that imposes or may impose (at our sole discretion) an unreasonable or disproportionately large load on the Site infrastructure, or otherwise interfere (or attempt to interfere) with the integrity or proper working of the Site; and/or (j) use the Site to infringe, misappropriate or violate any third party's Intellectual Property Rights (as defined below), or any law. ## 5. Linking We permit you to link to the Site provided that: (i) you link to (but do not replicate) any page on this Site; (ii) the hyperlink text shall accurately describe the Content as it appears on the Site; (iii) you shall not misrepresent your relationship with BonData or present any false information about us, and shall not imply in any way that we are endorsing you or any services or products, unless we have given you our express prior consent to do so; (iv) you shall not link from a website which prohibits linking to third parties; (v) the website from which you link to the Site does not contain content that (a) is offensive or controversial (both at our discretion), or (b) infringes any Intellectual Property Rights; and/or (vi) you, and your website, comply with this Agreement and applicable law. ## 6. Intellectual Property Rights **Content and Marks.** The (i) content and information on the Site, including without limitation, the text, documents, articles, brochures, descriptions, products, software, graphics, photos, sounds, videos, links, interactive features, and services (collectively, the "Materials"), (ii) the trademarks, service marks, trade names, service names, trade dress, symbols, brands, and logos contained therein ("Marks"), are the property of BonData and/or its licensors and may be protected by Intellectual Property Rights laws and treaties. "BonData", the BonData logo, and other marks are Marks of BonData or its affiliates. All other Marks used or appearing on the Site are the Marks of their respective owners. We reserve all rights not expressly granted in and to the Site. **Use of content.** Content on the Site is provided to you for your information and personal use only and may not be used, modified, copied, distributed, transmitted, broadcast, displayed, sold, licensed, de-compiled, or otherwise exploited for any other purposes whatsoever without our prior written consent. If you download or print a copy of the Content you must retain all copyright and other proprietary notices contained therein. In any event you wish to use, publish, copy, distribute, transmit, broadcast, display or otherwise exploit such Content, please be in touch with us in order to receive our written consent. **"Intellectual Property Rights"** means any and all rights, titles, and interests (under any jurisdiction or treaty, whether protectable or not, and whether registered or unregistered) in and to technology and other intellectual property (such as the Content), and includes without limitation patents, copyright and similar authorship rights, personal rights (such as moral rights, rights of privacy, and publicity rights), architectural, building and location (and similar geography-based) rights, mask work rights, trade secret and similar confidentiality rights, design rights, industrial property rights, trademark, trade name, trade dress and similar branding rights, as well as: (a) all applications, registrations, renewals, extensions, continuations, continuations-in-part, divisions or reissues of the foregoing rights; and (b) all goodwill associated with the foregoing rights. ## 7. Information Description We attempt to be as accurate as possible. However, we cannot and do not warrant that the Content available on the Site is accurate, complete, reliable, current, or error-free. We reserve the right to make changes in or to the Content, or any part thereof, in our sole judgment, without the requirement of giving any notice prior to or after making such changes to the Content. Your use of the Content, or any part thereof, is made solely at your own risk and responsibility. ## 8. Third Party Content The Site may present, or otherwise allow you to view, access, link to, and/or interact with, Content from third parties and other sources that are not owned or controlled by us (such Content, "Third Party Content"). The Site may also enable you to communicate with the related third parties. The display or communication to you of such Third Party Content does not (and shall not be construed to) in any way imply, suggest, or constitute any sponsorship, endorsement, or approval by us of such Third Party Content or third party, or by such third party of us, and nor any affiliation between us and such third party. We do not assume any responsibility or liability for Third Party Content, or any third party's terms of use, privacy policies, actions, omissions, or practices. Please read the terms of use and privacy policy of any third party that you interact with before you engage in any such activity. ## 9. Personal Information We will use any personal information that we may collect or obtain in connection with the Site in accordance with our [Privacy Policy](/platform/privacy-policy). You agree that we may use personal information that you provide or make available to us in accordance with the Privacy Policy. ## 10. Warranty Disclaimers This section applies whether or not the services provided under the Site are for payment. Applicable law may not allow the exclusion of certain warranties, so to that extent certain exclusions set forth herein may not apply. THE SITE (WHICH, FOR CLARITY, INCLUDES WITHOUT LIMITATION CONTENT AND MARKS) IS PROVIDED AND MADE AVAILABLE TO YOU ON AN "AS IS" AND "AS AVAILABLE" BASIS, WITH ALL FAULTS, AND WITHOUT ANY REPRESENTATION, WARRANTY, GUARANTEE OR CONDITION OF ANY KIND WHATSOEVER, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, SATISFACTORY QUALITY, QUIET POSSESSION, TITLE, QUALITY OF SERVICE, NON-INFRINGEMENT, OR THAT OTHERWISE ARISE FROM A COURSE OF PERFORMANCE OR DEALING, OR USAGE OF TRADE, ALL OF WHICH ARE HEREBY DISCLAIMED BY US AND OUR LICENSORS AND SUPPLIERS. YOU AGREE THAT WE WILL NOT BE HELD RESPONSIBLE OR LIABLE FOR ANY CONSEQUENCES TO YOU OR ANY THIRD PARTY THAT MAY RESULT FROM TECHNICAL PROBLEMS OF THE INTERNET, SLOW CONNECTIONS, TRAFFIC CONGESTION OR OVERLOAD OF OUR OR OTHER SERVERS. IN ADDITION, NEITHER BONDATA NOR ITS LICENSORS OR SUPPLIERS MAKE ANY REPRESENTATION, WARRANTY, GUARANTEE OR CONDITION: (A) REGARDING THE EFFECTIVENESS, USEFULNESS, RELIABILITY, AVAILABILITY, TIMELINESS, ACCURACY, OR COMPLETENESS OF THE SITE; (B) THAT YOUR USE OF, OR RELIANCE UPON, THE SITE WILL MEET YOUR REQUIREMENTS OR EXPECTATIONS; (C) THAT THE SITE WILL BE UNINTERRUPTED, SECURE, ERROR-FREE OR VIRUS-FREE, OR THAT DEFECTS IN THE SITE WILL BE CORRECTED; OR (D) REGARDING THE SATISFACTION OF, OR COMPLIANCE WITH, ANY GOVERNMENT REGULATIONS OR STANDARDS. EXCEPT AS EXPRESSLY STATED IN OUR PRIVACY POLICY, BONDATA DOES NOT MAKE ANY REPRESENTATIONS, WARRANTIES, GUARANTEES, OR CONDITIONS OF ANY KIND, EXPRESS, IMPLIED, OR STATUTORY AS TO THE SECURITY OF ANY INFORMATION YOU MAY PROVIDE OR ACTIVITIES YOU ENGAGE IN DURING THE COURSE OF YOUR USE OF THE SITE. ## 11. Limitation of Liability IN NO EVENT WILL BONDATA OR ITS LICENSORS OR SUPPLIERS BE LIABLE FOR: * ANY CONSEQUENTIAL, INDIRECT, SPECIAL, INCIDENTAL, OR PUNITIVE DAMAGES; * ANY LOSS OF PROFITS, LOSS OF BUSINESS, LOSS OF REVENUE, OR LOSS OF ANTICIPATED SAVINGS; * ANY LOSS OF, OR DAMAGE TO, DATA, REPUTATION, OR GOODWILL; AND/OR * THE COST OF PROCURING ANY SUBSTITUTE GOODS OR SERVICES. THE AGGREGATE LIABILITY OF BONDATA UNDER, OR OTHERWISE IN CONNECTION WITH, THIS AGREEMENT SHALL NOT EXCEED THE LOWER OF: (A) FIVE U.S. DOLLARS (US \$5), AND (B) THE AMOUNTS ACTUALLY PAID BY YOU (IF ANY) TO BONDATA DURING THE THREE (3) MONTHS IMMEDIATELY PRECEDING THE DATE ON WHICH YOU BRING YOUR CLAIM. THE FOREGOING EXCLUSIONS AND LIMITATIONS SHALL APPLY: (A) TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW; (B) EVEN IF BONDATA HAS BEEN ADVISED, OR SHOULD HAVE BEEN AWARE, OF THE POSSIBILITY OF LOSSES, DAMAGES, OR COSTS; (C) EVEN IF ANY REMEDY IN THIS AGREEMENT FAILS OF ITS ESSENTIAL PURPOSE; AND (D) REGARDLESS OF THE THEORY OR BASIS OF LIABILITY, INCLUDING WITHOUT LIMITATION NEGLIGENCE, MISREPRESENTATION, STRICT LIABILITY, OR OTHER CONTRACT OR TORT LIABILITY. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, or of other damages, and to the extent applicable to you, such exclusions and limitations shall not apply. Furthermore, nothing in this Agreement shall be deemed to exclude or limit liability for death or personal injury resulting from negligence, or for fraud or fraudulent misrepresentation. ## 12. Entire Agreement This Agreement represents the entire agreement between BonData and you with respect to the subject matter hereof, and supersedes and replaces any and all prior and contemporaneous oral and/or written agreements, understandings and statements between you and BonData with respect to such subject matter. You acknowledge and agree that in entering into this Agreement you have not relied on any statement or representation (whether negligently or innocently made) not expressly set out in this Agreement; for example, statements and explanations in any FAQs or other marketing material on the Site are for convenience only, and are not binding or a part of this Agreement. ## 13. Indemnification You agree to defend, indemnify and hold harmless BonData and our affiliates, and our respective officers, directors, employees and agents, from and against any and all claims, damages, obligations, losses, liabilities, costs and expenses (including but not limited to attorney's fees) arising from: (i) your use of, or inability to use, the Site; or (ii) breach of any provision of this Agreement. ## 14. Term and Termination This Agreement commences on the Effective Date and shall continue in full force and effect until terminated in accordance herewith (the "Term"). We reserve the right to immediately terminate this Agreement, or otherwise modify, suspend or discontinue your access to and use of the Site (or any part thereof), for any reason whatsoever, at any time, and without notice or obligation to you, and you agree that BonData shall have no liability to you or any third party for any such termination, modification, suspension, or discontinuance. You may terminate this Agreement at any time and for any reason. If you object to any term or condition of this Agreement or any subsequent changes thereto, or become dissatisfied with the Site in any way, your sole remedy is to terminate this Agreement and to immediately discontinue use of the Site. **Consequences of Termination and Survival.** Upon termination of this Agreement your right to access and use the Site will automatically terminate and be deemed revoked. Sections 8 (Intellectual Property Rights) through 23 (Entire Agreement) inclusive shall survive any termination of this Agreement. Termination shall not affect any rights and obligations accrued as of the effective date of termination. ## 15. Independent Contractors You and BonData are independent contractors. Nothing in these Terms creates a partnership, joint venture, agency, or employment relationship between you and BonData. You must not under any circumstances make, or undertake, any warranties, representations, commitments or obligations on behalf of BonData. ## 16. Assignment BonData may assign this Agreement (or any of its rights and/or obligations hereunder) without your consent, and without notice or obligation to you. This Agreement is personal to you, and you shall not assign (or in any other way transfer) this Agreement (or any of your obligations or rights hereunder) without BonData's express prior written consent. Any prohibited assignment shall be null and void. ## 17. Governing Law and Place of Jurisdiction This Agreement (including without limitation its validity and formation) shall be governed by, and construed in accordance with, the laws of the State of Israel, without regard to any conflicts of laws rules or principles. The United Nations Convention on Contracts for the International Sale of Goods and the Uniform Computer Information Transaction Act shall not apply to this Agreement and are hereby disclaimed. The competent courts of the city of Tel Aviv-Yaffo shall have the exclusive jurisdiction with respect to any dispute and action arising under or in relation to this Agreement. ## 18. Severability If any provision of this Agreement is held by a court of competent jurisdiction to be invalid, illegal, or unenforceable, then: (a) the remaining provisions of this Agreement shall remain in full force and effect; and (b) such affected provision shall be ineffective solely as to such jurisdiction (and only to the extent and for the duration of such invalidity, illegality, or unenforceability), and shall be substituted (in respect of such jurisdiction) with a valid, legal, and enforceable provision that most closely approximates the original legal intent and economic impact of such provision. ## 19. Cumulative Remedies Except as may be expressly stated otherwise in this Agreement, no right or remedy conferred upon or reserved by any party under this Agreement is intended to be, or shall be deemed, exclusive of any other right or remedy under this Agreement, at law or in equity, but shall be cumulative of such other rights and remedies. ## 20. Waiver No failure or delay on the part of any party in exercising any right or remedy under this Agreement shall operate as a waiver thereof, nor shall any single or partial exercise of any such right or remedy preclude any other or further exercise thereof or the exercise of any other right or remedy. Any waiver granted hereunder must be in writing (for waivers by you, emails will be acceptable; for waivers by BonData, the writing must be duly signed by an authorized representative of BonData), and shall be valid only in the specific instance in which given. # Trust Source: https://docs.bondata.ai/platform/trust Security, compliance, and data protection documentation for the BonData platform. BonData is built so the customers we serve, including those in regulated industries, can adopt the platform without compromising on security, privacy, or data residency. This page summarizes the frameworks BonData operates against, the third parties that process data on our behalf, and the policy documents that govern the relationship. Enterprise and regulated-industry customers deploy single-tenant: [Dedicated Cloud](/platform/deployment-scenarios/dedicated-cloud), a dedicated environment that BonData operates, or [Cloud-Prem on AWS](/platform/deployment-scenarios/cloud-prem-aws), which runs inside the customer's own AWS account. [Cloud SaaS](/platform/deployment-scenarios/cloud-saas) is intended for proofs of concept and lower-tier packages. For the controls behind each framework, see [Compliance](/platform/compliance). For how data flows through the platform, see [Application architecture](/platform/application-architecture). ## Compliance Certified. Audited controls for security, availability, and confidentiality. Report available under NDA via `security@bondata.ai`. Certified. Certificate available under NDA via `security@bondata.ai`. EU General Data Protection Regulation. DPA with EU Standard Contractual Clauses available. ## Subprocessors BonData uses the following subprocessors to deliver the platform. Each is bound by a written data-processing agreement and is engaged only for the purpose described. | | Subprocessor | Purpose | Location | | --------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | | Amazon Web Services (AWS) | Cloud infrastructure: EKS, RDS, S3, Amazon MQ, Secrets Manager, KMS, CloudFront, Athena, Glue, Redshift, CloudWatch | United States (EU on request) | | | Cloudflare | DNS, TLS termination, web application firewall, DDoS protection, Cloudflare Tunnel | Global edge network | | | Descope | Identity provider: authentication, SSO federation, SCIM, MFA, session management | United States | | | Anthropic | Large language model provider (Claude). Inputs and outputs not used for training under Anthropic Commercial Terms. | United States | | | OpenAI | Large language model provider and default text embeddings (`text-embedding-3-small`). API usage; not used for training. Enterprise customers can switch embeddings to AWS Bedrock Titan in their Cloud-Prem region. | United States | | | Google | Large language model provider (Gemini). API usage; not used for training. | United States | | | e2b | Sandboxed code execution in ephemeral Firecracker microVMs. Receives the generated code and input variables passed by the workflow node. Compliance posture at [trust.e2b.dev](https://trust.e2b.dev). | United States | | | New Relic | Log aggregation and platform metrics | United States | | | Sentry | Application error tracking with PII filtering enabled | United States | For Cloud-Prem deployments, AWS, Cloudflare, and Descope are still in scope; the remaining subprocessors are engaged only when the corresponding feature (a given AI model, code execution, hosted observability) is enabled by the customer. ## Resources Real-time platform availability, incident history, and scheduled maintenance. How BonData collects, uses, and protects personal data. The contract that governs use of the BonData platform. For SOC 2 Type II reports, Data Processing Agreements, security questionnaires, or penetration test summaries, contact `security@bondata.ai`. Contact us to discuss your security, residency, and compliance requirements and scope the right deployment for your organization. We work with each enterprise to tailor the engagement. # FAQ Source: https://docs.bondata.ai/platform/trust-faq Common questions from security, procurement, and privacy reviewers. Our SOC 2 Type II report is available under NDA. Contact `security@bondata.ai` with your company name and use case and we'll share it. No. BonData's contracts with Anthropic, OpenAI, and Google all prohibit the use of customer inputs or outputs for model training, in line with each provider's commercial API terms. Cloud SaaS is hosted in the United States by default, with EU hosting available on customer request. Cloud-Prem deployments keep all customer data inside the customer's own AWS account, in the region the customer chooses. Yes. Our DPA, with the EU Standard Contractual Clauses incorporated, is available on request from `privacy@bondata.ai`. In Cloud-Prem, yes - customer-managed AWS KMS keys are supported for RDS, S3, EBS, and application-layer encryption. Cloud SaaS uses BonData-managed AWS KMS keys. All BonData operator access is SSO-gated, uses short-lived AssumeRole credentials, and is outbound-only from BonData's network. For **Cloud-Prem**, every operator action is recorded in your AWS CloudTrail under the operator's session name in real time. For **Cloud SaaS**, BonData retains internal CloudTrail and SSO logs; tenant-scoped operator-access extracts are available on request as part of enterprise-tier contracts.