Flectic
Business Central Integration - Platform-NeutralDynamics 365

The Dynamics 365 Business Central API, Explained

The Microsoft Dynamics 365 Business Central API - the integration surface often called the Dynamics 365 API or Microsoft Dynamics API - is the REST endpoint layer for connecting Business Central online to external systems. Its recommended v2.0 version is built on OData v4 and JSON, secured by Microsoft Entra ID OAuth 2.0, and exposes around 55 business-entity endpoints plus webhooks for near-real-time sync.

10 min readUpdated Jul 31, 202619 sources cited

TL;DR — Key takeaways

  • Common endpoint: https://api.businesscentral.dynamics.com/v2.0/{environmentName}/api/v2.0
  • PageType = API plus APIPublisher, APIGroup, APIVersion, EntityName, EntitySetName define the contract
  • Production: ~600 requests/minute; Sandbox: ~300 requests/minute
01Foundations

What Is the Dynamics 365 Business Central API?

The Dynamics 365 Business Central API - the integration surface also referred to as the Dynamics 365 API, the Microsoft Dynamics API, or simply the Dynamics API - is the modern REST API stack Microsoft exposes for integrating Business Central online with external systems and other Microsoft services. The recommended surface is version 2.0, built on OData v4, JSON payloads, and standard HTTP verbs (GET, POST, PATCH, DELETE). Microsoft documents it as the preferred way to integrate Business Central online with anything outside the product itself - a custom web storefront, a third-party logistics provider, a data warehouse, a Power Automate flow, or a partner-built automation.

The API exposes business entities as resources - companies, customers, items, sales orders and quotes and invoices, purchase documents, general-ledger entries, journals, vendors, and dimensions - and supports OData query options like $filter, $select, $expand, and $batch. The v2.0 endpoint pattern is https://api.businesscentral.dynamics.com/v2.0/{environmentName}/api/v2.0, with individual resources under /companies({id})/{entity}. For most SME integration work, this is the only surface you need.

If you are comparing BC to a platform like Odoo, the parallel is Odoo's XML-RPC and JSON-RPC external APIs plus its OCA REST layers - both vendors expose a programmatic surface over the same business data the UI edits. The strategic question for an SME is never 'does the ERP have an API?' (both do) but 'how mature, documented, and throttled is that API, and who maintains the integration when the vendor ships a major release?'

02Pick the right surface

Three Ways to Expose Business Central Data

Business Central does not expose one monolithic API. There are three distinct surfaces, and knowing which you are using prevents the most common integration surprises. They differ in how they are created, how fast they run, which fields they expose, and whether they support webhooks.

OData v4 web services let a non-developer publish (almost) any Page, Query, or Codeunit as an endpoint from the Web Services page inside Business Central. Because these wrap UI-bound page objects, they carry UI overhead and run slower than the dedicated surfaces - and custom fields are native, but webhook subscriptions are not supported.

The Standard API v2.0 is the Microsoft-maintained set of around 55 API Page endpoints - customers, vendors, items, sales orders, purchase orders, journals, and so on - optimized for API access with no UI components loaded. It is the best-performing standard surface and the only one with built-in webhook support. Its defining catch is field coverage: each endpoint exposes only a subset of the underlying table's fields. The Customer API surfaces roughly 27 of the more than 200 fields on the Customer table, the endpoints cannot be extended, and the object and field names do not always match BC's UI terminology.

Custom APIs are what you reach for when v2.0 does not expose the field or table your integration needs. An AL developer builds dedicated API Page (PageType = API) or API Query objects to expose any table - standard or custom - with exactly the fields and logic you require, including bound actions that trigger server-side business processes. They run at the same performance tier as v2.0 and are webhook-capable, at the cost of custom development and ongoing maintenance.

Business Central API surfaces compared: OData v4 web services vs Standard API v2.0 vs Custom APIs
DimensionOData v4 web servicesStandard API v2.0Custom APIs (AL)
How it is createdPublish a Page, Query, or Codeunit from the Web Services pageMicrosoft-maintained, shipped in-product (~55 endpoints)Developer builds PageType = API or API Query objects
PerformanceLower (carries UI page overhead)Highest (API-optimized, no UI components)Highest (same tier as v2.0)
Field coverageAll fields on the underlying pageSubset only (e.g. Customer API ≈27 of 200+ fields)You control exactly which fields are exposed
Webhook supportNoYesYes
Can be extended?N/A (publish more pages)No - must copy the AL source to add fieldsYes - you own the contract and version it
Best forQuick, no-code exposure of existing pagesStandard entity CRUD on core business objectsMissing fields/tables, custom logic, tailored contracts
03The mechanics

Business Central API Endpoints and Resources

Business Central online offers two endpoint variants. The common endpoint is https://api.businesscentral.dynamics.com/v2.0/{environmentName}/api/v2.0. The direct tenant endpoint adds the user domain: https://api.businesscentral.dynamics.com/v2.0/{userDomain}/{environmentName}/api/v2.0. Environment names can be discovered through the environments endpoint (documented under the Business Central web services lifecycle API), which is the safest way to resolve a target environment programmatically rather than hard-coding a name.

Once you have a company, the resource pattern is consistent: GET /companies returns the list, then /companies({id})/{entity} addresses a resource within that company - for example /companies({id})/customers, /companies({id})/salesOrders, or /companies({id})/generalLedgerEntries. Standard OData options shape the response: $filter for predicates, $select to trim payloads, $expand to pull related entities in one round trip, and $batch to submit up to 100 operations in a single POST.

Two practical limits shape how you write client code: the maximum page size is 20,000 entities, and the maximum batch size is 100 operations. The request body cannot exceed 350 MB, a single request times out at 10 minutes of execution (HTTP 504), and a single environment can hold up to 300 companies. Designing around these up front is far cheaper than discovering them at go-live.

  • Common endpoint: https://api.businesscentral.dynamics.com/v2.0/{environmentName}/api/v2.0
  • Direct tenant endpoint: https://api.businesscentral.dynamics.com/v2.0/{userDomain}/{environmentName}/api/v2.0
  • Discover environments via the Business Central environments lifecycle endpoint
  • Resource pattern: /companies({id})/{entity} with $filter, $select, $expand, $batch
  • Operational limits: 20,000-entity pages, 100-operation batches, 350 MB body, 10-minute timeout (HTTP 504)
Core Business Central API v2.0 entity endpoints and what they are typically used for
EndpointResource groupCommon integration use
/companiesTenant and companyResolve the company id that every other call requires
/customersAccounts receivable master dataSync customer accounts to a CRM or web storefront
/vendorsAccounts payable master dataPush vendor records to a procurement system
/itemsProduct masterDrive catalog, pricing, and availability sync to e-commerce
/salesOrdersSales documentsCreate and update sales orders; post via a bound action
/salesQuotes and /salesInvoicesSales documentsAutomate quote-to-cash and invoicing
/purchaseOrdersPurchasingAutomate purchase order creation and receiving
/generalLedgerEntriesGeneral ledger (read-only)Feed a data warehouse or reporting layer
/journalsJournals and dimensionsPost journals with dimension analysis
/accountsChart of accountsMap the GL structure for financial reporting
04The non-negotiable part

OAuth2 Authentication: Delegated vs Service-to-Service

Authentication for the Business Central API is Microsoft Entra ID (formerly Azure AD) and OAuth 2.0. Basic authentication and web service access keys are deprecated for Business Central online and must not be used for new integrations. Every modern BC API integration acquires an OAuth2 access token from Microsoft Entra ID and presents it as a bearer token on each request.

Microsoft supports two OAuth2 flows. Delegated flow impersonates a signed-in user - it relies on that user's context and licenses, so it fits interactive scenarios where a human is present. Service-to-Service (S2S) flow, also called client credentials, is the headless automation path: an application registration in Entra ID is granted API.ReadWrite.All and/or Automation.ReadWrite.All application permissions on Business Central, then registered inside BC on the Microsoft Entra Applications page. S2S is what you want for any scheduled job, middleware connector, or partner automation that runs without a user.

The S2S token request is a standard client-credentials POST to https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token with grant_type=client_credentials, the client_id and client_secret of the app registration, and scope=https://api.businesscentral.dynamics.com/.default. The returned access token is short-lived and should be cached and refreshed before expiry - the most common integration bug we see is a partner that fetches a fresh token on every call and silently doubles its request volume.

Delegated vs Service-to-Service (S2S) OAuth2 for the Business Central API
DimensionDelegated flowService-to-Service (S2S)
User contextImpersonates a signed-in userNo user - headless app
LicensesConsumes the user's BC licenseGoverned by S2S permissions in BC
PermissionsDelegated scopes consented by the userApplication permissions (API.ReadWrite.All / Automation.ReadWrite.All)
SetupApp registration + user consentApp registration + register in BC Microsoft Entra Applications page
Best fitInteractive client apps, Power Automate user flowsScheduled jobs, middleware, partner automation, webhooks
05Develop safely

Sandbox Environments for API Development

A Business Central sandbox environment is purpose-built for development, testing, training, and experimentation. Extensions can be deployed directly from Visual Studio Code, debuggers attached, and production data optionally copied in so you can exercise realistic volumes without touching live transactions. Sandboxes run on a different performance tier than production, so they are explicitly not suitable for reliable benchmarking - design your load tests against that limitation.

For licensing, the base Business Central subscription (Essential or Premium) includes one production environment plus three sandbox environments, with additional environments purchasable as part of additional production environment bundles. Crucially for API work, sandbox environments use the same REST API endpoints as production - you simply substitute the sandbox environment name in the endpoint URL. This means the same client code, the same OAuth2 app registration, and the same OData queries work against both; only the environment segment changes.

The practical discipline for an SME in Canada, the UK, or the US is to treat the sandbox as the contract: every change to your integration - a new entity mapped, a new filter clause, a revised retry policy - is proved against the sandbox first, then promoted. This is also where rate-limit behaviour diverges (sandboxes are throttled more aggressively than production), so a flow that 'worked in dev' can still fail at go-live if it was never tested against realistic data volumes.

06Go beyond the standard fields

Custom API Pages in AL: Exposing Any Table as a REST Endpoint

When the Standard API v2.0 does not expose the field or table your integration needs - the single most common reason teams go custom - you build an API Page in AL. This is a first-class object type whose contract you control, and it is the standard answer to the field-subset limitation described above.

The building blocks are an AL page object with PageType = API bound to a source table, plus five properties that define its URL namespace and entity names: APIPublisher, APIGroup, APIVersion, EntityName, and EntitySetName. For a wholesale-pricing endpoint built on the Item table, you would set APIPublisher and APIGroup to your own namespace (for example a 'wholesale' group under your publisher), pin APIVersion to v1.0, and use EntityName and EntitySetName to name the exposed resource - so the endpoint later resolves under /api/{publisher}/wholesale/v1.0/{entitySetName} on the standard host.

Inside the object, the layout block is where you choose exactly which fields to expose - for a wholesale-pricing endpoint built on the Item table you might surface only the item number, description, unit cost, and unit price, omitting every other column. Microsoft's developer walkthrough documents this same PageType = API pattern, the five namespace and entity properties, and a layout that picks the fields.

Once the extension is published, the endpoint resolves on the same api.businesscentral.dynamics.com host under your custom namespace - for example https://api.businesscentral.dynamics.com/v2.0/{environment}/api/flectic/wholesale/v1.0/wholesalePrices - and is consumed with the same OAuth 2.0 bearer token and OData query options ($filter, $select) as the standard API. To an external client, a custom API Page is indistinguishable from a Microsoft one.

Bound actions extend the contract beyond CRUD. A POST to an action bound to the entity triggers server-side AL logic - posting a document, releasing a quote, or recalculating pricing. This is how you expose business processes through the API, not just data, and it is the recommended pattern when an integration needs to drive BC workflows rather than simply read and write records.

Two constraints are worth knowing up front. First, you cannot extend an existing Microsoft API Page with extra fields - Microsoft's own documentation states that extending APIs with additional fields is not currently possible, so you must copy the AL source and ship a new API Page instead. Second, a custom table is not automatically exposed; it needs its own API Page. Finally, the SUPER permission set is unavailable over the API, so access is granted through least-privilege permission sets, which is a security best practice rather than a limitation.

  • PageType = API plus APIPublisher, APIGroup, APIVersion, EntityName, EntitySetName define the contract
  • Custom endpoints live under /api/{publisher}/{group}/{version}/{entitySetName} on the standard host
  • Bound actions (POST) expose server-side AL business logic, not just data
  • You cannot extend a Microsoft API Page - copy the AL source and create a new API Page to add fields
  • Use $select and $filter to avoid over-fetching, and apply least-privilege permission sets (SUPER is not allowed over the API)
07Design for throttling

API Rate Limits, Throttling, and Retry Strategy

Business Central enforces throughput limits that sit on top of the per-request limits above. Microsoft publishes the current set in its API limits documentation, and the headline figures matter for any integration that moves more than a trivial volume of records. Production environments are typically throttled around 600 API requests per minute; sandbox environments around 300 requests per minute. Individual OData and SOAP requests also run concurrently under a small fixed queue, so a poorly-tuned batch job can stall even when the per-minute ceiling is nowhere near saturated.

When a limit is exceeded, Business Central returns HTTP 429 (Too Many Requests) for rate violations and HTTP 504 (Gateway Timeout) when a single request exceeds the 10-minute execution ceiling. A robust client implements exponential backoff with jitter on 429, respects any Retry-After header, and splits long-running operations into paged or batched chunks that finish well under the timeout. This is not optional engineering - it is the difference between an integration that survives month-end close and one that silently stalls at the worst possible moment.

For SMEs the implication is concrete: budget for throttling-aware middleware from day one. Off-the-shelf iPaaS connectors (Power Automate, Zapier, Make) handle backoff for you but cap your control; a purpose-built integration gives you full control over retry semantics, idempotency keys, and dead-letter handling but is more to maintain. Flectic's guidance is to start with whichever side of that tradeoff matches your team's appetite, and revisit once transaction volumes cross roughly 50,000 records per day.

  • Production: ~600 requests/minute; Sandbox: ~300 requests/minute
  • HTTP 429 = throttled (back off and retry); HTTP 504 = single request exceeded 10 minutes
  • Implement exponential backoff with jitter on 429 and honour Retry-After
  • Split long-running jobs into paged/batched chunks well under the timeout
  • Budget for throttling-aware middleware from day one - it is cheaper than retrofitting it
08Reactive integration

Webhooks and Change Notifications

Polling the Business Central API for changes is wasteful and burns your request budget against the rate ceiling. Microsoft addresses this with webhook subscriptions: you register a callback URL against a resource (for example, /companies({id})/customers) and Business Central POSTs a notification to your endpoint when a create, update, or delete occurs on that resource. Webhooks are exposed on the API v2.0 surface and are documented under the API Page type reference.

Each subscription carries a validation token handshake (BC sends a validation request when you create the subscription; your endpoint must echo the token back to confirm ownership) and a clientState secret you can use to verify the notification origin. Notifications tell you that something changed and which entity changed - they do not carry the payload, so your handler must follow up with a GET to fetch the new state. Designing for this two-step pattern avoids stale data and keeps the notification handler fast.

For SME integrations the rule of thumb is simple: use webhooks for record-level events that drive downstream automation (a new sales order triggers fulfilment, a vendor change syncs to procurement) and reserve polling for the small set of cases where the entity genuinely has no webhook support.

  1. 01
    Subscribe to a resource

    POST a subscription payload to /companies({id})/subscriptions referencing the resource you want to monitor (e.g. customers) and your HTTPS callback URL.

  2. 02
    Complete the validation handshake

    BC sends a validation request with a validationToken. Your endpoint must respond within a short window with the token echoed back to confirm you own the callback URL.

  3. 03
    Receive and verify notifications

    On each change, BC POSTs a notification containing the resource id and your clientState secret. Verify the secret, then issue a GET to fetch the updated record.

  4. 04
    Renew before expiry

    Subscriptions expire (Microsoft documents the default lifetime in the API reference). Schedule a renewal job to refresh subscriptions before they lapse, or you will silently stop receiving notifications.

09What actually works

SME Integration Patterns That Hold Up

The integrations that survive in production for SMEs share a small set of traits. They are idempotent (every write carries a stable correlation id so a retry after a 504 does not create a duplicate invoice). They are throttling-aware (they respect 429 and page large reads rather than hammering $top). They are observable (every failure is logged with enough context to reproduce, and a dead-letter queue catches anything that cannot be auto-retried). And they isolate the ERP from the downstream system - the API client is the only thing that knows BC's schema; everything downstream talks to a normalised domain model the integration owns.

The patterns that fail are the mirror image: polling in a tight loop, fire-and-forget writes with no correlation id, embedding BC field names directly into a commerce storefront, and assuming the sandbox's rate ceiling matches production. Each of these is a go-live incident waiting to happen.

Because Flectic implements both Dynamics 365 and Odoo, we tune these patterns to the platform in front of us. The discipline - idempotency, backoff, observability, isolation - is platform-neutral. The specific limits, auth model, and webhook shape are what change between BC's v2.0/OData v4 surface and Odoo's XML-RPC/JSON-RPC surface, and that is exactly the kind of detail a partner should own so the SME does not have to.

FAQ

Frequently asked questions

Is the Business Central API REST or SOAP?

The recommended Business Central API (v2.0) is REST, built on OData v4 with JSON payloads. Business Central still exposes a legacy SOAP web services surface for backward compatibility, but Microsoft positions the v2.0 REST API as the preferred path for new integrations and has announced deprecation of OData page endpoints starting with the 2027 release wave 1.

Can I use basic authentication with the Business Central API?

No. Basic authentication and web service access keys are deprecated for Business Central online. New integrations must use OAuth 2.0 through Microsoft Entra ID, either delegated (for interactive, user-context flows) or service-to-service / client credentials (for headless automation, scheduled jobs, and partner integrations).

What are the main Business Central API limits I should design around?

Four limits matter most: a maximum page size of 20,000 entities, a maximum batch of 100 operations per $batch, a 350 MB request body ceiling, and a 10-minute execution timeout (HTTP 504 if exceeded). On top of those, expect around 600 requests per minute in production and 300 in sandbox, with HTTP 429 returned when you exceed the rate.

Do sandbox environments use the same API as production?

Yes. Sandbox environments use the same v2.0 REST/OData v4 endpoints as production - you only change the environment name segment in the URL, and the same OAuth2 app registration and client code work against both. Note that sandboxes are throttled more aggressively than production, so an integration that passes in a sandbox can still fail under realistic production load.

How many sandbox environments do I get with Business Central?

The base Essential or Premium subscription includes one production environment plus three sandbox environments. Additional sandbox environments come bundled with additional production environments (three sandboxes per additional production environment) - you cannot purchase a sandbox on its own.

Does Flectic only work with the Business Central API?

No. Flectic is platform-neutral and implements both Dynamics 365 (including Business Central) and Odoo for SMEs across Canada, the UK, and the US. The integration discipline - idempotency, throttling-aware retries, observability, isolation - is the same; the specific API surface, auth model, and limits differ between platforms.

How many endpoints does the Business Central API v2.0 include?

The Standard API v2.0 includes approximately 55 Microsoft-maintained endpoints covering core business areas - companies, customers, vendors, items, sales orders, sales quotes and invoices, purchase orders, journals, general-ledger entries, and the chart of accounts. Each endpoint is an API Page object optimized for API access, but it exposes only a subset of the fields on the underlying table (the Customer API surfaces roughly 27 of the 200+ fields on the Customer table).

What is the difference between the Business Central API v2.0 and OData web services?

OData v4 web services let you publish almost any Page, Query, or Codeunit as an endpoint from inside Business Central without writing code - they expose all the page's fields but carry UI overhead (slower) and do not support webhooks. The Standard API v2.0 is a fixed, Microsoft-maintained set of API Page endpoints that runs faster and supports webhooks, but only exposes a subset of fields per entity. For missing fields or custom logic, an AL developer builds a Custom API (PageType = API), which matches v2.0's performance and webhook support while letting you choose exactly which fields are exposed.

How do I expose a custom table or extra fields through the Business Central API?

You cannot add fields to an existing Microsoft API Page - Microsoft's documentation confirms extending APIs with additional fields is not currently possible. Instead, an AL developer creates a new API Page with PageType = API bound to your table (or the standard table), setting APIPublisher, APIGroup, APIVersion, EntityName, and EntitySetName. The result is a REST endpoint under /api/{publisher}/{group}/{version}/{entitySetName} that consumes the same OAuth 2.0 token and OData query options as the standard API, and you can add bound actions to expose server-side business logic.

Can I integrate Business Central with Faire, the wholesale marketplace?

Yes, but there is no first-party Microsoft connector for Faire. Faire is an online wholesale marketplace where brands sell to independent retailers, and the integration is typically built two ways. The first is third-party middleware - connectors such as Commercium (ConstaCloud), SKUPlugs, Syncware, and OrderEase push Faire wholesale orders, customers, taxes, and inventory into Business Central's salesOrders, customers, and items endpoints without custom code. The second is a custom build using the BC API v2.0 plus a Custom API Page (PageType = API): a webhook on salesOrders or items fires when a Faire order lands through your middleware, your handler creates the sales order and reserves inventory, and a wholesale-pricing API Page exposes item cost and pricing back to Faire. Either way, the same OAuth 2.0 service-to-service token, throttling-aware retry, and idempotency rules described above apply.

Sources & methodology

19 cited

Every pricing figure and statistic on this page is traced to a primary or vendor source with a verification date. Where partner pages are cited, their platform bias is disclosed in-line.

  1. 01
    v2.0 is the recommended REST API surface, built on OData v4 with standard HTTP verbslearn.microsoft.com
  2. 02
    Operational limits: 20,000-entity pages, 100-operation batches, 350 MB request body, 300 companies per environmentlearn.microsoft.com
  3. 03
    Request execution timeout is 10 minutes; HTTP 504 Gateway Timeout returned when exceededlearn.microsoft.com
  4. 04
    Rate-limit guidance: HTTP 429 handling, execution time limited to 10 minutes, retry semanticslearn.microsoft.com
  5. 05
    S2S authentication uses the OAuth 2.0 Client Credentials flow; requires app registration with API.ReadWrite.All / Automation.ReadWrite.All and registration inside BClearn.microsoft.com
  6. 06
    Production and sandbox environment entitlements: 1 production + 3 sandbox environments with base subscription; 3 additional sandboxes per additional production environmentlearn.microsoft.com
  7. 07
    Environments lifecycle endpoint used to discover environment names programmaticallylearn.microsoft.com
  8. 08
    OData page endpoints will be deprecated starting 2027 release wave 1 in favour of API v2.0eonesolutions.com
  9. 09
    Basic auth / web service access keys deprecated for Business Central online SaaS; OAuth2 is the replacementdemiliani.com
  10. 10
    API rate limit changed from per-second to ~600 requests/minute production and ~300 requests/minute sandboxeonesolutions.com
  11. 11
    The Standard API v2.0 includes ~55 endpoints and exposes only a subset of fields - the Customer API surfaces ~27 of the 200+ fields on the Customer table; endpoints cannot be extendedeonesolutions.com
  12. 12
    Three BC API surfaces (OData v4 web services, Standard API v2.0, Custom APIs) differ in performance, field coverage, and webhook supporteonesolutions.com
  13. 13
    Custom APIs are built as API Page objects (PageType = API) with APIPublisher, APIGroup, APIVersion, EntityName, EntitySetName; resolved under /api/{publisher}/{group}/{version}/{entitySetName}nortal.com
  14. 14
    Bound actions (POST) expose server-side AL business logic; the SUPER permission set is unavailable over the API so access uses least-privilege permission setsnortal.com
  15. 15
    Extending APIs with additional fields is not currently possible in Business Central - you must copy the AL code for the API and ship a new API Pagelearn.microsoft.com
  16. 16
    Microsoft walkthrough for developing a custom API page in AL and accessing it through the APIlearn.microsoft.com
  17. 17
    Faire is an online wholesale marketplace; no first-party Microsoft connector exists - integrations run through third-party middleware (Commercium/ConstaCloud, SKUPlugs, Syncware, OrderEase) that sync Faire orders, customers, taxes, and inventory into Business Centralconstacloud.com
  18. 18
    Faire integration partners (SKUPlugs, Syncware) sync Faire wholesale orders into POS, ERP, and inventory systems including Business Centralskuplugs.com
  19. 19
    Business Central API rate limits confirmed current for 2026: 600 requests/minute production and 300 requests/minute sandboxlearn.microsoft.com

Designing a Business Central integration that actually survives go-live?

Flectic implements Dynamics 365 and Odoo integrations for SMEs across Canada, the UK, and the US - throttling-aware middleware, idempotent writes, and webhook patterns tuned to your transaction volume. We can help you scope the right integration architecture in a single focused call.

Book an ERP Readiness Call
Response within one business day