# Delete A Policy Rule
Source: https://docs.indoralabs.com/api-reference/endpoints/delete_policy_rule
DELETE /policies/{policyId}/rules/{ruleId}
Delete a policy rule. This operation is irreversible.
# Delete Redaction
Source: https://docs.indoralabs.com/api-reference/endpoints/delete_single_text_redaction
DELETE /text-detections/file/{fileId}/rect/{id}
Deletes a redaction box from a file's detection data. Associated spans that are no longer referenced by any remaining rects are automatically removed. The response returns the full updated list of redaction boxes.
# Delete Video Detection
Source: https://docs.indoralabs.com/api-reference/endpoints/delete_video-detections_id
DELETE /video-detections/{id}
Delete a specific video detection record by its unique ID. This operation permanently removes the detection metadata from the system but does not affect the original video file or its associated redacted output. Typically used for cleaning up outdated or erroneous detection runs.
# Get Text Redactions for File
Source: https://docs.indoralabs.com/api-reference/endpoints/get_file_text_redactions
GET /text-detections/file/{fileId}
Retrieve all text redaction records associated with a specific file.
# List Files
Source: https://docs.indoralabs.com/api-reference/endpoints/get_files
GET /files
List files currently stored in the system. Supports filters for status, caseId, and free-text search. You can also control pagination with limit and offset. Useful for browsing or building dashboards of uploaded files.
# Get File
Source: https://docs.indoralabs.com/api-reference/endpoints/get_files_id
GET /files/{id}
Retrieve full details for a single file by its ID. Includes metadata, status, flags, and linked cases. Use this endpoint to inspect or display the properties of a specific file in detail.
# Get Sanitization Status
Source: https://docs.indoralabs.com/api-reference/endpoints/get_files_id_redaction_status
GET /files/{id}/redaction/status
Retrieve full details for a single file by its ID. Includes metadata, status, flags, and linked cases. Use this endpoint to inspect or display the properties of a specific file in detail.
# Get File Signed URL
Source: https://docs.indoralabs.com/api-reference/endpoints/get_files_id_signed-url
GET /files/{id}/signed-url
Generates a presigned S3 URL for a specific file variant (original, redact, or OCR). Supports browser behavior overrides such as inline vs attachment, custom filename, and expiration time.
# List Policy Docs
Source: https://docs.indoralabs.com/api-reference/endpoints/get_policies
GET /files/policies
Retrieve files that were ingested as policy documents. These files are used to derive redaction rules and are not attached to cases.
# Get A Policy Rule
Source: https://docs.indoralabs.com/api-reference/endpoints/get_policy_rule
GET /policies/{policyId}/rules/{ruleId}
Retrieve a single policy rule by ID.
# Get Policy Document Rules
Source: https://docs.indoralabs.com/api-reference/endpoints/get_policy_rules
GET /policies/{policyId}/rules
Retrieve all immutable compliance rules derived from a policy document.
# Get Upload Signed Part URL
Source: https://docs.indoralabs.com/api-reference/endpoints/get_upload_sign-part
GET /upload/sign-part
Generate a signed URL for uploading a specific chunk of a file in a multipart upload session. Requires the file's storage key, UploadId, and the part number. This endpoint is typically called repeatedly until all file chunks are uploaded.
# Get Video Detections
Source: https://docs.indoralabs.com/api-reference/endpoints/get_video-detections_file_id_detections
GET /video-detections/file/{id}
Retrieve all video detection runs associated with a specific **file**. Each detection run corresponds to one processing job executed against that file (for example, a video redaction pass that looked for faces or license plates). This endpoint returns the raw detection run records exactly as stored, including the per-run `detections` array (which may be empty `[]` until a worker populates results) and the creation timestamp. Use this endpoint to: (1) list historical detection/redaction attempts for a file; (2) render overlays from the saved `detections` array; (3) debug or audit processing for a single file.
**Notes:**
- This route returns **all** runs for the file (no server-side pagination in the current implementation).
- Field names mirror the database table: `id`, `tenant_id`, `file_id`, `case_id`, `doc_id`, `detections`, `created_at`.
- `case_id` can be `null` when a detection run is not linked to a case.
- `detections` is a JSON array (serialized), typically an array of objects describing entities per time/frame. Its shape is application-defined and may evolve without breaking this contract.
# Update File
Source: https://docs.indoralabs.com/api-reference/endpoints/patch_:id
PATCH /files/{id}
Update metadata for a file by its ID. This endpoint allows changing review status, tags, department, relevancy score, and file-specific metrics like page count or duration. Commonly used after review or processing is complete.
# Create or Update Redaction
Source: https://docs.indoralabs.com/api-reference/endpoints/patch_file_text_redaction
PATCH /text-detections/file/{fileId}/rect
Creates or updates a single redaction box for a file. If the rect includes an existing ID, the rect is updated. If no ID is provided, a new manual rect is created and assigned a generated ID. The response returns the full updated list of redaction boxes for the file.
# Update Video Detection
Source: https://docs.indoralabs.com/api-reference/endpoints/patch_video-detections_id
PATCH /video-detections/{id}
Update an existing video detection record by its unique ID. This endpoint allows modifying detection data or reassigning the detection run to a different case. Commonly used when post-processing detections, adding new results, or associating an existing detection job with a case for organizational purposes. All updates are applied atomically.
# Launch Sanitization
Source: https://docs.indoralabs.com/api-reference/endpoints/post_:id_redact
POST /files/{id}/redact
Queues an asynchronous redaction job for a file. The system detects the file's media type (video, audio, image, or text) and dispatches it to the appropriate redaction pipeline. At least one policyId or manual target must be provided. The job runs asynchronously and returns immediately with a job ID and output S3 location.
# Attach Files
Source: https://docs.indoralabs.com/api-reference/endpoints/post_attach
POST /files/attach
Attach one or more files to a case. This creates a link between existing files and a specific case, enabling contextual review, redaction, or reporting. Requires authentication and org scope.
# Detach Files
Source: https://docs.indoralabs.com/api-reference/endpoints/post_detach
POST /files/detach
Detach one or more files from a case. This removes their association while keeping the file intact. Useful when a file was mistakenly linked or no longer relevant to the case.
# Update Policy Rule
Source: https://docs.indoralabs.com/api-reference/endpoints/post_policy_rules
POST /policies/{policyId}/rules
Manually create a compliance rule for a policy document. Rules are immutable; updates require delete + recreate.
# Search Semantic
Source: https://docs.indoralabs.com/api-reference/endpoints/post_search_semantic
POST /search/semantic
Perform a hybrid semantic + keyword search across uploaded files. This endpoint allows you to query text extracted from video transcripts, audio transcriptions, and documents. It blends semantic embeddings with BM25 keyword scoring to return results that are both contextually relevant and textually precise. You can optionally restrict results by case, file, or date range. Ideal for investigations, discovery, and compliance queries.
# Complete Upload
Source: https://docs.indoralabs.com/api-reference/endpoints/post_upload_complete
POST /upload/complete
Finalize an upload session. Once all file parts are uploaded, call this endpoint to persist the file record, optionally associate it with a case, and enqueue parsing/embedding jobs. This step ensures the uploaded file is fully indexed and ready for search/redaction workflows.
# Initialize Upload
Source: https://docs.indoralabs.com/api-reference/endpoints/post_upload_init
POST /upload/init
Initialize a new file upload session. This request prepares the backend and generates a pre-signed URL for S3 storage. Depending on file size, the upload may use a single PUT or a multipart upload (requiring an UploadId). Files can be uploaded in different ingestion modes: standard files (default) or policy documents. Policy uploads are treated as compliance source documents and may later be used to derive redaction or detection rules. If no ingestion mode is provided, the upload defaults to standard file ingestion.
# Introduction
Source: https://docs.indoralabs.com/api-reference/introduction
Indora Labs API – The Programmable Compliance Refinery
The **Indora Labs API** is the first programmable compliance refinery. In a single call, you can index, search,
control, and sanitize **video, audio, text, and images across 240+ file types** — with policy-backed audit logs, chain of custody, and JSON overlays you can trust in court.
**Welcome**
**Indora Labs API** is a programmable compliance refinery — one API that makes raw video · audio · text · images safe, searchable, exportable, with policy-backed audit logs and JSON overlays you can defend.
**Define policy your way**
**① Natural language** → rules — “Blur all officer faces after 3:00”, “Black out tattoos”, “Remove minors’ names”, “Strip PHI from transcripts.”
**② Upload your policy docs** → rules — drop in SOPs or legal PDFs; Indora converts them into reviewable, versioned, toggleable rules you control.
**Why teams use Indora**
Policy-driven — explicit, auditable rules (not opaque model magic).
Multi-modal — one surface for video/audio/text/images across 240+ file types.
Court-ready — chain of custody + explainable overlays for every decision.
**Flow at a glance**
File in → apply policy → job queued → status → signed URL + redacted asset + overlay JSON.
***
## Core Capabilities
Normalize and extract content from **240+ file types** — PDFs, DOCs, CAD, images, audio, and video.\
Get structured JSON and embeddings for downstream search or AI pipelines.
Run **hybrid semantic + keyword queries** across your entire dataset.\
Works seamlessly across documents, transcripts, and media files.
Apply natural-language or custom policies.\
Output both sanitized files and structured JSON overlays for integration into your workflows.
Every action is logged: who viewed what, when, and under which policy.\
Export audit logs and custody trails directly into your system.
Restrict which users can view or export which files.\
Enforce role-based permissions programmatically through the API.
Handle bulk video, audio, and document processing without bottlenecks.\
Built for GovCloud, healthcare, and other high-compliance workloads.
***
## Authentication
All API endpoints require an **API key**.\
Include it in your request headers:
```http theme={null}
x-api-key:
```
# Pricing
Source: https://docs.indoralabs.com/api-reference/pricing
Transparent, usage-based pricing for Indora Labs API — Indexing and Redaction
Indora Labs pricing is simple: **pay only for what you process**.\
Two independent pipelines — **Indexing** and **Redaction** — let you control how your data is refined.
## Indexing
Indexing converts raw files into **structured, searchable data** — extracting text, audio transcripts, images, and metadata from 240+ file types. It’s your
data-preparation layer: enabling search, retrieval, and AI analysis.
Customers can use **Indexing** without Redaction if they simply want to organize and search their data.
| Modality | Description | Price |
| ---------------------- | ------------------------------------------------------------------------------------ | ------------------ |
| **Video (with audio)** | Extracts frames, transcripts, and metadata from video + audio in one price. | **\$0.04 / min** |
| **Audio-only** | Transcribes and indexes voice recordings, calls, or podcasts. | **\$0.01 / min** |
| **Text** | Parses and normalizes PDFs, DOCX, TXT, and other text documents (≈3,000 chars/page). | **\$0.025 / page** |
| **Images** | Performs OCR and metadata indexing on each image. | **\$0.01 / image** |
💡 **Example:**
* 10-minute video → \$0.40
* 50-page PDF → \$1.25
***
## Redaction
Redaction removes **sensitive data** — faces, voices, identifiers, PII, HIPAA terms — across 240+ file types. It’s your compliance and anonymization
layer for CJIS, FOIA, HIPAA, and GDPR workflows.
Customers can use **Redaction** independently from Indexing if they only need sanitization.
| Modality | Description | Price |
| ---------------------- | --------------------------------------------------------------------------------- | ------------------ |
| **Video (with audio)** | Redacts both visual and audio streams (faces, voices, license plates). | **\$0.65 / min** |
| **Audio-only** | Anonymizes speakers, bleeps sensitive terms, and scrubs identifiers. | **\$0.05 / min** |
| **Text** | Detects and masks PII, PHI, SSNs, addresses, and other identifiers. | **\$0.15 / page** |
| **Images** | Blurs faces and plates, removes metadata, and enforces policy-level sanitization. | **\$0.05 / image** |
💡 **Example:**
* 10-minute bodycam video → \$6.50
* 100-page police report → \$15.00
***
## Key Notes
* Supports **240+ file types** across video, audio, text, and images.
* **Indexing** and **Redaction** are independent — use one or both.
* **Bundled video pricing** keeps billing simple (video + audio combined).
* **Indexing = pennies-per-minute** for adoption.
* **Redaction = premium compliance layer** with auditable overlays.
***
⚡ **Summary**
Indora Labs delivers **AI-grade indexing** and **court-defensible redaction** through one unified API.
Pay as you go — pennies to prep, dollars to protect.
# Quick Start
Source: https://docs.indoralabs.com/api-reference/quickstart
Integrate Indora Labs API in under 5 minutes
The **Indora Labs API** lets you upload, index, and automatically redact sensitive data in video, audio, text, and images — all in one unified flow.
## 🚀 Quick Start (TypeScript Example)
Below is a minimal TypeScript example showing the full lifecycle — from uploading a file to receiving a redacted version.
```tsx theme={null}
import { useState } from "react";
/**
* Quick Start Example
* Upload → Index → Redact → Retrieve
*/
export default function QuickStart() {
const [status, setStatus] = useState("Idle");
const [redactedUrl, setRedactedUrl] = useState("");
const handleUpload = async (file: File) => {
try {
setStatus("Initializing upload...");
// 1️⃣ Initialize upload
const initRes = await fetch("https://api.indoralabs.com/upload/init", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
filename: file.name,
contentType: file.type,
sizeBytes: file.size,
}),
});
const init = await initRes.json();
// 2️⃣ Upload directly to S3
await fetch(init.putUrl, { method: "PUT", body: file });
// 3️⃣ Complete upload
const completeRes = await fetch("https://api.indoralabs.com/upload/complete", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
uploadId: init.uploadId,
key: init.key,
}),
});
const complete = await completeRes.json();
const fileId = complete.file?.id;
setStatus("Launching redaction...");
// 4️⃣ Launch redaction
const redactRes = await fetch(`https://api.indoralabs.com/files/${fileId}/redact`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
targets: ["juvenile faces", "HIPAA identifiers", "license plates"],
}),
});
const job = await redactRes.json();
// 5️⃣ Poll for completion
let statusCheck = "pending";
let outputUrl = "";
while (statusCheck !== "succeeded") {
const statusRes = await fetch(
`https://api.indoralabs.com/files/${fileId}/redaction/status`
);
const statusData = await statusRes.json();
statusCheck = statusData.status;
setStatus(`Redaction status: ${statusCheck}`);
if (statusCheck === "succeeded") {
outputUrl = statusData.outputS3Uri;
break;
}
await new Promise((r) => setTimeout(r, 3000));
}
// 6️⃣ Get signed download link
const signedRes = await fetch(
`https://api.indoralabs.com/files/${fileId}/redaction/signed-url`
);
const signed = await signedRes.json();
setRedactedUrl(signed.url);
setStatus("✅ Redaction complete!");
} catch (err: any) {
setStatus(`❌ Error: ${err.message}`);
}
};
return (
);
}
```
## 💡 How It Works
| Step | Description |
| ------------------ | -------------------------------------------------------------------------------- |
| **1️⃣ Upload** | Calls `/upload/init` and uploads the file directly to S3. |
| **2️⃣ Auto Index** | After completion, Indora automatically indexes your content for semantic search. |
| **3️⃣ Redact** | Calls `/files/{id}/redact` with natural-language `targets`. |
| **4️⃣ Poll** | Uses `/files/{id}/redaction/status` until the job completes. |
| **5️⃣ Retrieve** | Fetches a signed URL from `/files/{id}/redaction/signed-url`. |
***
## 🧠 Tip: Using Natural Language Targets
Targets can be written in **plain English** — no model labels required.
```json theme={null}
["juveniles", "faces", "license plates", "names", "HIPAA identifiers"]
```
The redaction engine automatically maps these targets to the right detection models for each modality — video, audio, text, or image.
✅ In \~30 lines, you’ve built an end-to-end redaction workflow — from raw upload to sanitized, compliant output.