# List all enrichmentsenrichments = client.list_enrichments()# Search by keywordenrichments = client.list_enrichments(q="phone number")for e in enrichments: print(f"[{e.id}] {e.name} — {e.price} credits/call")
Get enrichment details
enrichment = client.get_enrichment(123)print(enrichment.name)print(enrichment.description)for param in enrichment.params: required = "required" if param.is_required else "optional" print(f" {param.name} ({param.type_field}, {required}): {param.description}")for field in enrichment.response_fields: print(f" → {field.name} ({field.type_field})")
Run a single enrichment
# Async — returns immediately with a task IDtask = client.run_enrichment(123, {"email": "alice@example.com"})print(task.task_id) # poll this later# Sync — submits and waits for completion in one callresult = client.run_enrichment_sync(123, {"email": "alice@example.com"})print(result)
Bulk run
inputs = [ {"email": "alice@example.com"}, {"email": "bob@example.com"}, {"email": "carol@example.com"},]# Sync — submits and waits for all resultsresults = client.run_enrichment_bulk_sync(123, inputs)print(results)
Get choices for a select parameter
# For enrichments with select/multiselect parameterschoices = client.get_param_choices(123, "country", q="united")for choice in choices.items: print(f" {choice.id}: {choice.name}")if choices.has_next_page: next_page = client.get_param_choices(123, "country", page=2)
Waterfalls chain multiple enrichment providers together with automatic fallback — if provider A doesn’t return a result, provider B is tried automatically.
List waterfalls
waterfalls = client.list_waterfalls()for w in waterfalls: providers = len(w.available_enrichments) print(f"{w.identifier}: {w.name} ({providers} providers)")
Run a waterfall
# Uses all available providers by defaultresult = client.run_waterfall_sync( "email_getter", {"linkedin_url": "https://linkedin.com/in/alice"})print(result)# Or specify providers explicitlyresult = client.run_waterfall_sync( "email_getter", {"linkedin_url": "https://linkedin.com/in/alice"}, enrichments=[10, 11, 12] # provider IDs from get_waterfall())
# Create a table with predefined columnstable = client.create_table( name="My Leads", columns=["email", "name", "company", "linkedin_url"])print(f"Created: {table.identifier}")# List all tablestables = client.list_tables()for t in tables: print(f"{t.identifier}: {t.name}")
Read rows
# Get rows with paginationdata = client.get_rows(table.identifier, page=1, per_page=500)
Insert rows
from databar import InsertRow, InsertOptions, DedupeOptionsrows = [ InsertRow(fields={"email": "alice@example.com", "name": "Alice"}), InsertRow(fields={"email": "bob@example.com", "name": "Bob"}),]# With deduplication on email columnresponse = client.create_rows( table.identifier, rows, options=InsertOptions( allow_new_columns=True, dedupe=DedupeOptions(enabled=True, keys=["email"]) ))created = [r for r in response.results if r.action == "created"]skipped = [r for r in response.results if r.action == "skipped_duplicate"]print(f"Inserted {len(created)}, skipped {len(skipped)} duplicates")
Large inserts are auto-batched in chunks of 50 — no manual chunking needed.
For async operations, you can check task status manually or poll until complete:
# Submit without waitingtask = client.run_enrichment(123, {"email": "alice@example.com"})print(f"Task submitted: {task.task_id}")# Check status oncestatus = client.get_task(task.task_id)print(status.status) # "processing", "completed", "failed", or "gone"# Poll until complete (blocks until done or times out)result = client.poll_task(task.task_id)print(result)
from databar import ( DatabarClient, DatabarAuthError, DatabarNotFoundError, DatabarInsufficientCreditsError, DatabarTaskFailedError, DatabarTimeoutError,)try: result = client.run_enrichment_sync(123, {"email": "alice@example.com"})except DatabarAuthError: print("Invalid API key — check your DATABAR_API_KEY")except DatabarInsufficientCreditsError: print("Out of credits — top up at databar.ai")except DatabarNotFoundError: print("Enrichment not found")except DatabarTaskFailedError as e: print(f"Enrichment failed: {e.message}")except DatabarTimeoutError as e: print(f"Timed out after {e.max_attempts} polls — task may still be running")