Skip to main content
Bootstrap ingestion loads pre-existing data into Synap in bulk. Before your agent goes live (or alongside live operation) you often need to seed it with historical context: past conversations, product documentation, knowledge base articles, customer records. You call sdk.memories.batch_create() with many documents at once. Because this data is historical and processed in the background, long-range is the natural default. Use bootstrap ingestion whenever you need to load a significant volume of existing data:
  • Migrating from another system: a custom memory solution, a competing product, or an in-house knowledge base.
  • Loading historical conversations: past chat logs, support tickets, or email threads.
  • Seeding product documentation: docs, FAQs, help center articles, internal wikis.
  • Backfilling customer data: CRM records, customer profiles, organizational context.
  • Populating shared knowledge: company policies, SOPs, reference material at customer or client scope.
Bootstrap loads run at BOOTSTRAP priority in the ingestion queue, which processes below real-time but above maintenance tasks. Your live agent keeps operating normally while historical data is processed. You do not need to finish bootstrapping before going live. The two paths can run simultaneously without competing for resources.

The batch ingestion method

sdk.memories.batch_create() accepts multiple documents in a single call, reducing per-call overhead and enabling server-side throughput optimizations. Each document is a CreateMemoryRequest supporting the same fields as sdk.memories.create().
Each CreateMemoryRequest supports the same fields as a single create call, including document_id for idempotency and document_created_at for temporal accuracy.

Key considerations

1

Preserve original timestamps

Always set document_created_at to the document’s original creation time. Without it, Synap defaults to the ingestion time, which distorts temporal ordering. If a user later asks “What did we discuss last March?”, accurate timestamps are essential for correct retrieval.
2

Use document IDs for idempotency

Assign a unique document_id to every document, ideally derived from your source system’s primary key (e.g. migration_{source_id}). If a batch is interrupted, you can safely retry it: already-ingested documents are skipped, preventing duplicates and making it easy to trace memories back to their source.
3

Use long-range mode for historical data

Bootstrap data benefits from thorough extraction. long-range (the default for batch) performs deep entity resolution, relationship mapping, and preference detection. The extra processing time is fine for background loads.
4

Validate and organize before loading

Clean your historical data first: drop empty conversations, strip PII you should not store, ensure timestamps are ISO 8601, and confirm each document carries the correct scope. Incorrect scoping is difficult to fix later: you would have to re-ingest. Start with a small test batch and verify scoping, timestamps, and entity resolution before the full load.
5

Monitor ingestion progress

For large loads, track progress with sdk.memories.status():
Keep concurrency modest. While the API accepts many parallel batch requests, excessive concurrency causes queue backpressure and slows processing for all ingestion types. Add a short delay between batches during the initial bulk load.

Full example: loading historical conversations

This loads historical conversations from a database, handling pagination, error recovery, and progress monitoring: