SharePoint to Azure AI Search (keyword, vector and hybrid)

Copy SharePoint and Microsoft Lists items one way into Azure AI Search indexes, with lookups resolved, child indexes and an optional vector field, kept current by delta sync.

Book a call

Talk through your use case, see further walkthroughs or demos, and set up a trial in your own environment.

Last updated

Status: Shipped · product: SPSync for Search & Vector Stores

SPSync copies SharePoint lists into Azure AI Search one way, so SharePoint stays the system of record and the index is a copy that SPSync keeps current. You get keyword, filter and facet search over list items, and a vector field for hybrid search if you want one. Once you turn embeddings on, SPSync generates the vector for every document during the sync itself, with no embedding job of your own.

If you look after a search page, a Copilot Studio agent or a retrieval pipeline over a SharePoint list, you may have read that Microsoft’s own indexer now reads lists and wondered whether you still need a separate tool. This page gives the facts as Microsoft Learn stated them on 22 October 2026, then what SPSync does differently, so you can pick the one that fits.

Does Azure AI Search index SharePoint lists?

Yes, in preview. The SharePoint in Microsoft 365 indexer now indexes list items and their column values, starting in the 2026-05-01-preview REST API, and the What’s new page lists the change under June 2026. Preview features carry no service-level agreement and Microsoft does not recommend them for production workloads.

To try it you complete Microsoft’s preview registration form, run a Basic tier or higher search service and configure the indexer through a preview REST API. The same Learn page lists two limits that rule it out for some tenants: no private endpoints, and no support for tenants with Microsoft Entra ID Conditional Access enabled.

What the Azure AI Search SharePoint indexer gives you for lists

It does a good deal. It indexes incrementally, picking up new and changed list items, and an item deleted in SharePoint is removed from the index on the next indexer run, which runs in your search service on the schedule you give it. With permission metadata ingestion, also in preview, it can store basic access control lists for list items and trim results to what each user may see, which SPSync does not do. A skillset on the indexer can split text into chunks and embed it with an Azure OpenAI embedding model or a custom skill. For document libraries it extracts the text inside files, and SPSync copies library metadata only, never file contents.

Each list item arrives with its values as JSON in a content field, and every list column appears as a source field you map to an index field by hand. Learn’s worked example maps a text column, a number, a Yes/No and a choice column. It does not say how lookup, person or multi-value columns arrive, so test those on your own lists before you rely on them.

Microsoft also points people building a custom Copilot or RAG app over SharePoint towards the remote SharePoint knowledge source, which queries SharePoint directly and keeps no index at all.

Where SPSync differs from the native indexer

SPSync starts from a different place. It reads each list through Microsoft Graph with Sites.Selected read access, normalises the items, and then writes them to whichever destination you configured. With Azure AI Search as that destination, the differences you will notice are these:

Keep the two gaps in mind when you compare them. SharePoint item permissions are not copied, so the index is visible to anyone holding a query key. And SPSync does not index the text inside files.

SharePoint list to Azure AI Search index fields

SPSync needs the service endpoint, https://<service>.search.windows.net, and an admin API key held in an environment variable. Creating and updating indexes requires an admin key; a query key will not do. Entra ID sign-in is not supported yet. The REST API version defaults to 2024-07-01 and rarely needs changing. SPSync also keeps a local state file between runs, so give it a stable path on the sync host.

Each table becomes an index, with underscores in the name replaced by dashes: one per list, one per multi-value column, and one shared sp_users table as the sp-users index. A knowledge article list, kb_articles, gives a kb-articles index, a kb-articles--audiences child index for a multi-choice Audiences column, and sp-users. Every index uses an sp_key field as its document key.

Field attributes follow the column type:

You choose which text columns feed the vector field; the filterable and facetable flags follow the column type and need no configuration.

Azure AI Search and Postgres with pgvector are the two SPSync destinations that receive vectors. Turn on embeddings by naming a provider (OpenAI, Azure OpenAI or a local model), a model, the vector dimensions and the text columns to embed. SPSync adds an sp_embedding field to each list’s main index and fills it on every run for documents whose text changed, so an unchanged item is never sent to the embedding model again.

Changing the model keeps the same index, and the next run re-embeds every document in it. SPSync creates a new index version, named with a -v2 suffix, only when the vector dimensions change or a column changes type, because Azure AI Search cannot change an existing field. Leave embeddings off and you get a keyword index with filters and facets.

SPSync configures one HNSW vector profile with the service defaults. It adds no semantic ranker, scoring profiles or analysers, and changes you make to those in the portal are kept, because SPSync only ever updates the field list.

What each run sends

After each run SPSync sends only documents whose content changed, plus removals, in batches of 1,000. A reconcile, weekly by default, re-sends everything as a check on the index, which also puts back any document someone edited or deleted in the index by hand. A push that fails is retried on the next run.

Azure OpenAI On Your Data and SharePoint lists

Azure OpenAI On Your Data retired on 14 October 2026 and Microsoft no longer supports it. For apps that read from an Azure AI Search index, Learn’s migration guidance moves them to Foundry IQ and reuses the existing index. An index SPSync maintains is an ordinary Azure AI Search index, so it can be that index once you add the semantic configuration and query-time vectorizer Foundry IQ asks for, and SPSync keeps refreshing it whichever app reads from it. SharePoint lists in Foundry IQ after On Your Data retired walks through that migration step by step. Our chat over SharePoint data page covers the retrieval side, and Azure AI Foundry agents and SharePoint list rows shows where the Azure AI Search tool fits beside a SQL route for counts.

Uses

A search page over SharePoint lists, a Copilot Studio agent grounded on list data, chat over your SharePoint data, and retrieval for a RAG pipeline.

Azure AI Search bills by tier and index size, so the number of lists and the size of long text fields both affect cost.

Desktop, Azure or command line

All three editions run the same engine, write the same tables and use the same licence key, so the choice comes down to who looks after the sync.

Desktop app

For macOS and Windows. Sign in with Microsoft, tick the lists, choose a database and sync from your own machine on the schedule you set. Delegated sign-in needs no admin unless your tenant requires admin consent for apps.

In your Azure

SPSync in your Azure, a managed application for your own subscription, is deployed with you on a call while the Marketplace listing is prepared. Once deployed it is always on, so the sync keeps running with every laptop closed.

Command line

Every replication is a YAML file you can review and commit. Run it from a server, a container or a CI pipeline, and re-run it safely any time.

Frequently asked questions

Does Microsoft's SharePoint indexer make SPSync unnecessary for lists?

Not always. The indexer is in preview, writes only to Azure AI Search and maps columns one to one. Choose SPSync when you want lookups resolved, multi-value columns as their own indexes, embeddings from a provider you pick, or the same lists in a SQL database as well. Choose the indexer when you need SharePoint item permissions trimmed at query time or the text inside files indexed.

Does Azure AI Search replace SharePoint's own search?

It sits beside it. SPSync builds dedicated indexes over the lists you choose, with filters, facets and optional vectors that SharePoint search does not offer, refreshed on your schedule.

Which key does SPSync need for the search service?

An admin API key, because creating and updating indexes needs one; a query key cannot. Entra ID sign-in to the search service is not supported yet.

Can I do hybrid keyword and vector search?

Yes, if you turn on embeddings. SPSync then fills a vector field on each list's main index, and a single Azure AI Search request can combine keyword relevance with vector similarity.

What happens to a document when the SharePoint item is deleted?

The document is removed from the index on the next run, along with the item's documents in the child indexes, so results only show items that still exist.

Does the index respect SharePoint permissions?

No. SPSync copies items and their columns, not item-level permissions. Every index has a filterable permitted_groups field that SPSync leaves empty today, so anyone with a query key can search every document. Scope query keys, and the apps that hold them, to people who should see the whole list.

Talk to us about Azure AI Search (keyword, vector and hybrid)

SPSync is licensed per installation and per target family, with Standard Support included. Tell us which targets you need and how many machines, and we will size it with you. See how licensing works.

Set it up

Sign in to SharePoint with the SharePoint connection guide, then follow the Azure AI Search setup guide to create the database user and open the connection for Azure AI Search (keyword, vector and hybrid). If the connection test fails, the troubleshooting guide lists the errors people hit and what fixes them.

Script it

Everything you can click, you can script. The CLI, YAML config and automation below reproduce this scenario exactly. See the CLI reference.

spsync auth login --client-id 00000000-0000-0000-0000-000000000000
spsync export-config --output replication.yaml --pipeline-name azure_ai_search --prefix azure_ai_search --destination-kind azure-ai-search --connection-string-env SPSYNC_DB_CONNECTION --dataset-name azure_ai_search --client-id 00000000-0000-0000-0000-000000000000 --site-url https://contoso.sharepoint.com/sites/example --all-lists
spsync doctor replication.yaml
spsync run replication.yaml
pipeline_name: azure_ai_search
prefix: azure_ai_search
auth:
  mode: delegated
  client_id: 00000000-0000-0000-0000-000000000000
  tenant_id: common
destination:
  kind: azure-ai-search
  connection_string_env: SPSYNC_DB_CONNECTION
  dataset_name: azure_ai_search
scopes:
  - site_url: https://contoso.sharepoint.com/sites/example
    mode: entire_site
reconcile_interval_days: 7
create_reporting_views: false

Cron (Azure AI Search nightly):

# every night at 02:00
0 2 * * * cd /opt/spsync && SPSYNC_DB_CONNECTION="$(cat /etc/spsync/db.env)" uv run spsync run replication.yaml >> /var/log/spsync/run.log 2>&1

GitHub Actions:

# .github/workflows/spsync-run.yml
name: SPSync
on:
  schedule:
    - cron: "0 2 * * *"
  workflow_dispatch: {}
jobs:
  run:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/setup-uv@v3
      - run: uv sync
      - run: uv run spsync run replication.yaml
        env:
          SPSYNC_DB_CONNECTION: ${{ secrets.SPSYNC_DB_CONNECTION }}
          SPSYNC_LICENCE_KEY: ${{ secrets.SPSYNC_LICENCE_KEY }}

Azure DevOps:

# azure-pipelines.yml
schedules:
  - cron: "0 2 * * *"
    branches: { include: [main] }
    always: true
steps:
  - script: uv sync
  - script: uv run spsync run replication.yaml
    env:
      SPSYNC_DB_CONNECTION: $(SPSYNC_DB_CONNECTION)
      SPSYNC_LICENCE_KEY: $(SPSYNC_LICENCE_KEY)

Windows (PowerShell + Task Scheduler):

# Windows Task Scheduler action (see /docs/cli/automation/)
$env:SPSYNC_DB_CONNECTION = (Get-Content C:\spsync\db.env)
uv run spsync run C:\spsync\replication.yaml
schtasks /Create /SC DAILY /ST 02:00 /TN "SPSync" /TR "powershell -File C:\spsync\run.ps1"

macOS (launchd):

# ~/Library/LaunchAgents/io.spsync.run.plist, then: launchctl load ~/Library/LaunchAgents/io.spsync.run.plist

Secrets (licence key, connection strings) come from the environment, so never write them into the YAML. See scheduling and secrets.

Book a call

Tell us about your lists and where they need to go: we will talk through your use case, show further walkthroughs or demos, and set up a trial in your own environment.