/ 01The connector contract
Every Atrium connector implements the same Python interface. The contract is the price of admission: a new source comes online when it can satisfy these methods without compromise.
class Connector(ABC): silo_id: SiloId instance_id: ConnectorInstanceId async def configure(self, config: ConnectorConfig) -> None: ... async def healthcheck(self) -> HealthState: ... async def subscribe_events(self, callback: EventCallback) -> Subscription: ... async def pull_changes(self, since: datetime) -> AsyncIterator[DocumentEvent]: ... async def fetch_document(self, source_id: str, requester: RequesterContext) -> DocumentFetchResponse: ... async def fetch_metadata(self, source_id: str) -> DocumentMetadata: ... async def backfill(self, scope: BackfillScope) -> BulkBackfillJob: ...
/ 02iManage
iManage Work + iManage Insight+ are the most common Atrium silos in legal. The connector uses iManage REST API v2 with OAuth 2.0 client credentials.
Capability
- Push via webhook subscription on document, version, and metadata events
- Native classification labels mapped via classification mapping
- Per-workspace residency override (folder is pinned to a region)
- On-demand fetch for L6 users, with original iManage permission check
Required credentials
tenant_urle.g.https://cloudimanage.com/work/api/v2/customers/123client_idOAuth app registered in iManage Adminclient_secretStored in Atrium's KMS-backed secret storelibraryiManage library identifier; one connector per library
/ 03NetDocuments
NetDocuments uses the ndOffice REST API v2 plus webhooks. The connector authenticates with an Atrium-registered third-party application.
Differences from iManage
- NetDocuments classification is metadata-driven (cabinet level); mapping is per-cabinet not per-document
- Webhooks deliver event envelopes only; the connector pulls the document body separately
- Permissions evaluated via the ndmpermissions endpoint at fetch time
/ 04Litera Foundation
Litera Foundation has no native webhook surface. The Atrium connector polls the metadata API on a configurable cadence (default: 15 minutes for changes, 1 hour for new documents), and reconciles against a per-document last_seen_modified_at cursor.
Backfill jobs run at registration; live ingest takes over once the cursor reaches "now".
/ 05Pull vs push
| Mode | Latency | Sources |
|---|---|---|
| Push (webhook) | Seconds | iManage · NetDocuments · SharePoint Graph |
| Pull (poll) | 5–60 minutes | Litera · SMB filesystem · Manual upload |
| Hybrid | Best of both | iManage (events) + nightly reconciliation poll |
Hybrid is the recommended mode for sources that support push: webhook delivery is occasionally lossy, and a once-a-day poll catches anything missed.
/ 06Classification mapping
Source DMSes have their own classification taxonomy. Atrium maps them onto the canonical 5-level ladder (Public · Internal · Confidential · Restricted · Privileged) via per-silo mapping files. See classification mapping & canonical levels.
Mappings are configured at connector setup and audited as policy. Changes propagate through the reclassification cascade — see steward queue · reclassification cascade.
/ 07Backfill jobs
The first thing a new connector does is backfill the existing corpus. Backfill is throttled, resumable, and observable.
Discover
Enumerate documents in scope. For iManage, this is a full library scan; for NetDocuments, per-cabinet.
Prioritise
Recent > rest. Priority queue ordered by document last-modified-at desc.
Fetch + extract
Pulled, OCR'd if needed, extracted text stored in the silo's pinned region.
Classify
DMS native classification is canonicalised; β classifier runs in parallel; disagreements queue for steward review.
Disclose
L1 immediately; L2–L4 generated; L2/L3/L4 above Internal queued for steward.
Backfill metrics live on the connector dashboard — discovered count, fetched count, extracted, indexed, ready-for-discovery — refreshed every 30 seconds.
