Develop integrations
Interfaces and protocols
Dataverse exposes an OData v4 Web API at /api/data/v9.2 for CRUD, FetchXML, actions and batch requests. Paging returns up to 5,000 records per page and you follow @odata.nextLink rather than assuming an offset. Use $select to limit columns, $expand sparingly, and conditional requests with ETag/If-Match to avoid lost updates on concurrent edits.
Authentication
Server-to-server integrations use an Entra ID app registration with the client-credentials flow, and in Dataverse you create an application user with a security role. Never embed a licensed user's password. Delegated connections run as the connection owner, which changes the audit trail and record ownership, so choose deliberately.
Patterns
- Synchronous request/response: the caller waits; keep it short and expect throttling.
- Webhooks: JSON push of the plug-in context with at-least-once delivery, so make the receiver idempotent.
- Azure Service Bus: durable queue or topic, dead-lettering and sessions - best when the endpoint can be offline.
- Event Grid: lightweight near real-time notification with retries.
- Change tracking: enabled on tables so you query only deltas instead of full scans.
- Virtual tables with the OData v4 provider: read external data without copying it.
- Dual-write: near real-time bidirectional sync with finance and operations apps.
Traps
Service protection limits produce HTTP 429 with a Retry-After header - implement exponential backoff and never retry in a tight loop. A batch is not a transaction across all its requests unless they are inside a changeset. Long-running work must not sit in a synchronous plug-in, where you will hit the timeout.
Rule of thumb
Choose by delivery guarantee: must not be lost, use Service Bus; must notify quickly with retry, use a webhook or Event Grid; must be visible to the user immediately, use a tightly scoped synchronous call.