> ## Documentation Index
> Fetch the complete documentation index at: https://major-5cc5eebc-docs-bot-mr2qm9w6-typctx.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Microsoft Dynamics 365

> Connect to Dataverse and query CRM data.

The `Dynamics365ResourceClient` allows you to connect to Microsoft Dynamics 365 (Dataverse) and interact with CRM data including accounts, contacts, opportunities, and custom entities.

## Usage

```typescript theme={null}
import { myDynamicsClient } from "./clients";

const result = await myDynamicsClient.invoke(
  "GET",
  "/api/data/v9.2/accounts",
  "list-accounts",
  {
    query: { $top: "50" },
  }
);

if (result.ok && result.result.body.kind === "json") {
  console.log("Accounts:", result.result.body.value);
}
```

## Authentication

When creating a Dynamics 365 connector, you need to provide:

1. **Instance URL** — your organization's Dataverse endpoint (e.g., `https://myorg.crm.dynamics.com`)
2. **OAuth Scope** — choose your access level:
   * **Read-only** — query Dataverse entities without modification
   * **Read-write** — query and update Dataverse data
   * **Custom** — configure specific permissions manually

The OAuth flow redirects to Microsoft to authenticate your account. Major securely stores the token and handles authentication for all API requests.

## Inputs

The `invoke` method accepts the following arguments:

<ParamField path="method" type="string" required>
  The HTTP method to use: `"GET"`, `"POST"`, `"PATCH"`, or `"DELETE"`.
</ParamField>

<ParamField path="path" type="string" required>
  The Dataverse Web API path (e.g., `/api/data/v9.2/accounts`, `/api/data/v9.2/contacts`).
</ParamField>

<ParamField path="invocationKey" type="string" required>
  A unique identifier for this operation.
</ParamField>

<ParamField path="options" type="object">
  Optional configuration object.

  <Expandable title="properties">
    <ParamField path="query" type="Record<string, string | string[]>">
      Query parameters. Use OData syntax (e.g., `$filter`, `$select`, `$top`, `$skip`).
    </ParamField>

    <ParamField path="body" type="object">
      The request body. Only JSON is supported.

      <Expandable title="properties">
        <ParamField path="type" type="&#x22;json&#x22;" required />

        <ParamField path="value" type="unknown" required>
          The JSON payload.
        </ParamField>
      </Expandable>
    </ParamField>

    <ParamField path="timeoutMs" type="number">
      Timeout in milliseconds (default: 30000).
    </ParamField>
  </Expandable>
</ParamField>

## Outputs

The output format is the same as the [Custom API](/connectors/custom-api#outputs) client.

<ResponseField name="kind" type="&#x22;api&#x22;">
  Discriminator for the response type.
</ResponseField>

<ResponseField name="status" type="number">
  The HTTP status code.
</ResponseField>

<ResponseField name="body" type="ResponseBody">
  The response body (typically JSON).
</ResponseField>
