The data layer your agents actually use
Collections, records, relationships, and file attachments — created at runtime, no migrations. Access via MCP tools, CLI, or REST API.
// Agent creates a collection and upserts a record
> manage_collection({ action: "upsert", workspace_id: "ws_ops",
collection: "incidents", json_schema: {
type: "object",
required: ["title", "severity", "status"],
properties: {
title: { type: "string" },
severity: { type: "string", enum: ["p0","p1","p2","p3"] },
status: { type: "string", enum: ["open","investigating","resolved"] },
assignee: { type: "string" }
}
}
})
< { id: "incidents", name: "incidents", version: 1 }
> manage_record({ action: "upsert", workspace_id: "ws_ops",
collection: "incidents",
external_id: "INC-2847", external_source: "pagerduty",
data: {
title: "API latency spike in us-east-1",
severity: "p1",
status: "investigating",
assignee: "oncall@team.dev"
}
})
< { id: "01961a3b-...", external_id: "INC-2847", version: 1 }Three Primitives
Everything in Rekor is a collection, a record, or a relationship between records.
Collection
JSON Schema defining a record type. Created at runtime, no migrations needed.
rekor collections upsert incidents \
--schema '{"type":"object","properties":{"title":{"type":"string"}}}'Record
JSON document conforming to a collection schema. Upsert by external ID for idempotency.
rekor records upsert incidents \
--external-id INC-2847 --source pagerduty \
--data '{"title":"API spike","severity":"p1"}'Relationship
Typed, directed link between two records with metadata. First-class entity, queryable in any direction.
rekor relationships upsert \
--type caused_by --source incidents/rec_1 \
--target deployments/rec_2Capabilities
Atomic, consistent writes per workspace
Filter, sort, and aggregate at scale
Upload and retrieve files linked to any record
Up to 100 atomic operations in a single request
Inbound webhooks — external systems push data in
Outbound webhooks — react to data changes
Three Interfaces
11 tools for AI agents
Full command-line interface
Standard HTTP API
File Attachments
Attach files to any record. Agents upload directly via presigned URLs and retrieve signed download links on demand.
# Upload files with folder structure
rekor attachments upload incidents rec_abc \
--filename docs/runbook.md --content-type text/markdown
rekor attachments upload incidents rec_abc \
--filename docs/screenshots/error.png --content-type image/png
# Get a signed download URL for any file
rekor attachments url incidents rec_abc --filename docs/runbook.md
# List all files, or filter by folder
rekor attachments list incidents rec_abc --prefix docs/One Interface, Any Data Source
Connect collections to external APIs like Stripe, Salesforce, or any REST endpoint. Agents use the same tools — Rekor handles the integration.
# Same tool, different backends — the agent doesn't know the difference
# Upsert a Stripe invoice (proxied to Stripe API)
rekor records upsert invoices \
--external-id inv_2847 --source stripe \
--data '{"amount":5000,"status":"issued"}'
# Upsert a native record (stored in Rekor)
rekor records upsert notes \
--data '{"title":"Follow up on invoice"}'
# Query records — same interface for both
rekor records query invoices --source stripe --limit 10Hooks & Triggers
Connect Rekor to external systems in both directions. Hooks receive data in; triggers push notifications out.
# Create a hook — external systems POST data to Rekor
rekor hooks create --workspace my-workspace \
--name "PagerDuty Incidents" --collection incidents
# Hook returns a unique URL: /v1/{ws}/hooks/{hook_id}/ingest
# External system POSTs JSON → Rekor creates a record automatically
# Create a trigger — Rekor notifies you when data changes
rekor triggers create --workspace my-workspace \
--name "Notify Slack on P1" --collection incidents \
--url https://hooks.slack.com/services/T00/B00/xxx \
--events '["create","update"]'
# When a record is created or updated, Rekor POSTs to the URL
# with an HMAC signature for authenticityBatch Operations
Group multiple writes into a single atomic request. All operations succeed together or fail together — no partial state.
# Atomic operations — all succeed or all fail
rekor batch --workspace my-workspace --operations '[
{"type":"upsert_record","collection":"orders",
"data":{"customer":"Acme","total":5000}},
{"type":"upsert_record","collection":"line_items",
"data":{"product":"Widget","qty":10}},
{"type":"upsert_relationship",
"rel_type":"contains",
"source_collection":"orders","source_id":"ord_1",
"target_collection":"line_items","target_id":"li_1"}
]'
# Up to 100 operations per batch
# Records, relationships, and collections supportedEnvironments
Agents experiment in preview workspaces. Humans review and promote to production. Schema compatibility checks catch breaking changes before they ship.
# Create a preview workspace to experiment safely
rekor workspaces create-preview my-workspace --name "add-invoices"
# Agent works freely in preview — modify schemas, test with data
rekor collections upsert invoices \
--workspace my-workspace--add-invoices \
--schema '{"type":"object","properties":{"amount":{"type":"number"}}}'
# Human reviews and promotes to production
rekor workspaces promote my-workspace \
--from my-workspace--add-invoices --dry-run
# Apply when ready
rekor workspaces promote my-workspace \
--from my-workspace--add-invoices