SharePoint Indexing API
Captain indexes SharePoint document libraries through Microsoft’s Graph API. There is no per-user OAuth flow and no user passwords involved: your Microsoft 365 admin registers an app once, and Captain uses that app’s credentials to read a single file, a folder (recursively), or a whole document library.
The app reads only through Microsoft Graph with the permissions your admin
grants, and every access is read-only and audit-logged. To scope access to
specific sites rather than the whole tenant, an admin can use the
Sites.Selected application permission plus a per-site grant instead of
Sites.Read.All; that advanced option is outside this standard setup.
To index individual users’ OneDrive for Business drives instead, see the OneDrive Indexing API guide. The endpoints and permissions are separate by design.
What your IT admin provides
Three values, all from a one-time App Registration in Microsoft Entra ID:
Plus the URL of the SharePoint site to index, e.g.
https://yourco.sharepoint.com/sites/Sales.
One-time setup
Every step below is done by someone with admin rights in your Microsoft 365 tenant. It takes about 10 minutes and is done once. After that, indexing is a plain API call.
Step 1: Create an App Registration and client secret
- Sign in at entra.microsoft.com (or the Azure portal) and go to Identity → Applications → App registrations.
- Click New registration. Name the app (for example
captain-indexing), leave every default as is, and click Register. - On the app’s Overview page, copy two values: the Application (client) ID and the Directory (tenant) ID.
- Go to Certificates & secrets and click New client secret. Pick an expiry and click Add.
- Copy the secret’s Value right away; it is shown only once. This is
the
client_secretyou’ll send to Captain. Keep it secret.
Step 2: Grant application permissions and admin consent
-
On the app’s API permissions page, click Add a permission and choose Microsoft Graph.
-
Choose Application permissions, not Delegated. Application permissions are what let Captain run headlessly, with no signed-in user — the delegated versions of these permissions are not sufficient.
-
Add both of these application permissions:
Sites.Read.All— read access to SharePoint site content.User.Read.All— lets the app resolve users and site/drive identities (required; without it, resolving a site or its drive fails).
If the same app registration will also index OneDrive, add
Files.Read.Allas well (see the OneDrive guide). -
Click Grant admin consent for <your org> on the same page, then confirm. Each permission’s Status should show a green “Granted” check. This is all done from the Azure portal — no command line or Graph call is needed.
Indexing
All three endpoints take the same auth fields plus the site URL, and differ only in scope.
A site’s whole document library
This indexes the site’s default document library (“Documents”). If the site
has additional libraries, pass the optional drive_id of the library to
index instead.
A folder (recursively)
folder_id is the folder’s Graph driveItem ID. Subfolders are indexed too.
A single file
item_id is the file’s Graph driveItem ID.
Every response is { "job_id": "...", "status": "pending" }. Poll
GET /v2/collections/{name}/jobs/{job_id} for progress, then query the
collection with POST /v2/collections/{name}/query.
What gets indexed
- Documents (PDF, DOCX, XLSX, PPTX, CSV, TXT, images, etc.): SharePoint stores files in their native formats, so everything downloads and processes directly. No export step.
- Skipped: OneNote notebooks, site pages (
.aspx), and any file the app can’t access (logged and skipped; the job continues).
Troubleshooting
Security notes
- Grants are read-only. Captain never writes to or deletes from
SharePoint. The permissions above (
Sites.Read.All,User.Read.All) are all read scopes. - To narrow access to specific sites, an admin can swap
Sites.Read.Allfor theSites.Selectedapplication permission and grant the app only the sites to be indexed; everything else in the tenant then stays invisible. - The client secret is a credential: treat it like a password. Revoke it any time under Certificates & secrets, or kill all access by deleting the App Registration.
- Captain uses the secret only to mint short-lived tokens per job; nothing durable is stored beyond the request.
- Every read appears in your Microsoft 365 audit logs, attributed to the app.