Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Extract text, tables, and structured data from documents using Azure Document Intelligence (@azure-rest/ai-document-intelligence). Use when processing invoices, receipts, IDs, forms, or building custom document models.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 161% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 96% | 0% |
Extract text, tables, and structured data from documents using prebuilt and custom models.
bashnpm install @azure-rest/ai-document-intelligence @azure/identity
bashDOCUMENT_INTELLIGENCE_ENDPOINT=https://<resource>.cognitiveservices.azure.com DOCUMENT_INTELLIGENCE_API_KEY=<api-key> AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
Important: This is a REST client. DocumentIntelligence is a function, not a class.
typescriptimport DocumentIntelligence from "@azure-rest/ai-document-intelligence"; import { DefaultAzureCredential, ManagedIdentityCredential } from "@azure/identity"; // Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential> const credential = new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]}); // Or use a specific credential directly in production: // See https://learn.microsoft.com/javascript/api/overview/azure/identity-readme?view=azure-node-latest#credential-classes // const credential = new ManagedIdentityCredential(); const client = DocumentIntelligence( process.env.DOCUMENT_INTELLIGENCE_ENDPOINT!, credential );
typescriptimport DocumentIntelligence from "@azure-rest/ai-document-intelligence"; const client = DocumentIntelligence( process.env.DOCUMENT_INTELLIGENCE_ENDPOINT!, { key: process.env.DOCUMENT_INTELLIGENCE_API_KEY! } );
typescriptimport DocumentIntelligence, { isUnexpected, getLongRunningPoller, AnalyzeOperationOutput } from "@azure-rest/ai-document-intelligence"; const initialResponse = await client .path("/documentModels/{modelId}:analyze", "prebuilt-layout") .post({ contentType: "application/json", body: { urlSource: "https://example.com/document.pdf" }, queryParameters: { locale: "en-US" } }); if (isUnexpected(initialResponse)) { throw initialResponse.body.error; } const poller = getLongRunningPoller(client, initialResponse); const result = (await poller.pollUntilDone()).body as AnalyzeOperationOutput; console.log("Pages:", result.analyzeResult?.pages?.length); console.log("Tables:", result.analyzeResult?.tables?.length);
typescriptimport { readFile } from "node:fs/promises"; const fileBuffer = await readFile("./document.pdf"); const base64Source = fileBuffer.toString("base64"); const initialResponse = await client .path("/documentModels/{modelId}:analyze", "prebuilt-invoice") .post({ contentType: "application/json", body: { base64Source } }); if (isUnexpected(initialResponse)) { throw initialResponse.body.error; } const poller = getLongRunningPoller(client, initialResponse); const result = (await poller.pollUntilDone()).body as AnalyzeOperationOutput;
| Model ID | Description | |----------|-------------| | prebuilt-read | OCR - text and language extraction | | prebuilt-layout | Text, tables, selection marks, structure | | prebuilt-invoice | Invoice fields | | prebuilt-receipt | Receipt fields | | prebuilt-idDocument | ID document fields | | prebuilt-tax.us.w2 | W-2 tax form fields | | prebuilt-healthInsuranceCard.us | Health insurance card fields | | prebuilt-contract | Contract fields | | prebuilt-bankStatement.us | Bank statement fields |
typescriptconst initialResponse = await client .path("/documentModels/{modelId}:analyze", "prebuilt-invoice") .post({ contentType: "application/json", body: { urlSource: invoiceUrl } }); if (isUnexpected(initialResponse)) { throw initialResponse.body.error; } const poller = getLongRunningPoller(client, initialResponse); const result = (await poller.pollUntilDone()).body as AnalyzeOperationOutput; const invoice = result.analyzeResult?.documents?.[0]; if (invoice) { console.log("Vendor:", invoice.fields?.VendorName?.content); console.log("Total:", invoice.fields?.InvoiceTotal?.content); console.log("Due Date:", invoice.fields?.DueDate?.content); }
typescriptconst initialResponse = await client .path("/documentModels/{modelId}:analyze", "prebuilt-receipt") .post({ contentType: "application/json", body: { urlSource: receiptUrl } }); const poller = getLongRunningPoller(client, initialResponse); const result = (await poller.pollUntilDone()).body as AnalyzeOperationOutput; const receipt = result.analyzeResult?.documents?.[0]; if (receipt) { console.log("Merchant:", receipt.fields?.MerchantName?.content); console.log("Total:", receipt.fields?.Total?.content); for (const item of receipt.fields?.Items?.values || []) { console.log("Item:", item.properties?.Description?.content); console.log("Price:", item.properties?.TotalPrice?.content); } }
typescriptimport DocumentIntelligence, { isUnexpected, paginate } from "@azure-rest/ai-document-intelligence"; const response = await client.path("/documentModels").get(); if (isUnexpected(response)) { throw response.body.error; } for await (const model of paginate(client, response)) { console.log(model.modelId); }
typescriptconst initialResponse = await client.path("/documentModels:build").post({ body: { modelId: "my-custom-model", description: "Custom model for purchase orders", buildMode: "template", // or "neural" azureBlobSource: { containerUrl: process.env.TRAINING_CONTAINER_SAS_URL!, prefix: "training-data/" } } }); if (isUnexpected(initialResponse)) { throw initialResponse.body.error; } const poller = getLongRunningPoller(client, initialResponse); const result = await poller.pollUntilDone(); console.log("Model built:", result.body);
typescriptimport { DocumentClassifierBuildOperationDetailsOutput } from "@azure-rest/ai-document-intelligence"; const containerSasUrl = process.env.TRAINING_CONTAINER_SAS_URL!; const initialResponse = await client.path("/documentClassifiers:build").post({ body: { classifierId: "my-classifier", description: "Invoice vs Receipt classifier", docTypes: { invoices: { azureBlobSource: { containerUrl: containerSasUrl, prefix: "invoices/" } }, receipts: { azureBlobSource: { containerUrl: containerSasUrl, prefix: "receipts/" } } } } }); if (isUnexpected(initialResponse)) { throw initialResponse.body.error; } const poller = getLongRunningPoller(client, initialResponse); const result = (await poller.pollUntilDone()).body as DocumentClassifierBuildOperationDetailsOutput; console.log("Classifier:", result.result?.classifierId);
typescriptconst initialResponse = await client .path("/documentClassifiers/{classifierId}:analyze", "my-classifier") .post({ contentType: "application/json", body: { urlSource: documentUrl }, queryParameters: { split: "auto" } }); if (isUnexpected(initialResponse)) { throw initialResponse.body.error; } const poller = getLongRunningPoller(client, initialResponse); const result = await poller.pollUntilDone(); console.log("Classification:", result.body.analyzeResult?.documents);
typescriptconst response = await client.path("/info").get(); if (isUnexpected(response)) { throw response.body.error; } console.log("Custom model limit:", response.body.customDocumentModels.limit); console.log("Custom model count:", response.body.customDocumentModels.count);
typescriptimport DocumentIntelligence, { isUnexpected, getLongRunningPoller, AnalyzeOperationOutput } from "@azure-rest/ai-document-intelligence"; // 1. Start operation const initialResponse = await client .path("/documentModels/{modelId}:analyze", "prebuilt-layout") .post({ contentType: "application/json", body: { urlSource } }); // 2. Check for errors if (isUnexpected(initialResponse)) { throw initialResponse.body.error; } // 3. Create poller const poller = getLongRunningPoller(client, initialResponse); // 4. Optional: Monitor progress poller.onProgress((state) => { console.log("Status:", state.status); }); // 5. Wait for completion const result = (await poller.pollUntilDone()).body as AnalyzeOperationOutput;
typescriptimport DocumentIntelligence, { isUnexpected, getLongRunningPoller, paginate, parseResultIdFromResponse, AnalyzeOperationOutput, DocumentClassifierBuildOperationDetailsOutput } from "@azure-rest/ai-document-intelligence";
paginate() helper for listing modelsOther measured skills in the registry, with their headline benchmark lift.