holectus

Embed file uploads. Gate on valid.

Your product and your agents always know which documents are valid.

Embed collection in your app. Query which documents are still good, gate the next action, and get signed webhooks when something is missing, expiring, or expired — no portal, your auth, your branding.

Read the docs
documents.tsxlive
import { DocumentChecklist } from '@holectus/react';
import '@holectus/react/styles.css';

export function SubjectDocuments({ subjectId }) {
  return (
    <DocumentChecklist
      tokenEndpoint={`/api/holectus/session?s=${subjectId}`}
    />
  );
}

Built for developers

  • Open SDKs (MIT)
  • Validity API
  • Signed webhooks
  • 2 React components

How it works

Three steps to a working workflow.

Sign up, configure slots, embed. Holectus tracks status and validity inside your product — not a portal your users log into.

1

Create an API key

Sign up, mint a key, keep it server-side. Your backend mints short-lived tokens for each embed.

2

Define document slots

Required files, optional templates, size and type rules, approval settings. Bundle slots into sets when you need packs.

3

Embed and subscribe

Mount the components. Call assert_valid before a critical action, and subscribe to signed webhooks so your backend can remind, chase, or refuse to proceed.

Components

Two React components. Your auth, your users.

Collection is how files get in. Validity is the gate. Mount both embeds behind the identity you already have — Holectus never talks to your end users.

<DocumentChecklist />subject
Required documents2 / 4

Government ID

passport.pdf · 1.2 MB

Approved

Proof of address

utility-bill.pdf · 640 KB

In review

Insurance certificate

expires in 12 days

Expiring

Signed W-9

not uploaded yet

Upload
<DocumentManager />webhooks live
Northwind Freight
drv-1042
Government ID
ApproveReject
Harbor Legal
cs-88
Engagement letter
Approved
Atlas Staffing
w-2210
Insurance cert
Expiring

Webhooks

Know when a document is no longer valid.

document.expiring, document.expired, and validity.changed land on your backend as signed events. Gate an action, send a reminder, or chase a renewal — email and SMS stay in your stack.

Read the webhook docs
document.expiredsigned
{
  "eventType": "document.expired",
  "subjectId": "drv_1042",
  "status": "expired",
  "slotName": "Insurance certificate",
  "expiresAt": "2026-08-01T00:00:00.000Z",
  "occurredAt": "2026-08-01T00:00:00.000Z"
}

The lifecycle

Approved is not the same as valid.

A reviewer accepting a file is one state. valid means the requirement is currently satisfied, including expiry math. Query it — do not re-implement the clock.

PendingUploadedIn reviewApprovedRejectedExpiringExpired
holectus

Collect the file. Gate on valid.

Get a subject checklist running today — then assert validity before you unlock the next step.

Read the docs