azure-search-rest
Expert guidance for interacting with Azure AI Search using the REST API. Use this skill when you need to create, manage, or query search indexes, knowledge bases, knowledge sources, upload documents, perform full-text/vector/hybrid searches, or implement agentic retrieval via REST. Covers data plane operations for the 2025-11-01-preview API version.
SKILL.md
| Name | azure-search-rest |
| Description | Expert guidance for interacting with Azure AI Search using the REST API. Use this skill when you need to create, manage, or query search indexes, knowledge bases, knowledge sources, upload documents, perform full-text/vector/hybrid searches, or implement agentic retrieval via REST. Covers data plane operations for the 2025-11-01-preview API version. |
name: azure-search-rest description: Expert guidance for interacting with Azure AI Search using the REST API. Use this skill when you need to create, manage, or query search indexes, knowledge bases, knowledge sources, upload documents, perform full-text/vector/hybrid searches, or implement agentic retrieval via REST. Covers data plane operations for the 2025-11-01-preview API version.
Azure AI Search REST API Expert
This skill provides comprehensive guidance for interacting with Azure AI Search using the REST API. Azure AI Search is a fully managed, cloud-hosted service that connects your data to AI, supporting classic search (single index queries) and agentic retrieval (multi-source, LLM-assisted retrieval for agents and chatbots).
Prerequisites
- An Azure AI Search service deployed in your Azure subscription
- Authentication via either:
- API Key: Admin key (full access) or Query key (read-only)
- OAuth2/Bearer Token: Microsoft Entra ID authentication
- Use the azure-cli skill to obtain bearer tokens
- Use the rest-http-caller skill to execute REST requests
API Base URL
All requests are made to:
https://[service-name].search.windows.net
Replace [service-name] with your Azure Search service name.
Current API Version
api-version=2025-11-01-preview
Note: Always append ?api-version=2025-11-01-preview to your requests.
Authentication
Option 1: API Key Authentication
Include the api-key header in all requests:
--header "api-key: YOUR_ADMIN_OR_QUERY_KEY"
Option 2: Bearer Token Authentication (OAuth2)
Use the azure-cli skill to get a bearer token:
# Get token for Azure Search
$TOKEN = az account get-access-token --resource https://search.azure.com --query accessToken --output tsv
# Use in requests
--header "Authorization: Bearer $TOKEN"
Part 1: Classic Search - Index Operations
Classic search is an index-first retrieval model for predictable, low-latency queries targeting a single, predefined search index.
1.1 Create or Update Index
Creates a new search index or updates an existing one. Indexes define the structure of searchable content.
Endpoint:
PUT https://[service-name].search.windows.net/indexes('{indexName}')?api-version=2025-11-01-preview
Required Headers:
Content-Type: application/jsonapi-key: [admin-key]orAuthorization: Bearer [token]Accept: application/json;odata.metadata=minimalPrefer: return=representation
Example - Create a Simple Index:
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--header "Prefer: return=representation" \
--body '{
"name": "hotels-sample",
"fields": [
{"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true, "sortable": true},
{"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true},
{"name": "Description", "type": "Edm.String", "searchable": true, "analyzer": "en.lucene"},
{"name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "facetable": true},
{"name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "facetable": true},
{"name": "Rating", "type": "Edm.Double", "filterable": true, "sortable": true, "facetable": true},
{"name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true}
]
}'
Example - Create Index with Vector Search:
Note: The
hnswParametersobject is optional. Azure Search uses sensible defaults, so only include these parameters if the user specifically requests custom tuning form,efConstruction,efSearch, ormetric.
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/indexes('vector-sample')?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--header "Prefer: return=representation" \
--body '{
"name": "vector-sample",
"fields": [
{"name": "id", "type": "Edm.String", "key": true, "sortable": true},
{"name": "title", "type": "Edm.String", "searchable": true},
{"name": "content", "type": "Edm.String", "searchable": true},
{"name": "contentVector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile"}
],
"vectorSearch": {
"algorithms": [
{"name": "hnsw-config", "kind": "hnsw"}
],
"profiles": [
{"name": "vector-profile", "algorithm": "hnsw-config", "vectorizer": "openai-vectorizer"}
],
"vectorizers": [
{"name": "openai-vectorizer", "kind": "azureOpenAI", "azureOpenAIParameters": {"resourceUri": "https://YOUR_OPENAI.openai.azure.com", "deploymentId": "text-embedding-3-large", "modelName": "text-embedding-3-large"}}
]
}
}'
Example - Create Index with Semantic Configuration:
Semantic configurations enable semantic ranking for improved relevance. Use prioritizedContentFields (not contentFields) for the 2025-11-01-preview API.
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/indexes('semantic-sample')?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--header "Prefer: return=representation" \
--body '{
"name": "semantic-sample",
"fields": [
{"name": "id", "type": "Edm.String", "key": true},
{"name": "title", "type": "Edm.String", "searchable": true},
{"name": "content", "type": "Edm.String", "searchable": true},
{"name": "category", "type": "Edm.String", "searchable": true, "filterable": true}
],
"semantic": {
"configurations": [
{
"name": "my-semantic-config",
"prioritizedFields": {
"titleField": {"fieldName": "title"},
"prioritizedContentFields": [
{"fieldName": "content"}
],
"prioritizedKeywordsFields": [
{"fieldName": "category"}
]
}
}
]
}
}'
Semantic Configuration Fields:
| Field | Description |
|---|---|
titleField | Single field for document title (optional, set to null if not applicable) |
prioritizedContentFields | Array of content fields for semantic ranking (most important first) |
prioritizedKeywordsFields | Array of keyword fields for semantic ranking (optional) |
Note: Do NOT use
contentFields- this is an invalid property name. Always useprioritizedContentFields.
Field Data Types:
| Type | Description |
|---|---|
Edm.String | Text field |
Edm.Int32, Edm.Int64 | Integer fields |
Edm.Double | Floating-point number |
Edm.Boolean | True/false |
Edm.DateTimeOffset | Date and time |
Edm.GeographyPoint | Geographic coordinates |
Collection(Edm.String) | Array of strings |
Collection(Edm.Single) | Vector field (for embeddings) |
Field Attributes:
| Attribute | Description |
|---|---|
key | Unique document identifier (exactly one field must be key) |
searchable | Full-text searchable |
filterable | Can be used in $filter expressions |
sortable | Can be used in $orderby expressions |
facetable | Can be used for faceted navigation |
retrievable | Returned in search results |
1.2 List Indexes
Endpoint:
GET https://[service-name].search.windows.net/indexes?api-version=2025-11-01-preview
Example:
dotnet run ../rest-http-caller/HttpCaller.cs -- GET "https://YOUR_SERVICE.search.windows.net/indexes?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY"
1.3 Get Index
Endpoint:
GET https://[service-name].search.windows.net/indexes('{indexName}')?api-version=2025-11-01-preview
Example:
dotnet run ../rest-http-caller/HttpCaller.cs -- GET "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY"
1.4 Delete Index
Endpoint:
DELETE https://[service-name].search.windows.net/indexes('{indexName}')?api-version=2025-11-01-preview
Example:
dotnet run ../rest-http-caller/HttpCaller.cs -- DELETE "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY"
Part 2: Document Operations
2.1 Upload/Index Documents
Upload, merge, or delete documents in an index. Use batching for efficiency (up to 1000 documents or 16 MB per batch).
Endpoint:
POST https://[service-name].search.windows.net/indexes('{indexName}')/docs/index?api-version=2025-11-01-preview
Document Actions:
| Action | Effect |
|---|---|
upload | Insert if new, replace if exists (upsert) |
merge | Update existing document fields, fails if not found |
mergeOrUpload | Merge if exists, upload if new |
delete | Remove document from index |
Example - Upload Documents:
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs/index?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--body '{
"value": [
{
"@search.action": "upload",
"HotelId": "1",
"HotelName": "Secret Point Motel",
"Description": "The hotel is ideally located on the main commercial artery of the city.",
"Category": "Boutique",
"Tags": ["pool", "air conditioning", "concierge"],
"Rating": 4.5
},
{
"@search.action": "upload",
"HotelId": "2",
"HotelName": "Twin Dome Motel",
"Description": "A classic hotel with modern amenities in the heart of downtown.",
"Category": "Budget",
"Tags": ["free wifi", "parking"],
"Rating": 3.8
}
]
}'
Example - Merge Document (partial update):
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs/index?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--body '{
"value": [
{
"@search.action": "merge",
"HotelId": "1",
"Rating": 4.8
}
]
}'
Example - Delete Document:
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs/index?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--body '{
"value": [
{
"@search.action": "delete",
"HotelId": "2"
}
]
}'
2.2 Get Document by Key
Endpoint:
GET https://[service-name].search.windows.net/indexes('{indexName}')/docs('{key}')?api-version=2025-11-01-preview
Example:
dotnet run ../rest-http-caller/HttpCaller.cs -- GET "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs('1')?api-version=2025-11-01-preview" \
--header "api-key: YOUR_QUERY_KEY"
2.3 Count Documents
Endpoint:
GET https://[service-name].search.windows.net/indexes('{indexName}')/docs/$count?api-version=2025-11-01-preview
Example:
dotnet run ../rest-http-caller/HttpCaller.cs -- GET "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs/\$count?api-version=2025-11-01-preview" \
--header "api-key: YOUR_QUERY_KEY"
Part 3: Search Operations
3.1 Full-Text Search
Endpoint (GET):
GET https://[service-name].search.windows.net/indexes('{indexName}')/docs?search={query}&api-version=2025-11-01-preview
Endpoint (POST - recommended for complex queries):
POST https://[service-name].search.windows.net/indexes('{indexName}')/docs/search?api-version=2025-11-01-preview
Search Parameters:
| Parameter | Description |
|---|---|
search | Search query text (use * for all documents) |
$filter | OData filter expression |
$orderby | Sort order |
$select | Fields to return |
$top | Number of results to return |
$skip | Number of results to skip (pagination) |
$count | Include total count of matches |
searchFields | Limit search to specific fields |
searchMode | any (default) or all for term matching |
queryType | simple (default), full (Lucene syntax), or semantic |
facets | Fields for faceted navigation |
highlight | Fields for hit highlighting |
Example - Simple Search:
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs/search?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_QUERY_KEY" \
--body '{
"search": "pool",
"select": "HotelId, HotelName, Description, Rating",
"top": 10,
"count": true
}'
Example - Filtered Search with Facets:
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs/search?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_QUERY_KEY" \
--body '{
"search": "*",
"filter": "Rating ge 4.0 and Category eq '\''Boutique'\''",
"orderby": "Rating desc",
"select": "HotelId, HotelName, Rating, Category",
"facets": ["Category", "Tags"],
"top": 20,
"count": true
}'
Example - Full Lucene Query Syntax:
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs/search?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_QUERY_KEY" \
--body '{
"search": "hotel AND (pool OR spa) -motel",
"queryType": "full",
"searchMode": "all",
"top": 10
}'
3.2 Vector Search
Example - Pure Vector Search:
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('vector-sample')/docs/search?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_QUERY_KEY" \
--body '{
"vectorQueries": [
{
"kind": "vector",
"vector": [0.1, 0.2, ...],
"fields": "contentVector",
"k": 5
}
],
"select": "id, title, content"
}'
Example - Hybrid Search (Text + Vector):
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('vector-sample')/docs/search?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_QUERY_KEY" \
--body '{
"search": "modern architecture",
"vectorQueries": [
{
"kind": "vector",
"vector": [0.1, 0.2, ...],
"fields": "contentVector",
"k": 5
}
],
"select": "id, title, content",
"top": 10
}'
3.3 Semantic Search
Example - Semantic Search:
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('hotels-sample')/docs/search?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_QUERY_KEY" \
--body '{
"search": "find hotels with great amenities for business travelers",
"queryType": "semantic",
"semanticConfiguration": "my-semantic-config",
"captions": "extractive",
"answers": "extractive",
"top": 5
}'
Part 4: Agentic Retrieval (Knowledge Bases & Sources)
Agentic retrieval is a multi-query pipeline for complex agent-to-agent workflows. It targets a knowledge base that orchestrates retrieval from multiple knowledge sources with LLM-assisted query planning.
4.1 Knowledge Sources
Knowledge sources define where data comes from. Types include:
searchIndex- Azure Search indexazureBlob- Azure Blob Storage (with auto-ingestion)indexedSharePoint- Indexed SharePoint contentindexedOneLake- Indexed OneLake contentweb- Web contentremoteSharePoint- Live SharePoint queries
Create Knowledge Source (Search Index Type)
Endpoint:
PUT https://[service-name].search.windows.net/knowledgesources('{sourceName}')?api-version=2025-11-01-preview
Example - Create Search Index Knowledge Source:
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/knowledgesources('ks-hotels')?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--header "Prefer: return=representation" \
--body '{
"name": "ks-hotels",
"kind": "searchIndex",
"description": "Knowledge source for hotel information",
"searchIndexParameters": {
"searchIndexName": "hotels-sample",
"sourceDataFields": [
{"name": "Description"},
{"name": "HotelName"},
{"name": "Category"}
],
"searchFields": [
{"name": "*"}
],
"semanticConfigurationName": "hotels-semantic-config"
}
}'
Example - Create Azure Blob Knowledge Source:
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/knowledgesources('ks-documents')?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--header "Prefer: return=representation" \
--body '{
"name": "ks-documents",
"kind": "azureBlob",
"description": "Knowledge source for document storage",
"azureBlobParameters": {
"connectionString": "DefaultEndpointsProtocol=https;AccountName=YOUR_ACCOUNT;AccountKey=YOUR_KEY;EndpointSuffix=core.windows.net",
"containerName": "documents",
"folderPath": "knowledge-docs",
"ingestionParameters": {
"embeddingModel": {
"kind": "azureOpenAI",
"azureOpenAIParameters": {
"resourceUri": "https://YOUR_OPENAI.openai.azure.com/",
"deploymentId": "text-embedding-3-large",
"apiKey": "YOUR_OPENAI_KEY",
"modelName": "text-embedding-3-large"
}
},
"chatCompletionModel": {
"kind": "azureOpenAI",
"azureOpenAIParameters": {
"resourceUri": "https://YOUR_OPENAI.openai.azure.com/",
"deploymentId": "gpt-4o-mini",
"apiKey": "YOUR_OPENAI_KEY",
"modelName": "gpt-4o-mini"
}
}
}
}
}'
Example - Create Web Knowledge Source:
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/knowledgesources('ks-web')?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--header "Prefer: return=representation" \
--body '{
"name": "ks-web",
"kind": "web",
"description": "Web knowledge source",
"webParameters": {
"domains": {
"allowedDomains": [
{"address": "docs.microsoft.com", "includeSubpages": true},
{"address": "learn.microsoft.com", "includeSubpages": true}
],
"blockedDomains": [
{"address": "spam-site.com"}
]
}
}
}'
List Knowledge Sources
dotnet run ../rest-http-caller/HttpCaller.cs -- GET "https://YOUR_SERVICE.search.windows.net/knowledgesources?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY"
Delete Knowledge Source
dotnet run ../rest-http-caller/HttpCaller.cs -- DELETE "https://YOUR_SERVICE.search.windows.net/knowledgesources('ks-hotels')?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY"
4.2 Knowledge Bases
A knowledge base combines one or more knowledge sources with an LLM for query planning and answer synthesis.
Create Knowledge Base
Endpoint:
PUT https://[service-name].search.windows.net/knowledgebases('{knowledgeBaseName}')?api-version=2025-11-01-preview
Example:
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/knowledgebases('travel-kb')?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--header "Prefer: return=representation" \
--body '{
"name": "travel-kb",
"description": "Knowledge base for travel and hotel information",
"knowledgeSources": [
{"name": "ks-hotels"},
{"name": "ks-documents"}
],
"models": [
{
"kind": "azureOpenAI",
"azureOpenAIParameters": {
"resourceUri": "https://YOUR_OPENAI.openai.azure.com/",
"deploymentId": "gpt-4o-mini",
"apiKey": "YOUR_OPENAI_KEY",
"modelName": "gpt-4o-mini"
}
}
],
"retrievalReasoningEffort": {"kind": "low"},
"outputMode": "answerSynthesis",
"retrievalInstructions": "Focus on hotel amenities, location, and pricing when searching for hotels.",
"answerInstructions": "Provide helpful, concise answers about travel destinations and accommodations."
}'
Reasoning Effort Levels:
| Level | Description |
|---|---|
minimal | No source selection, query planning, or iterative search |
low | Basic reasoning during retrieval |
medium | Moderate reasoning with more iteration |
Output Modes:
| Mode | Description |
|---|---|
extractiveData | Return raw data from knowledge sources |
answerSynthesis | LLM synthesizes an answer from retrieved data |
List Knowledge Bases
dotnet run ../rest-http-caller/HttpCaller.cs -- GET "https://YOUR_SERVICE.search.windows.net/knowledgebases?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY"
Delete Knowledge Base
dotnet run ../rest-http-caller/HttpCaller.cs -- DELETE "https://YOUR_SERVICE.search.windows.net/knowledgebases('travel-kb')?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY"
4.3 Knowledge Retrieval
Execute retrieval queries against a knowledge base.
Endpoint:
POST https://[service-name].search.windows.net/knowledgebases('{knowledgeBaseName}')/retrieve?api-version=2025-11-01-preview
Example - Chat-Style Retrieval:
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/knowledgebases('travel-kb')/retrieve?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--body '{
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Find me a boutique hotel with a pool and good ratings"}
]
}
],
"maxRuntimeInSeconds": 60,
"maxOutputSize": 50000,
"retrievalReasoningEffort": {"kind": "low"},
"outputMode": "answerSynthesis",
"includeActivity": true,
"knowledgeSourceParams": [
{
"kind": "searchIndex",
"knowledgeSourceName": "ks-hotels",
"includeReferences": true,
"includeReferenceSourceData": true,
"rerankerThreshold": 2.0
}
]
}'
Example - Intent-Based Retrieval (Skip Query Planning):
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/knowledgebases('travel-kb')/retrieve?api-version=2025-11-01-preview" \
--header "Content-Type: application/json" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Accept: application/json;odata.metadata=minimal" \
--body '{
"intents": [
{"type": "semantic", "search": "boutique hotels with pool amenities"}
],
"maxRuntimeInSeconds": 30,
"retrievalReasoningEffort": {"kind": "minimal"},
"outputMode": "extractiveData",
"includeActivity": true
}'
Response Structure:
The retrieval response contains:
response- The synthesized answer or extracted dataactivity- Activity records showing what operations were performed (query planning, searches, reasoning)references- Document references with source data and reranker scores
Part 5: Common Workflows
Workflow 1: Create Index, Upload Documents, and Search
# 1. Get authentication token
$TOKEN = az account get-access-token --resource https://search.azure.com --query accessToken --output tsv
# 2. Create the index
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/indexes('products')?api-version=2025-11-01-preview" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--header "Prefer: return=representation" \
--body '{"name": "products", "fields": [{"name": "id", "type": "Edm.String", "key": true}, {"name": "name", "type": "Edm.String", "searchable": true}, {"name": "description", "type": "Edm.String", "searchable": true}, {"name": "price", "type": "Edm.Double", "filterable": true, "sortable": true}]}'
# 3. Upload documents
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('products')/docs/index?api-version=2025-11-01-preview" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--body '{"value": [{"@search.action": "upload", "id": "1", "name": "Widget", "description": "A useful widget", "price": 9.99}]}'
# 4. Search the index
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/indexes('products')/docs/search?api-version=2025-11-01-preview" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--body '{"search": "widget", "top": 10}'
Workflow 2: Set Up Agentic Retrieval
# 1. Create a knowledge source pointing to your index
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/knowledgesources('ks-products')?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Content-Type: application/json" \
--header "Prefer: return=representation" \
--body '{"name": "ks-products", "kind": "searchIndex", "searchIndexParameters": {"searchIndexName": "products", "sourceDataFields": [{"name": "name"}, {"name": "description"}], "searchFields": [{"name": "*"}]}}'
# 2. Create a knowledge base with the source and an LLM
dotnet run ../rest-http-caller/HttpCaller.cs -- PUT "https://YOUR_SERVICE.search.windows.net/knowledgebases('products-kb')?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Content-Type: application/json" \
--header "Prefer: return=representation" \
--body '{"name": "products-kb", "knowledgeSources": [{"name": "ks-products"}], "models": [{"kind": "azureOpenAI", "azureOpenAIParameters": {"resourceUri": "https://YOUR_OPENAI.openai.azure.com/", "deploymentId": "gpt-4o-mini", "apiKey": "YOUR_OPENAI_KEY", "modelName": "gpt-4o-mini"}}], "retrievalReasoningEffort": {"kind": "low"}, "outputMode": "answerSynthesis"}'
# 3. Query the knowledge base
dotnet run ../rest-http-caller/HttpCaller.cs -- POST "https://YOUR_SERVICE.search.windows.net/knowledgebases('products-kb')/retrieve?api-version=2025-11-01-preview" \
--header "api-key: YOUR_ADMIN_KEY" \
--header "Content-Type: application/json" \
--body '{"messages": [{"role": "user", "content": [{"type": "text", "text": "What products do you have under $10?"}]}], "includeActivity": true}'
Error Handling
| HTTP Status | Meaning | Resolution |
|---|---|---|
| 400 | Bad Request | Check request body syntax and field names |
| 401 | Unauthorized | Verify API key or bearer token |
| 403 | Forbidden | Check permissions (admin vs query key) |
| 404 | Not Found | Verify index/resource name exists |
| 409 | Conflict | Resource already exists with different definition |
| 429 | Too Many Requests | Reduce request rate, implement backoff |
| 503 | Service Unavailable | Retry with exponential backoff |
Tips for LLM/Agent Usage
- Use Bearer tokens for automated workflows - tokens expire, so refresh them periodically
- Batch document operations - upload up to 1000 docs or 16 MB per request
- Use POST for searches - easier to construct complex queries with JSON body
- Enable
includeActivityin retrieval requests to understand what operations were performed - Set appropriate
rerankerThresholdto filter low-quality matches - Choose reasoning effort wisely -
minimalfor simple queries,low/mediumfor complex multi-source queries - Always include
api-versionparameter in all requests