I’m building a dynamic ingestion pipeline in Azure Data Factory to load data from Microsoft Business Central APIs into Azure SQL staging tables, and I’ve encountered several challenges related to the JSON structure returned by the API.
A typical Business Central response looks like this:
{
"@odata.context": "...",
"value": [
{ "No":"00001A", "SystemId":"..." },
{ "No":"53929", "SystemId":"..." }
]
}
When pagination is involved, the structure often ends up stored in Blob like this:
[
{"value":[{"No":"00001A","SystemId":"..."}]},
{"value":[{"No":"53929","SystemId":"..."}]},
{"value":[{"No":"US007518","SystemId":"..."}]}
]
Issues Faced
1. OData Response Metadata
Business Central APIs return additional metadata such as @odata.context, which is not required for downstream ingestion and can interfere with schema inference in Azure Data Factory.
2. Nested value Array
The actual records are wrapped inside the value array, which prevents Copy Activity from dynamically ingesting the data as a flat dataset.
3. Copy Activity Limitation
Copy Activity expects a flat array of records, and while mappings can be defined, that breaks the metadata-driven dynamic pipeline design where multiple entities are ingested using a single pipeline and ForEach loop.
4. Mapping Data Flow Limitation
Mapping Data Flow can flatten nested arrays, but it requires Import Projection, which makes the schema static. Since the goal is to build a fully dynamic ingestion framework, this approach becomes difficult to maintain across multiple Business Central entities.
Question
Has anyone implemented a native or more efficient approach within Azure Data Factory to dynamically handle the value array and OData metadata returned by Business Central APIs, without introducing an Azure Function step?
I’d appreciate any suggestions or alternative patterns used in similar Business Central ingestion pipelines.