Capability Library · Pack detail

dynamics v1.0.0

Microsoft Dynamics 365 / Dataverse Web API on the customer's own environment: read accounts, contacts and opportunities, update opportunities, and read the caller identity with WhoAmI.

Review state: draft· Not in the distributable release manifest

Release identity

SHA-256 of the pack file bytes: e4286776dc6967b45a8ab71a22dbbb3e9eb0909299f69d2aff7be25c686e18e9

Not in the distributable release manifest. The binary carries a digest-bound manifest of the distributable library; a pack whose bytes differ from its manifest entry — endpoint, tier, allowlist, or credential edited, with provider, version, and review block preserved — fails the digest check, loses distributability, and renders MODIFIED rather than as the shipped reviewed artifact. Review state and artifact status are different facts: the first is a documentation-review declaration, the second is the identity of the exact bytes.

Capabilities (5)

dynamics.accounts.read v1.0.0R0

Action
read
Endpoint
GET https://dynamics-org.invalid/api/data/v9.2/accounts
Connector
http
Custody
customer_vault
Credential ref
secret-ref-dynamics-dataverse-access-token
Data class
pii

Read the accounts entity set: organization records carrying addresses, phone numbers and primary-contact references, registered at the pii class because account data routinely identifies individual people. The registered path covers the collection read only — single-record reads (accounts(GUID)) and the separate navigation-property endpoints (for example accounts(GUID)/primarycontactid) are not registered by this pack. The API permits $expand and other query options on collection requests; this registration places no restriction on query options. The host is a reserved placeholder: substitute the customer's environment host before enabling.

dynamics.contacts.read v1.0.0R0

Action
read
Endpoint
GET https://dynamics-org.invalid/api/data/v9.2/contacts
Connector
http
Custody
customer_vault
Credential ref
secret-ref-dynamics-dataverse-access-token
Data class
pii

Read the contacts entity set: person records with names, email addresses, phone numbers and job titles, which are personal data. The registered path covers the collection read only — single-record reads (contacts(GUID)) and the separate navigation-property endpoints are not registered by this pack. The API permits $expand and other query options on collection requests; this registration places no restriction on query options. The host is a reserved placeholder: substitute the customer's environment host before enabling.

dynamics.opportunities.read v1.0.0R0

Action
read
Endpoint
GET https://dynamics-org.invalid/api/data/v9.2/opportunities
Connector
http
Custody
customer_vault
Credential ref
secret-ref-dynamics-dataverse-access-token
Data class
internal

Read the opportunities entity set: sales pipeline records with topics, customers and revenue estimates, registered at the internal class — a deployment whose policy treats revenue projections as financial data should raise the class, which is a supported review outcome. The registered path covers the collection read only — single-record reads (opportunities(GUID)) are not registered by this pack. The host is a reserved placeholder: substitute the customer's environment host before enabling.

dynamics.opportunities.update v1.0.0R3

Actions
update, transfer
Endpoint
PATCH https://dynamics-org.invalid/api/data/v9.2/opportunities(OPPORTUNITY_ID)
Connector
http
Custody
customer_vault
Credential ref
secret-ref-dynamics-dataverse-access-token
Data class
internal

Update one opportunity record with the properties in the request body, declaring update and transfer at the transfer floor of R3. OPPORTUNITY_ID is a placeholder the deployment substitutes with a concrete record GUID before enabling — pre-registration GUID substitution; this pack relies on no call-time endpoint templating. The deployment's adapter must send If-Match: * so the PATCH cannot behave as an upsert and create a record, per Microsoft's update guidance. This registration does not restrict which writable columns a request may carry. Microsoft's opportunity reference documents that status changes run through this same PATCH (statecode and statuscode, the SetState message): the dated reference lists statecode choices 0 Open, 1 Won and 2 Lost, and states that won and lost opportunities are read-only until reactivated. The same reference lists ownerid as a writable column with Assign as the ownership-reassignment message, so this capability can also reassign the record to a new owner — the transfer effect is declared rather than narrowed, because no reviewed restriction removes it from the registered PATCH. The WinOpportunity and LoseOpportunity actions — unbound actions that take an opportunity-close payload (an opportunityclose record bound to the opportunity, plus a status code) — are deliberately not registered. The host is a reserved placeholder: substitute the customer's environment host before enabling.

dynamics.whoami.read v1.0.0R0

Action
read
Endpoint
GET https://dynamics-org.invalid/api/data/v9.2/WhoAmI
Connector
http
Custody
customer_vault
Credential ref
secret-ref-dynamics-dataverse-access-token
Data class
internal

Invoke the WhoAmI unbound function: returns the UserId, BusinessUnitId and OrganizationId of the caller — for this pack, the application user the client-credentials token maps to. It verifies which identity the stored credential resolves to and changes nothing. The host is a reserved placeholder: substitute the customer's environment host before enabling.

Credential reference

The pack names a reference, never a secret. Installing a pack registers capabilities and makes them governable; registration is not connectivity. The credential is created at the provider and held in the client's own secret manager under the reference the pack names, and deployment testing is still required to show the credential path works and cannot be bypassed.

Reference
secret-ref-dynamics-dataverse-access-token
Custody
customer_vault
Injection
header (Authorization)

An OAuth2 access token for the customer's own Dataverse environment, held in the client's own secret manager. The stored material must be the complete Authorization header value (scheme included): 'Bearer', one separating space, then the access token. An external deployment process obtains the token with the OAuth 2.0 client credentials grant — POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token with the environment URL as the resource (scope '<org-url>/.default') — and renews it before expiry, storing the new complete header value each time. Storing the app registration's client secret under this reference does not make the HTTP injector perform OAuth: the injector injects the stored value verbatim, so token lifecycle (including secret rotation on the app registration) sits entirely with that external process, and the client secret itself must never be the stored value. customer_vault is the only generally-supported production custody model here — identity_federation and customer_broker are refused at startup and inline is lab-only. Access tokens are short-lived (the token response carries expires_in). Distinguish the revocation paths: disabling the application user in the environment or removing its security role stops the environment from honoring further calls; removing the app registration's secret stops future token acquisition — but secret removal does not by itself invalidate already-issued access tokens, which remain usable until they expire (typically about an hour). Plan any emergency revocation around that residual validity window. An expired value fails closed. Least privilege: the application user's custom security role should grant read on accounts, contacts and opportunities, update on opportunities, and nothing more — no create, delete, append-to or assign privileges beyond what the registered capabilities need. Executor hygiene: the value must live only in executor memory for the lifetime of a call, must never be written to logs, traces or diagnostics, and must not appear in crash dumps; a deployment that cannot meet that bar must not enable the pack.

Resources

  • dynamics-org-accounts (api, pii): https://dynamics-org.invalid/api/data/v9.2/accounts
  • dynamics-org-contacts (api, pii): https://dynamics-org.invalid/api/data/v9.2/contacts
  • dynamics-org-opportunities (api, internal): https://dynamics-org.invalid/api/data/v9.2/opportunities
  • dynamics-org-identity (api, internal): https://dynamics-org.invalid/api/data/v9.2/WhoAmI

Pack notes and exclusions

The endpoint host 'dynamics-org.invalid' is a reserved non-production placeholder (an RFC 2606 reserved TLD): substitute the customer's own Dataverse environment host (Microsoft's documentation writes it as [Organization URI], of the form yourorg.crm.dynamics.com or yourorg.api.crm.dynamics.com) before enabling, in every endpoint, in every resource locator and in every egress allowlist entry. The allowlist matches exactly, so endpoints and allowlist must be substituted together, and substitution is a required deployment step — the reserved host being allowlisted does not make an unsubstituted pack safe to enable. The Web API version segment v9.2 is pinned as documented. This pack registers only endpoints Microsoft's Dataverse Web API documentation describes: collection reads on the accounts, contacts and opportunities entity sets, the WhoAmI unbound function, and PATCH update of one opportunity record. All reads are collection reads only: single-record reads (accounts(GUID), contacts(GUID), opportunities(GUID)) exist in the API and are deliberately not registered. The opportunity update registers PATCH /opportunities(OPPORTUNITY_ID): Microsoft's update guidance documents that PATCH without If-Match behaves as an upsert that can create a record, so the deployment's adapter must send If-Match: * to keep this capability an update only. This registration does not restrict which writable columns a request may carry, and Microsoft's opportunity reference documents that status changes run through the same PATCH (statecode and statuscode, the SetState message) and that ownership reassignment (Assign) is PATCH of ownerid — so this capability can mark an opportunity won or lost (the dated opportunity reference lists statecode 1 Won and 2 Lost and states won and lost opportunities are read-only until reactivated) and can reassign it — the update therefore declares transfer at the R3 floor, because the registered PATCH permits ownership reassignment and no reviewed restriction removes it. The WinOpportunity and LoseOpportunity actions — unbound actions accepting an opportunity-close payload (an opportunityclose record bound to the opportunity, plus a status code) — are deliberately not registered, and nothing in this pack creates or deletes any record: record create (POST) and delete (DELETE) are documented in the API and are deliberately not registered. Authentication is OAuth 2.0 client credentials against Microsoft Entra ID: an external deployment process registers an application in the customer's tenant, creates the corresponding application user in the Dataverse environment with a least-privilege custom security role, and obtains access tokens from https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token with grant_type=client_credentials and scope set to the environment URL suffixed with '/.default' (the org URL is the resource). The token endpoint host is deliberately NOT in the egress allowlist: the executor never calls it, because token acquisition and renewal are the external process's job and the injector only injects the stored value verbatim. Dataverse enforces the application user's security roles on every call, so a capability works only if that user is permitted the operation; the registration records the endpoint, not the environment's authorization decision.

Review record

Draft review record dated 2026-09-21 · Reviewer: aaes-eng (an opaque id that resolves internally to the responsible reviewer)

A pack review is not a vendor or examiner attestation. A retrieval date says when a source page was read; it does not by itself establish what the page said then. No pack is vendor-endorsed, and none has been connectivity-tested against a live vendor tenant.