3

Extractor

Integration Guide

Developer Documentation

Embed Extractor in Your App

Integrate powerful AI document extraction into your application with our simple API and embeddable UI components.

1Quick Start

1. Get API Key

Create an API key from your dashboard under Settings → API Keys

2. Choose Method

Use our embeddable UI, React components, or REST API

3. Start Extracting

Upload documents and receive structured data instantly

Supported File Types

File type and size limits vary by endpoint. Maximum file size is 10MB for all uploads.

EndpointAccepted types
POST /api/embed/extractPDF (application/pdf), JPEG, PNG, WebP (image/jpeg, image/png, image/webp)
POST /api/embed/filesPDF, JPEG, PNG, WebP, plain text (text/plain), Word (.doc, .docx)

2Integration Methods

iFrame Embed

The simplest way to integrate. Just add an iframe to your page and you're ready to go.

File Upload & Extraction

Embed the file upload interface for users to upload and extract documents.

<iframe
  src="https://extractor.decoded.digital/embed?apiKey=YOUR_API_KEY&userEmail=user@example.com&appName=my-app"
  width="100%"
  height="600"
  frameborder="0"
  allow="clipboard-write"
></iframe>

Manage Documents (Templates)

Embed the documents management page to create, edit, and delete document templates with custom extraction fields.

<iframe
  src="https://extractor.decoded.digital/embed/documents?apiKey=YOUR_API_KEY&userEmail=user@example.com&appName=my-app"
  width="100%"
  height="700"
  frameborder="0"
></iframe>

View Extractions

Embed the extractions page with tabbed navigation by document type, search, and pagination.

<iframe
  src="https://extractor.decoded.digital/embed/extractions?apiKey=YOUR_API_KEY&userEmail=user@example.com&appName=my-app"
  width="100%"
  height="700"
  frameborder="0"
></iframe>

Settings (Integrations, Webhooks & API Keys)

Embed the settings page with tabbed UI for managing Microsoft integrations, outbound webhooks, and API keys.

<iframe
  src="https://extractor.decoded.digital/embed/settings?apiKey=YOUR_API_KEY&userEmail=user@example.com&appName=my-app"
  width="100%"
  height="700"
  frameborder="0"
  style="border: 1px solid #e5e7eb; border-radius: 8px;"
></iframe>

Available Embed Pages

  • /embed - File upload and extraction
  • /embed/documents - Document template management (create, edit, delete)
  • /embed/extractions - View all extractions with search, filters, and file preview
  • /embed/settings - Settings with tabs for Microsoft integrations, webhooks, and API keys

Listen for Messages

// Listen for extraction completion
window.addEventListener('message', (event) => {
  if (event.data.type === 'extraction-complete') {
    console.log('Extraction completed:', event.data.data);
    // { extractionId, fileName, status, ... }
  }
  
  if (event.data.type === 'extraction-selected') {
    console.log('Extraction selected:', event.data.data);
    // Full extraction details including extractedData
  }
});

3API Reference

Full API access for custom integrations. All endpoints require API key authentication.

Authentication

All requests require an API key and user email. The user must exist in your tenant.

# Method 1: Custom headers (recommended)
X-API-Key: ext_xxx...           # Your API key
X-User-Email: user@example.com  # User email (must exist in tenant)
X-App-Name: my-app              # Optional: identify your app

# Method 2: Bearer token
Authorization: Bearer ext_xxx...

# Method 3: Query parameters (for iframes)
?apiKey=ext_xxx...&userEmail=user@example.com&appName=my-app

Endpoints

GET/api/embed/verify

Verify API key and user, get tenant information

curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/verify

Response (data):

{
  "valid": true,
  "tenantId": "507f1f77bcf86cd799439011",
  "apiKeyName": "My API Key",
  "userEmail": "user@example.com",
  "message": "API key is valid"
}
POST/api/embed/extract

Upload a file and start extraction

curl -X POST \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  -H "X-App-Name: my-app" \
  -F "file=@document.pdf" \
  https://extractor.decoded.digital/api/embed/extract

Response:

{
  "data": {
    "success": true,
    "extractionId": "507f1f77bcf86cd799439011",
    "fileName": "document.pdf",
    "fileType": "application/pdf",
    "fileUrl": "https://...",
    "status": "processing",
    "message": "File uploaded and extraction started"
  },
  "error": null
}
GET/api/embed/extractions

List all extractions with pagination and optional filters

Query Parameters:

  • page - Page number (default: 1)
  • limit - Items per page (default: 20)
  • status - Filter by status (uploaded, analyzing, analyzed, extracting, completed, analysis failed, extraction failed, failed)
  • documentId - Filter by document template ID
  • search - Search by file name
curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  "https://extractor.decoded.digital/api/embed/extractions?page=1&limit=20&status=completed"

Response (data):

{
  "items": [
    {
      "id": "...",
      "fileName": "doc.pdf",
      "fileType": "application/pdf",
      "fileSize": 12345,
      "fileUrl": "https://...",
      "status": "completed",
      "documentId": "...",
      "documentName": "Invoice",
      "source": "embed",
      "appName": "my-app",
      "email": {
        "from": { "emailAddress": { "name": "John", "address": "john@example.com" } },
        "toRecipients": [
          { "emailAddress": { "name": "Jane", "address": "jane@example.com" } }
        ],
        "ccRecipients": [],
        "subject": "Invoice #1234",
        "bodyPreview": "Please find attached..."
      },
      "createdAt": "...",
      "updatedAt": "..."
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "totalCount": 100,
    "totalPages": 5,
    "hasNextPage": true,
    "hasPrevPage": false
  }
}
GET/api/embed/extractions/:id

Get extraction details including extracted data

curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/extractions/507f1f77bcf86cd799439011

Response (data):

{
  "id": "507f1f77bcf86cd799439011",
  "fileName": "doc.pdf",
  "fileType": "application/pdf",
  "fileSize": 12345,
  "fileUrl": "https://...",
  "status": "completed",
  "extractedData": { "vendor_name": "...", "total": "..." },
  "error": null,
  "documentId": "...",
  "document": {
    "id": "...",
    "name": "Invoice",
    "description": "...",
    "fields": []
  },
  "source": "embed",
  "appName": "my-app",
  "email": {
    "from": { "emailAddress": { "name": "John", "address": "john@example.com" } },
    "toRecipients": [
      { "emailAddress": { "name": "Jane", "address": "jane@example.com" } }
    ],
    "ccRecipients": [],
    "subject": "Invoice #1234",
    "bodyPreview": "Please find attached...",
    "body": { "contentType": "html", "content": "<html>...</html>" }
  },
  "createdAt": "...",
  "updatedAt": "..."
}
GET/api/embed/documents

List available document templates with pagination

Query Parameters:

  • page - Page number (default: 1)
  • limit - Items per page (default: 20)
  • search - Search by name or description
curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  "https://extractor.decoded.digital/api/embed/documents?page=1&limit=20"

Response (data):

{
  "items": [
    {
      "_id": "...",
      "name": "Invoice",
      "description": "...",
      "fields": [{ "key": "...", "type": "String", "description": "..." }],
      "createdAt": "...",
      "updatedAt": "..."
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "totalCount": 10,
    "totalPages": 1,
    "hasNextPage": false,
    "hasPrevPage": false
  }
}
GET/api/embed/documents/:id

Get a specific document template with field definitions

curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/documents/507f1f77bcf86cd799439011

Response (data):

{
  "id": "507f1f77bcf86cd799439011",
  "name": "Invoice",
  "description": "Invoice template",
  "fields": [{ "key": "vendor_name", "type": "String", "description": "Vendor name" }],
  "createdAt": "...",
  "updatedAt": "..."
}
POST/api/embed/documents

Create a new document template with extraction fields. Each field requires a key, type, and description.

Supported Field Types:

StringNumberBooleanDateObjectList<String>List<Object>

Use children array on Object and List<Object> fields to define nested field structures.

curl -X POST \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Invoice",
    "description": "Invoice document template",
    "fields": [
      { "id": "1", "key": "vendor_name", "type": "String", "description": "Vendor name" },
      { "id": "2", "key": "total", "type": "String", "description": "Total amount" }
    ]
  }' \
  https://extractor.decoded.digital/api/embed/documents

Response (data):

{
  "_id": "507f1f77bcf86cd799439011",
  "name": "Invoice",
  "description": "Invoice document template",
  "fields": [...],
  "createdAt": "...",
  "updatedAt": "..."
}
PUT/api/embed/documents/:id

Update an existing document template

curl -X PUT \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Invoice (Updated)",
    "description": "Updated invoice template",
    "fields": [...]
  }' \
  https://extractor.decoded.digital/api/embed/documents/507f1f77bcf86cd799439011

Response (data): same shape as Create Document

DELETE/api/embed/documents/:id

Delete a document template

curl -X DELETE \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/documents/507f1f77bcf86cd799439011

Response (data):

{ "deleted": true, "id": "507f1f77bcf86cd799439011" }
DELETE/api/embed/extractions/:id

Delete an extraction

curl -X DELETE \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/extractions/507f1f77bcf86cd799439011

Response (data):

{ "deleted": true, "id": "507f1f77bcf86cd799439011" }
POST/api/embed/extractions/:id/retry

Retry a failed extraction. Only extractions with status analysis failed, extraction failed, or failed can be retried.

curl -X POST \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/extractions/507f1f77bcf86cd799439011/retry

Response (data):

{
  "success": true,
  "extractionId": "507f1f77bcf86cd799439011",
  "message": "Extraction retry initiated"
}
GET/api/embed/files

List all uploaded files with pagination

Query Parameters:

  • page - Page number (default: 1)
  • limit - Items per page (default: 20)
  • search - Search by file name
  • fileType - Filter by MIME type
curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  "https://extractor.decoded.digital/api/embed/files?page=1&limit=20"

Response (data):

{
  "items": [
    {
      "id": "...",
      "fileName": "doc.pdf",
      "fileType": "application/pdf",
      "fileSize": 12345,
      "fileUrl": "https://...",
      "status": "uploaded",
      "source": "embed",
      "appName": "my-app",
      "createdAt": "...",
      "updatedAt": "..."
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "totalCount": 50,
    "totalPages": 3,
    "hasNextPage": true,
    "hasPrevPage": false
  }
}
POST/api/embed/files

Upload a file without immediate extraction (supports PDF, images, text, Word docs)

curl -X POST \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  -H "X-App-Name: my-app" \
  -F "file=@document.pdf" \
  -F "description=Invoice document" \
  https://extractor.decoded.digital/api/embed/files

Response (data):

{
  "id": "507f1f77bcf86cd799439011",
  "fileName": "document.pdf",
  "fileType": "application/pdf",
  "fileSize": 12345,
  "fileUrl": "https://...",
  "status": "uploaded",
  "message": "File uploaded successfully"
}

Webhooks

GET/api/embed/webhooks

List all webhooks for the authenticated tenant

curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/webhooks

Response (data):

[
  {
    "_id": "507f1f77bcf86cd799439011",
    "name": "My Webhook",
    "url": "https://example.com/webhook",
    "scope": "all",
    "documentIds": [],
    "isActive": true,
    "tenantId": "...",
    "createdAt": "...",
    "updatedAt": "..."
  }
]
POST/api/embed/webhooks

Create a new outbound webhook to receive notifications when extractions complete

curl -X POST \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Webhook",
    "url": "https://example.com/webhook",
    "scope": "all",
    "documentIds": []
  }' \
  https://extractor.decoded.digital/api/embed/webhooks

Request Body:

  • name (required) - Webhook display name
  • url (required) - HTTPS endpoint URL
  • scope - "all" (default) or "selected"
  • documentIds - Array of document template IDs (required when scope is "selected")

Response (data): created webhook object (HTTP 201)

PUT/api/embed/webhooks/:id

Update an existing webhook. All fields are optional.

curl -X PUT \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated Webhook",
    "url": "https://example.com/new-webhook",
    "isActive": false,
    "scope": "selected",
    "documentIds": ["507f1f77bcf86cd799439011"]
  }' \
  https://extractor.decoded.digital/api/embed/webhooks/507f1f77bcf86cd799439011

Response (data): updated webhook object

DELETE/api/embed/webhooks/:id

Delete a webhook

curl -X DELETE \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/webhooks/507f1f77bcf86cd799439011

Response (data):

{ "message": "Webhook deleted successfully", "deletedId": "507f1f77bcf86cd799439011" }

API Keys

GET/api/embed/api-keys

List all API keys for the authenticated tenant

curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/api-keys

Response (data):

[
  {
    "_id": "507f1f77bcf86cd799439011",
    "name": "Production Key",
    "key": "ext_abc123...",
    "isActive": true,
    "expiresAt": null,
    "allowedDomains": ["example.com"],
    "usageCount": 42,
    "lastUsedAt": "...",
    "createdAt": "...",
    "updatedAt": "..."
  }
]
POST/api/embed/api-keys

Create a new API key. The full key is only returned once in this response — store it securely.

curl -X POST \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Staging Key",
    "expiresAt": "2026-12-31T00:00:00Z",
    "allowedDomains": ["staging.example.com"]
  }' \
  https://extractor.decoded.digital/api/embed/api-keys

Request Body:

  • name (required) - Display name for the key
  • expiresAt (optional) - ISO 8601 expiration date (must be in the future)
  • allowedDomains (optional) - Array of allowed domains for iframe embeds

Response (data): created API key object with full key value (HTTP 201)

PUT/api/embed/api-keys/:id

Update an existing API key. You cannot deactivate the key you are currently using for authentication.

curl -X PUT \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Renamed Key",
    "isActive": true,
    "expiresAt": "2027-06-30T00:00:00Z",
    "allowedDomains": ["example.com", "*.example.com"]
  }' \
  https://extractor.decoded.digital/api/embed/api-keys/507f1f77bcf86cd799439011

Response (data): updated API key object

DELETE/api/embed/api-keys/:id

Delete an API key. You cannot delete the key you are currently using for authentication.

curl -X DELETE \
  -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/api-keys/507f1f77bcf86cd799439011

Response (data):

{ "message": "API key deleted successfully", "deletedId": "507f1f77bcf86cd799439011" }

Tenants

GET/api/embed/tenants/:id

Get your tenant details including integration status. You can only access your own tenant.

curl -H "X-API-Key: ext_xxx" \
  -H "X-User-Email: user@example.com" \
  https://extractor.decoded.digital/api/embed/tenants/507f1f77bcf86cd799439011

Response (data):

{
  "_id": "507f1f77bcf86cd799439011",
  "name": "Acme Corp",
  "status": "active",
  "integrations": {
    "microsoft": {
      "accounts": [
        {
          "accountId": "...",
          "email": "user@acme.com",
          "connectedAt": "..."
        }
      ]
    }
  },
  "createdAt": "...",
  "updatedAt": "..."
}

4Onboarding API (For Host Applications)

🚀 Getting Started as a Host Application

If you're integrating Extractor into your application, use these endpoints to onboard your organization and manage users programmatically. This creates a tenant, admin user, and API key in one call.

POST/api/embed/onboardSetup Key Required

Create a new tenant, owner user, and API key in one call. This is used for initial integration setup. Store the returned API key securely - it won't be shown again.

Request Headers
X-Setup-Key: your-setup-key  # Provided by Extractor team
Request Body
{
  "organizationName": "Acme Corp",      // Required: Your organization name
  "firstName": "John",                   // Required: Admin user first name
  "lastName": "Doe",                     // Required: Admin user last name
  "email": "john@acme.com",             // Required: Admin user email
  "apiKeyName": "Production API Key",   // Optional: Custom name for API key
  "allowedDomains": ["acme.com", "*.acme.com"],  // Optional: Domain restrictions
  "hasExpiry": false,                    // Optional: Set true for expiring key
  "expiryDays": 90,                      // Optional: Days until expiry (1-365)
  "appName": "my-app"                    // Optional: Identify your app for source tracking
}
Example Request
curl -X POST \
  -H "Content-Type: application/json" \
  -H "X-Setup-Key: your-setup-key" \
  -d '{
    "organizationName": "Acme Corp",
    "firstName": "John",
    "lastName": "Doe",
    "email": "john@acme.com"
  }' \
  https://extractor.decoded.digital/api/embed/onboard
Response
{
  "data": {
    "message": "Successfully onboarded. Store the API key securely - it won't be shown again.",
    "tenant": {
      "id": "507f1f77bcf86cd799439011",
      "name": "Acme Corp"
    },
    "user": {
      "id": "507f1f77bcf86cd799439012",
      "firstName": "John",
      "lastName": "Doe",
      "email": "john@acme.com",
      "role": "owner",
      "isExistingUser": false
    },
    "apiKey": {
      "id": "507f1f77bcf86cd799439013",
      "name": "Acme Corp - Embed API Key",
      "key": "ext_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "expiresAt": null,
      "allowedDomains": []
    }
  },
  "error": null
}
POST/api/embed/usersAPI Key Required

Create a new user in your tenant. Use this when a new user signs up in your application and needs access to Extractor features. Note: This endpoint does NOT require X-User-Email header since you're creating a new user.

Request Body
{
  "firstName": "Jane",          // Required
  "lastName": "Smith",          // Required
  "email": "jane@acme.com",     // Required
  "role": "member"              // Optional: "owner", "admin", or "member" (default)
}
Example Request
curl -X POST \
  -H "Content-Type: application/json" \
  -H "X-API-Key: ext_xxx..." \
  -d '{
    "firstName": "Jane",
    "lastName": "Smith",
    "email": "jane@acme.com",
    "role": "member"
  }' \
  https://extractor.decoded.digital/api/embed/users
Response
{
  "data": {
    "message": "User created successfully",
    "user": {
      "id": "507f1f77bcf86cd799439014",
      "firstName": "Jane",
      "lastName": "Smith",
      "email": "jane@acme.com",
      "role": "member",
      "createdAt": "2026-03-11T10:30:00.000Z"
    }
  },
  "error": null
}

Note: If the user already exists globally but is not yet a member of your tenant, they will be added to your tenant and the response will return HTTP 200 with message "User added to tenant successfully" instead of 201. If the user already exists in your tenant, you will receive a 409 Conflict error.

GET/api/embed/users

List all users in your tenant with pagination and search.

Query Parameters:

  • page - Page number (default: 1)
  • limit - Items per page (default: 20)
  • search - Search by name or email
curl -H "X-API-Key: ext_xxx..." \
  -H "X-User-Email: admin@acme.com" \
  "https://extractor.decoded.digital/api/embed/users?page=1&limit=20"

Response (data):

{
  "items": [
    {
      "id": "...",
      "firstName": "Jane",
      "lastName": "Smith",
      "email": "jane@acme.com",
      "role": "member",
      "createdAt": "...",
      "updatedAt": "..."
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "totalCount": 5,
    "totalPages": 1,
    "hasNextPage": false,
    "hasPrevPage": false
  }
}

📋 Recommended Integration Flow

  1. 1
    Initial Setup: Call /api/embed/onboard with your setup key to create your organization, admin user, and get your API key.
  2. 2
    Store API Key: Securely store the returned API key in your backend (environment variable, secrets manager, etc.).
  3. 3
    User Sync: When a new user signs up in your app, call POST /api/embed/users to create them in your tenant.
  4. 4
    Embed or API: Use the API key with user email headers to embed the extractor UI or call extraction APIs.

5Response Format

Success Response

{
  "data": {
    // Response data here
  },
  "error": null
}

Error Response

{
  "data": null,
  "error": "Error message describing what went wrong"
}

Common HTTP Status Codes

200
Success
201
Created
400
Bad Request
401
Unauthorized
403
Forbidden
404
Not Found
409
Conflict
500
Server Error

Error Codes & Troubleshooting

All errors return { "data": null, "error": "message" }. Use the HTTP status code and error message to resolve issues.

400 Bad Request
  • Missing or invalid fields (e.g. firstName is required, Invalid email format)
  • Invalid file type or file size > 10MB for upload/extract
  • Invalid document ID or extraction ID format
401 Unauthorized
  • Missing API key (provide via X-API-Key, Authorization: Bearer, or apiKey query param)
  • Invalid or unknown API key
  • API key disabled or expired
  • Invalid or missing setup key (for /api/embed/onboard)
403 Forbidden
  • User not a member of this organization (X-User-Email not in tenant)
  • Domain not allowed (iframe embed from a domain not in the API key's allowedDomains)
404 Not Found
  • User with email not found
  • Extraction, document, or resource not found or not in your tenant
409 Conflict
  • User with this email already exists in this tenant (POST /api/embed/users)
500 Server Error
  • Failed to upload file to storage, create analysis job, or internal error. Retry or contact support.

6Security Best Practices

Do

  • ✓ Store API keys securely (environment variables)
  • ✓ Use HTTPS for all requests
  • ✓ Set domain restrictions for iframe embeds
  • ✓ Use expiring API keys for temporary access
  • ✓ Monitor API usage in your dashboard
  • ✓ Rotate API keys periodically

Don't

  • ✗ Expose API keys in client-side code
  • ✗ Share API keys across different applications
  • ✗ Store API keys in version control
  • ✗ Use production keys in development
  • ✗ Ignore API key expiration warnings

Domain Restrictions

When creating an API key, you can restrict which domains can use it for iframe embedding. This prevents unauthorized sites from using your embed.

# Examples of domain restrictions:
example.com          # Exact match
*.example.com        # All subdomains
app.example.com      # Specific subdomain
localhost            # Local development

7Extraction Status Flow

uploaded
analyzing
analyzed
extracting
completedorfailed
uploaded
File uploaded, waiting to be analyzed
analyzing
AI is analyzing the document to identify its type
analyzed
Analysis complete, document type identified
extracting
AI is extracting structured data from the document
completed
Extraction complete, data available in extractedData
analysis failed
Document analysis failed — retryable
extraction failed
Data extraction failed — retryable
failed
General failure — retryable

Retrying Failed Extractions

Extractions with status analysis failed, extraction failed, or failed can be retried via POST /api/embed/extractions/:id/retry. The extraction will be reset to uploaded and re-processed from the beginning.

Need Help?

Our team is here to help you integrate Extractor into your application. Reach out for technical support or custom integration requirements.