Load Gainsight data to DuckDB
Build a Gainsight to DuckDB pipeline with your coding agent. One prompt scaffolds it with the dltHub AI harness, plus the Gainsight API base URL, auth, endpoints, and incremental loading.
Gainsight is a customer success platform providing various REST APIs for managing company data, users, and customer success activities. Everything needed to build a working Gainsight → 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 Gainsight to DuckDB pipeline
Paste this prompt into Claude, Codex, or Cursor. The agent does the rest.
PromptRunuvx dlthub-init@latestto build a pipeline from Gainsight 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 Gainsight 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.
Gainsight API at a glance
| Base URL | https://api.gainsight.com |
| Example endpoint | GET v1/accounts |
| Records found at | accounts |
| Authentication | supports API access keys and OAuth 2.0 Bearer tokens — sent in the Authorization header, prefixed Bearer |
| Also required | Accesskey |
| Pagination | Cursor-based via scrollId, page size via pageSize. Gainsight APIs use different pagination styles depending on the endpoint. Cursor-based pagination (using scrollId) is used for bulk object retrieval like /users and /accounts, whereas offset/page-number pagination (using pageNumber and pageSize) is used for other resources like /engagement and /segment. For cursor-based endpoints, the scrollId is returned in the response body. For page-number endpoints, the first page is 0. |
| Incremental field | scrollId |
| Record id | id |
| API reference | https://support.gainsight.com/gainsight_nxt/API_and_Developer_Docs/Generate_REST_API/Generate_REST_API_Key |
These values come from the Gainsight API reference — the authoritative source if anything here looks out of date.
How do I authenticate with the Gainsight API?
Gainsight supports API access keys passed in the 'accesskey' header or OAuth 2.0 access tokens passed in the 'Authorization: Bearer ' header. M2M (Machine-to-Machine) authentication uses Basic authentication with base64-encoded client_id and client_secret to request an OAuth token.
1. Get your credentials
Navigate to Administration > Connectors 2.0. Click Create Connection. From the Connector dropdown, select Gainsight API. Choose your Authentication Type (Access_Key or OAuth) and click Generate to create the required credentials. For Access_Key, you will receive a key to be used in request headers; for OAuth, you will receive Client ID and Client Secret.
2. Add them to .dlt/secrets.toml
[sources.gainsight_source] access_key = "REPLACE_ME"
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 Gainsight data can I load into DuckDB?
These are the Gainsight endpoints dlt can load into DuckDB:
| Resource | Endpoint | Method | Data selector | Description |
|---|---|---|---|---|
| accounts | /v1/accounts | GET | accounts | Retrieve a paginated list of accounts |
| users | /v1/users | GET | users | Retrieve a paginated list of users |
| engagements | /v1/engagement | GET | engagements | Retrieve a paginated list of engagements |
| custom_objects | /v1/data/objects/query/{objectName} | GET | Read records from a custom object | |
| bulk_exports | /v3/exports/data/bulk/{objectName} | POST | Submit a bulk data export job |
How do I load only new Gainsight records?
Gainsight exposes scrollId on v1/accounts, 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": "accounts", "endpoint": { "path": "v1/accounts", "data_selector": "accounts", "incremental": {"cursor_path": "scrollId", "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 Gainsight pipeline look like?
A standard dlt REST API pipeline — the same code you would write by hand, loading v1/data/objects/{objectName} and v1/meta/services/objects/describe from the Gainsight API into DuckDB:
import dlt from dlt.sources.rest_api import RESTAPIConfig, rest_api_resources @dlt.source def gainsight_source(access_key=dlt.secrets.value): config: RESTAPIConfig = { "client": { "base_url": "https://api.gainsight.com", "auth": {"type": "bearer", "token": access_key}, }, "resources": [ {"name": "accounts", "endpoint": {"path": "v1/accounts", "data_selector": "accounts"}}, {"name": "users", "endpoint": {"path": "v1/users", "data_selector": "users"}} ], } yield from rest_api_resources(config) def load_gainsight_to_duckdb() -> None: pipeline = dlt.pipeline( pipeline_name="gainsight_pipeline", destination="duckdb", dataset_name="gainsight_data", ) load_info = pipeline.run(gainsight_source()) print(load_info) if __name__ == "__main__": load_gainsight_to_duckdb()
Run it with python gainsight_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 Gainsight 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("gainsight_pipeline").dataset() df = data.accounts.df() print(df.head())
SQL:
SELECT * FROM gainsight_data.accounts LIMIT 10;
See querying your data with dataset and exploring it in marimo notebooks.
How do I deploy the Gainsight 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 Gainsight loads into governed, documented models.
- Visualize & share — explore data in notebooks and publish live dashboards instead of static screenshots.
What other destinations can I load Gainsight data to?
dlt loads into any of these — only the destination argument changes:
| Destination | Example 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 Gainsight to DuckDB?
Request dlt skills, commands, AGENT.md files, and AI-native context.