Data API Overview

The Data API provides comprehensive methods for reading and writing data in DealCloud. HTTP is handled by intapp-rest-client (RestClient); see Advanced configuration and Error handling for retries and errors.

This overview covers key concepts before diving into specific operations.

Output Formats

⚠️

Breaking change (dealcloud-sdk 1.x): The output parameter is required for read_data(). See the Migration Guide for details.

All read operations support multiple output formats:

FormatReturn TypeBest For
"list"List[dict]API integration, custom processing
"pandas"pandas.DataFrameData analysis, transformations
"polars"polars.DataFrameLarge datasets, high performance
"polars_lazy"polars.LazyFrameQuery optimization
# List of dictionaries
records = dc.read_data("Company", output="list")
 
# Pandas DataFrame
df = dc.read_data("Company", output="pandas")
 
# Polars DataFrame (10-100x faster for large datasets)
df = dc.read_data("Company", output="polars")
 
# Polars LazyFrame (for query optimization)
lf = dc.read_data("Company", output="polars_lazy")
result = lf.filter(pl.col("Revenue") > 1000000).collect()
🚀

Polars is recommended for datasets over 100k rows. See Polars Integration.

Data Operations

Key Concepts

Objects vs Views

SourceParameterDescription
Objectobject_id="Company"Read all data from an object
Viewview_id="My View"Read filtered data from a configured view
# Read from object
companies = dc.read_data("Company", output="pandas")
 
# Read from view
active = dc.read_data(view_id="Active Companies", output="pandas")

Field References

Fields are identified by their API Name (not display name):

Display NameAPI NameNotes
Company NameCompanyNameNo spaces
Date CreatedCreatedDateSystem field
Contact - PrimaryContactPrimaryVaries by config

To find API names:

# Get all fields for an object
fields = dc.get_fields("Company")
for f in fields:
    print(f"{f.name} -> {f.apiName}")

Reference Fields

Reference, choice, and user fields return rich objects by default:

# Default: full reference objects
contacts = dc.read_data("Contact", output="list")
# contacts[0]["Company"] = {"id": 123, "name": "Acme Corp", "entryListId": 2011, ...}
 
# With reference_format: just names
from dealcloud_sdk import ReferenceFormat
contacts = dc.read_data(
    "Contact",
    output="list",
    reference_format=ReferenceFormat.NAME
)
# contacts[0]["Company"] = "Acme Corp"
 
# With reference_format: just IDs
contacts = dc.read_data(
    "Contact",
    output="list",
    reference_format=ReferenceFormat.ID
)
# contacts[0]["Company"] = 123

Pagination

The SDK handles pagination automatically:

# Reads ALL records, automatically paginating
all_companies = dc.read_data("Company", output="pandas")
 
# Configure page size if needed
config = DealCloudConfig(
    # ...credentials
    querySettings={"pageSize": 500}  # Default: 1000
)

Streaming for Large Datasets

For memory-efficient processing of large datasets:

# Generator - processes one record at a time
for company in dc.read_data_streaming("Company"):
    process(company)
    # Memory usage stays constant regardless of total records
 
# Async generator
async for company in dc.aread_data_streaming("Company"):
    await process_async(company)

Quick Reference

Read Methods

MethodReturnsUse Case
read_data()DataFrame or List[dict]General reads
read_data_streaming()Iterator[dict]Large datasets, memory-efficient
aread_data_streaming()AsyncIterator[dict]Async applications
typed_read_data()List[T]Type-safe with Pydantic

Write Methods

MethodPurposeInputOutput
insert_data()Create new recordslist, pandas, polarslist, pandas, polars
update_data()Update existing recordslist, pandas, polarslist, pandas, polars
upsert_data()Insert or update based on keylist, pandas, polarslist, pandas, polars
delete_data()Delete records by IDlistlist
write_cells()Write cell-level datalist, pandas, polars-
💡

Write methods now support both DataFrame input (pandas and Polars) and configurable output format via the output parameter.

Typed Methods (Pydantic)

MethodWrapsReturns
typed_read_data()read_data()List[T]
typed_read_data_streaming()read_data_streaming()Iterator[T]
typed_aread_data_streaming()aread_data_streaming()AsyncIterator[T]
typed_insert_data()insert_data()List[T]
typed_update_data()update_data()List[T]
typed_upsert_data()upsert_data()List[T]

Error Handling

from dealcloud_sdk import DealCloud, ErrorHandling
 
# Fail fast (default) - raises on transport HTTP errors
dc.insert_data("Company", data, error_handling=ErrorHandling.FAIL_FAST)
 
# Collect transport errors - returns BatchResult
result = dc.insert_data("Company", data, error_handling=ErrorHandling.COLLECT)
row_errors = result.row_errors  # HTTP 200 rows with "Errors"
transport_errors = result.errors
 
# Inspect row errors on FAIL_FAST (default) without raising
from dealcloud_sdk import split_row_results
rows = dc.insert_data("Company", data)
_, row_errors = split_row_results(rows)
 
# Strict row errors (per-call or via DealCloudConfig.raiseOnRowErrors)
dc.insert_data("Company", data, raise_on_row_errors=True)

Next Steps