No logo available for SAP Business One to DuckDB connector icon

Load SAP Business One data to DuckDB

Build a SAP Business One to DuckDB pipeline with your coding agent. One prompt scaffolds it with the dltHub AI harness, plus the SAP Business One API base URL, auth, endpoints, and incremental loading.

SourceSAP Business OneSAP Business One API DocumentationDestinationDuckDBIn-process analytical database. The default local destination for dlt pipelines.

SAP Business One Service Layer is an OData v4 REST API that provides programmatic access to SAP Business One business objects and data functions. Everything needed to build a working SAP Business One → DuckDB pipeline is on this page: the API's base URL, authentication, endpoints, pagination and incremental field — plus a prompt that hands the whole job to your coding agent.


Build your SAP Business One to DuckDB pipeline

Paste this prompt into Claude, Codex, or Cursor. The agent does the rest.

Prompt
Run uvx dlthub-init@latest to build a pipeline from SAP Business One to DuckDB and run it on dltHub

That scaffolds a dltHub workspace and installs the dltHub AI harness — the project rules, the secrets-management skill, and the dlt MCP server your agent needs to work safely. From there it reads the SAP Business One API, proposes the endpoints to load, then writes, runs and validates the pipeline while you review rather than type. Credentials are inspected through MCP tools, so your agent never reads secrets.toml itself. How the LLM-native workflow works →

Prefer to write it yourself? Every fact the agent uses is below.


SAP Business One API at a glance

Base URLhttps://<host>:<port>/b1s/v2
Example endpointGET Orders
Records found atvalue
Authenticationauthentication requires a POST login to retrieve a B1SESSION session cookie which is then used in headers for subsequent requests
PaginationCursor-based next cursor at @odata.nextLink, page size via Prefer: odata.maxpagesize (default 20). Pagination is OData-based using $top and $skip for client-driven navigation. The page size can be controlled via the 'Prefer' header with 'odata.maxpagesize=N'. Setting it to 0 disables pagination. For OData V3, use 'odata.nextLink'; for OData V4, use '@odata.nextLink'.
Incremental field$skip
Record idDocEntry
API referencehttps://help.sap.com/doc/056f69366b5345a386bb8149f1700c19/10.0/en-US/Service%20Layer%20API%20Reference.html

These values come from the SAP Business One API reference — the authoritative source if anything here looks out of date.


How do I authenticate with the SAP Business One API?

Authentication is session-based by sending a POST request to the /Login endpoint with CompanyDB, UserName, and Password in the JSON body. Upon success, the server returns a B1SESSION cookie in the Set-Cookie response header, which must be included in subsequent requests to authorize API calls.

1. Get your credentials

The SAP Business One Service Layer does not use static API keys. Authentication is session-based. To obtain access, perform a POST request to the /Login endpoint using your credentials. 1. Ensure you have the Service Layer URL (usually https://:50000/b1s/v2/), company database name, username, and password. 2. POST the credentials in JSON format to the Login endpoint: {"CompanyDB": "<db_name>", "UserName": "", "Password": ""}. 3. The API will respond with a 200 OK status and a B1SESSION cookie in the response header (along with a SessionId in the body). 4. Use this B1SESSION cookie in the header of all subsequent API requests to maintain the session. Sessions typically expire after 30 minutes of inactivity.

2. Add them to .dlt/secrets.toml

[sources.sap_business_one_source] base_url = "https://your-sap-server:50000/b1s/v2" company_db = "YourCompanyDB" username = "manager" password = "your_password"

dlt reads this file automatically at runtime. With the harness, the setup-secrets skill prompts you for the values and never handles the raw credential in chat. For production, see setting up credentials with dlt.


What SAP Business One data can I load into DuckDB?

These are the SAP Business One endpoints dlt can load into DuckDB:

ResourceEndpointMethodData selectorDescription
BusinessPartners/BusinessPartnersGETvalueRetrieve a list of business partners
Orders/OrdersGETvalueRetrieve a list of sales orders
Items/ItemsGETvalueRetrieve a list of items
JournalEntries/JournalEntriesGETvalueRetrieve a list of journal entries
Departments/DepartmentsGETvalueRetrieve a list of departments

How do I load only new SAP Business One records?

SAP Business One exposes $skip on Orders, so dlt can request only the records that changed since the last run. Set it as the cursor_path and dlt tracks the high-water mark for you between runs.

{"name": "orders", "endpoint": { "path": "Orders", "data_selector": "value", "incremental": {"cursor_path": "$skip", "initial_value": "2024-01-01T00:00:00Z"}, }}

On the first run dlt loads everything from initial_value; on every run after that it requests only what changed and appends with write_disposition="merge" if you set a primary key. See incremental loading.


What does the generated SAP Business One pipeline look like?

A standard dlt REST API pipeline — the same code you would write by hand, loading /Login and /Logout from the SAP Business One API into DuckDB:

import dlt from dlt.sources.rest_api import RESTAPIConfig, rest_api_resources @dlt.source def sap_business_one_source(credentials=dlt.secrets.value): config: RESTAPIConfig = { "client": { "base_url": "https://<host>:<port>/b1s/v2", "auth": {"type": "api_key", "api_key": credentials, "name": "Cookie"}, }, "resources": [ {"name": "orders", "endpoint": {"path": "Orders", "data_selector": "value"}}, {"name": "business_partners", "endpoint": {"path": "BusinessPartners", "data_selector": "value"}} ], } yield from rest_api_resources(config) def load_sap_business_one_to_duckdb() -> None: pipeline = dlt.pipeline( pipeline_name="sap_business_one_pipeline", destination="duckdb", dataset_name="sap_business_one_data", ) load_info = pipeline.run(sap_business_one_source()) print(load_info) if __name__ == "__main__": load_sap_business_one_to_duckdb()

Run it with python sap_business_one_pipeline.py. The agent iterates on this until it loads cleanly — you review and approve, rather than write it from scratch.


How do I query SAP Business One data in DuckDB?

dlt creates one table per resource. Query the loaded data with Python or SQL — or ask your agent to, through the MCP server's execute_sql_query tool.

Python (pandas DataFrame):

import dlt data = dlt.pipeline("sap_business_one_pipeline").dataset() df = data.orders.df() print(df.head())

SQL:

SELECT * FROM sap_business_one_data.orders LIMIT 10;

See querying your data with dataset and exploring it in marimo notebooks.


How do I deploy the SAP Business One to DuckDB pipeline in production?

The pipeline runs locally, which is ideal for prototyping and one-off analysis. When you need it on a schedule, monitored on every load, and shared with your team, deploy the same dlt code on the dltHub platform — no infrastructure to maintain. The prompt above already ends with "run it on dltHub", so your agent can take it there directly.

  • Deploy & schedule — run the pipeline as a managed job with automatic retries.
  • Monitor — observable job queues, alerting, and load metrics for every run.
  • Transform — promote raw SAP Business One loads into governed, documented models.
  • Visualize & share — explore data in notebooks and publish live dashboards instead of static screenshots.

Book a demo →


What other destinations can I load SAP Business One data to?

dlt loads into any of these — only the destination argument changes:

DestinationExample value
PostgreSQL"postgres"
BigQuery"bigquery"
Snowflake"snowflake"
Redshift"redshift"
Databricks"databricks"
Filesystem (S3, GCS, Azure)"filesystem"

Set dlt.pipeline(destination="snowflake") and add credentials in .dlt/secrets.toml. On the dltHub platform the same pipeline runs against a managed Iceberg lakehouse. See the full destinations list.


Next steps

Was this page helpful?

Community Hub

Need more dlt context for SAP Business One to DuckDB?

Request dlt skills, commands, AGENT.md files, and AI-native context.