TimeBack Caliper 1EdTech

Caliper Analytics 1.2 API reference for learning activity events.

Use this page to mint a demo token, send a standards-preserving Caliper Sensor API envelope, inspect the stored event and envelope through TimeBack read projections, and trace every field and behavior back to approved architecture and data dictionary anchors.

Quickstart

Send one Caliper envelope and read it back.

The Sensor API write endpoint returns 204 No Content, so the verification step uses the event IRI you sent. Demo and real tenants use the same canonical base URL; only the tenant and token change.

Demo setup

Use the shared implementation deploy for unauthenticated demo token minting. The seeded demo tenant is the platform tenant UUID 00000000-0000-4000-8000-00000000ca12.

export CALIPER_BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/caliper/1edtech/implementation/api"
export BASE="$CALIPER_BASE_URL"

export DEMO_TENANT_ID="00000000-0000-4000-8000-00000000ca12"
DEMO_TOKEN_RESPONSE=$(curl -fsS -X POST "$BASE/dev/mint?tenantId=$DEMO_TENANT_ID")
export TOKEN=$(node -e 'const r=JSON.parse(process.argv[1]); process.stdout.write(r.token)' "$DEMO_TOKEN_RESPONSE")
export TENANT=$(node -e 'const r=JSON.parse(process.argv[1]); process.stdout.write(r.tenantId)' "$DEMO_TOKEN_RESPONSE")
export SENSOR_IRI=$(node -e 'const r=JSON.parse(process.argv[1]); process.stdout.write(r.sensorIri || "https://timeback.example.edu/sensors/caliper-demo")' "$DEMO_TOKEN_RESPONSE")

Real-tenant setup

Real-tenant tokens are minted out of band. The loop driver writes CALIPER_BASE_URL and CALIPER_REVIEWER_JWT to .env.local; the tenant header comes from the token claim.

set -a
source .env.local
set +a

export BASE="${CALIPER_BASE_URL:?driver has not written the canonical Caliper implementation URL}"
export TOKEN="${CALIPER_REVIEWER_JWT:?driver has not minted the Caliper reviewer JWT}"
export TENANT=$(node -e 'const token=process.env.CALIPER_REVIEWER_JWT || ""; const part=token.split(".")[1]; if (!part) process.exit(1); process.stdout.write(JSON.parse(Buffer.from(part, "base64url")).tenantId)')

Create the envelope

This sample uses Caliper's official names: sensor, sendTime, dataVersion, Event id/type/actor/action/object/eventTime, and standard entity classes. The example data is synthetic.

export EVENT_IRI="urn:uuid:$(node -e 'process.stdout.write(crypto.randomUUID())')"
cat > caliper-envelope.json <<JSON
{
  "sensor": "$SENSOR_IRI",
  "sendTime": "2026-05-24T15:00:00.000Z",
  "dataVersion": "http://purl.imsglobal.org/ctx/caliper/v1p2",
  "data": [
    {
      "@context": "http://purl.imsglobal.org/ctx/caliper/v1p2",
      "id": "$EVENT_IRI",
      "type": "AssessmentItemEvent",
      "actor": {
        "id": "https://timeback.example.edu/users/student-1",
        "type": "Person",
        "name": "Ada Learner"
      },
      "action": "Completed",
      "object": {
        "id": "https://timeback.example.edu/items/fractions-1",
        "type": "AssessmentItem",
        "name": "Fractions check"
      },
      "generated": {
        "id": "https://timeback.example.edu/attempts/attempt-1",
        "type": "Attempt",
        "count": 1,
        "assignable": {
          "id": "https://timeback.example.edu/assignments/fractions",
          "type": "AssignableDigitalResource",
          "name": "Fractions practice"
        }
      },
      "eventTime": "2026-05-24T14:59:42.000Z",
      "edApp": {
        "id": "https://timeback.example.edu/apps/timeback",
        "type": "SoftwareApplication",
        "name": "TimeBack"
      },
      "group": {
        "id": "https://timeback.example.edu/classes/math-3-a",
        "type": "CourseSection",
        "name": "Math 3A"
      },
      "membership": {
        "id": "https://timeback.example.edu/memberships/student-1-math-3-a",
        "type": "Membership",
        "roles": [
          "Learner"
        ],
        "status": "Active"
      },
      "extensions": {
        "https://timeback.example.edu/extensions/outcomeScore": 1
      }
    }
  ]
}
JSON
cat caliper-envelope.json

Post it

A successful request produces no body. Retry with the same payload is safe because Caliper canonical hashes deduplicate the envelope and event.

export POST_HEADERS=$(mktemp)
export POST_BODY=$(mktemp)
export IDEMPOTENCY_KEY="caliper-demo-$(date +%s)-$(node -e 'process.stdout.write(crypto.randomUUID())')"
curl -fsS -D "$POST_HEADERS" -o "$POST_BODY" -X POST "$BASE/caliper/v1p2/events" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Timeback-Tenant: $TENANT" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --data @caliper-envelope.json
export ENVELOPE_HASH=$(grep -i '^caliper-envelope-hash:' "$POST_HEADERS" | head -1 | cut -d' ' -f2 | tr -d '\r')
test -n "$ENVELOPE_HASH"
HTTP/2 204

Verify the event

Read projection endpoints are TimeBack operational APIs for demo, QC, and integration proof. They are not official Caliper Sensor API certification operations.

curl -fsS -G "$BASE/caliper/v1p2/events" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Timeback-Tenant: $TENANT" \
  --data-urlencode "eventIri=$EVENT_IRI"

Verify the envelope

The write response exposes the canonical envelope hash in the caliper-envelope-hash header. Use that hash to inspect the envelope projection without reading source code or database rows.

curl -fsS -G "$BASE/caliper/v1p2/envelopes" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Timeback-Tenant: $TENANT" \
  --data-urlencode "hash=$ENVELOPE_HASH"

Authentication

Tenant, token, and sensor all have to agree.

Caliper defines sensors and secured endpoints; platform3 adds tenant-scoped JWT verification and a sensor registry so learner activity cannot cross customer boundaries. There is one implementation deploy: CALIPER_BASE_URL is the base for demo and real tenants.

ControlRequirementBehaviorTrace
Bearer JWTRequired for every endpoint except the demo-only token mint helper.Token signature is HS256 with PLATFORM_JWT_SIGNING_SECRET. The tenantId claim must match X-Timeback-Tenant before any payload is normalized.Sensor registration, tenant resolution, and bearer auth
X-Timeback-TenantRequired for Sensor API writes and read projections.The header is the storage boundary. Use 00000000-0000-4000-8000-00000000ca12 for the public seed tenant; use the tenantId claim in operator-minted JWTs for real tenants. Do not infer tenancy from actor, group, or Person identifiers.caliper.event.tenant_id
Active sensor IRIRequired inside every envelope.The envelope sensor must resolve to an active caliper.sensor row for the tenant. Paused, retired, unknown, and cross-tenant sensors return 403.caliper.sensor.sensor_iri
Content-Typeapplication/json for POST /caliper/v1p2/events.This surface accepts JSON-LD Caliper envelopes over HTTPS. Unsupported media types return 415.Sensor API response and error contract
Idempotency-KeyOptional on Sensor API writes.Canonical envelope and event hashes handle Caliper retries. If the optional platform idempotency key is reused with different content, the response is 409.Canonical hashes and retry-safe idempotency

Errors

Problem JSON is redacted and status codes are stable.

Successful Sensor API writes return 204. Error responses use platform Problem JSON with enough detail to fix a client, but they never echo raw learner payloads, bearer tokens, IP addresses, user agents, or direct student PII.

Problem shape

{
  "type": "https://platform.timeback.com/problems/source-validation-failed",
  "code": "source_validation_failed",
  "title": "Unsupported Caliper vocabulary",
  "status": 422,
  "detail": "The request uses a value outside the Caliper Analytics 1.2 term index.",
  "requestId": "req_01HTIMEBACKCALIPER",
  "traceId": "trace_01HTIMEBACKCALIPER",
  "fieldErrors": [
    {
      "field": "data[0].action",
      "code": "unsupported_caliper_action",
      "message": "Use a Caliper Analytics 1.2 action term such as Completed."
    }
  ]
}

Common fix order

  1. Check Authorization, expiration, and tenant claim first for 401/403.
  2. Check Content-Type, required envelope fields, and JSON parse errors for 400/415.
  3. Check Caliper controlled terms, timestamps, and dataVersion for 422.
  4. Check whether an optional Idempotency-Key was reused with different content for 409.
StatusNameApplies toMeaning
200OKgetCaliperEventProjection, getCaliperEnvelopeProjection, mintDemoTokenThe read or demo helper request succeeded and returned JSON.
204No ContentpersistCaliperEnvelopeThe Sensor API envelope was accepted or safely deduplicated; no JSON body is returned.
400Bad RequestpersistCaliperEnvelope, mintDemoTokenMalformed JSON, missing required envelope fields, empty data array, invalid tenantId format, or invalid query syntax.
401UnauthorizedpersistCaliperEnvelope, getCaliperEventProjection, getCaliperEnvelopeProjectionMissing, expired, malformed, or wrongly signed bearer token.
403ForbiddenpersistCaliperEnvelope, getCaliperEventProjection, getCaliperEnvelopeProjection, mintDemoTokenThe token is valid but not authorized for the X-Timeback-Tenant value or the envelope sensor, or /dev/mint was called for a tenant that the public demo helper is not allowed to mint.
404Not FoundgetCaliperEventProjection, getCaliperEnvelopeProjectionNo event or envelope exists for this tenant and identifier.
409ConflictpersistCaliperEnvelopeThe optional Idempotency-Key was reused with a different payload, method, path, tenant, module, or surface.
415Unsupported Media TypepersistCaliperEnvelopeContent-Type is not application/json.
422Unprocessable ContentpersistCaliperEnvelopeThe JSON shape parses, but dataVersion, event type, action, entity type, timestamp, profile, extension, or privacy validation fails.
500Server ErrorpersistCaliperEnvelope, getCaliperEventProjection, getCaliperEnvelopeProjectionUnexpected platform failure. Problem JSON stays redacted and never includes learner payloads or tokens.

Compliance Map

What is Caliper, and what is TimeBack gap fill.

The customer contract keeps official Caliper concepts exact and labels platform behavior that Caliper leaves unspecified.

Workflows

What a client can build from this page.

The implementation deliverable must satisfy these workflows without inventing behavior outside the approved architecture, data dictionary, and customer website.

Send and inspect a learning event

  1. Mint a demo token with mintDemoToken or use CALIPER_REVIEWER_JWT in production review.
  2. Create a Caliper Analytics 1.2 envelope with a stable event id that you can query later.
  3. POST it to persistCaliperEnvelope and expect 204 No Content.
  4. Call getCaliperEventProjection with the same event IRI to verify persisted normalized evidence.

Build a tenant-scoped learning activity inbox

  1. Post events from the app or sensor with tenant-scoped bearer tokens.
  2. Store only event IRIs and envelope hashes in your app if you need local UI state; use the Caliper API as the data layer.
  3. Read individual events through getCaliperEventProjection and render actor, action, object, profile, and eventTime.
  4. Do not scrape raw database tables or invent an Alpha vocabulary on this 1EdTech surface.

API Reference

One Sensor API write, two read projections, one demo helper.

The write endpoint is the Caliper Sensor API receiver. The read endpoints are TimeBack operational projections that make demo, QC, and integration proof possible without direct database access.

Demo helper

mintDemoToken

Mint a short-lived JWT for the public demo tenant on the shared implementation deploy.

#
POST/dev/mint?tenantId={tenantId}

Vercel serverless root route: /api/dev/mint?tenantId={tenantId}. The customer-facing implementation API base already ends in /api.

Request
Unauthenticated for the seeded demo tenant UUID 00000000-0000-4000-8000-00000000ca12. Real-tenant tokens are issued out of band.
Response
Returns a JWT plus the seeded tenant and sensor IRI the demo accepts.
Status codes
200 400 403

Request schema

FieldInTypeRequiredDescriptionTrace
tenantIdQueryuuidRequiredUse the seeded demo platform tenant UUID 00000000-0000-4000-8000-00000000ca12. Malformed or missing values return 400; real-tenant tokens are not minted by this helper.platform.tenant.tenant_id
AuthorizationHeadernoneNot allowedNo bearer token is required for public demo token minting. Real-tenant JWTs are minted by operators or by the loop driver.Sensor registration, tenant resolution, and bearer auth

Response schema

FieldInTypeRequiredDescriptionTrace
tokenResponsestringRequiredHS256 bearer token signed with the platform secret and scoped to the demo tenant.Sensor registration, tenant resolution, and bearer auth
tenantIdResponseuuidRequiredThe seeded demo tenant UUID 00000000-0000-4000-8000-00000000ca12.platform.tenant.tenant_id
roleResponsestringRequiredDemo role, usually sensor_writer or reviewer.Sensor registration, tenant resolution, and bearer auth
sensorIriResponseIRIRequired for quickstartSeeded active sensor IRI accepted by POST /caliper/v1p2/events for the demo tenant.caliper.sensor.sensor_iri
expiresAtResponsedate-timeRequiredExpiration time after which the token returns 401.Sensor registration, tenant resolution, and bearer auth

cURL

export DEMO_TENANT_ID="00000000-0000-4000-8000-00000000ca12"
DEMO_TOKEN_RESPONSE=$(curl -fsS -X POST "$BASE/dev/mint?tenantId=$DEMO_TENANT_ID")
export TOKEN=$(node -e 'const r=JSON.parse(process.argv[1]); process.stdout.write(r.token)' "$DEMO_TOKEN_RESPONSE")
export TENANT=$(node -e 'const r=JSON.parse(process.argv[1]); process.stdout.write(r.tenantId)' "$DEMO_TOKEN_RESPONSE")
export SENSOR_IRI=$(node -e 'const r=JSON.parse(process.argv[1]); process.stdout.write(r.sensorIri || "https://timeback.example.edu/sensors/caliper-demo")' "$DEMO_TOKEN_RESPONSE")

Example response

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.demo.signature",
  "tenantId": "00000000-0000-4000-8000-00000000ca12",
  "role": "sensor_writer",
  "sensorIri": "https://timeback.example.edu/sensors/caliper-demo",
  "expiresAt": "2026-05-24T16:00:00.000Z"
}

Caliper Sensor API

persistCaliperEnvelope

Receive one Caliper Analytics 1.2 Sensor API envelope.

#
POST/caliper/v1p2/events
Request
JSON body containing sensor, sendTime, dataVersion, and a non-empty data array of Caliper Events or Entities.
Response
Successful ingest returns 204 No Content. Verify the stored event by querying the TimeBack read projection with the event IRI you sent.
Status codes
204 400 401 403 409 415 422 500

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, unexpired platform token. tenantId must match X-Timeback-Tenant.Sensor registration, tenant resolution, and bearer auth
X-Timeback-TenantHeadertenant uuidRequiredTenant boundary for the envelope, sensor lookup, and all normalized rows. Use the tenantId returned by demo minting or the tenantId claim from a real-tenant JWT.caliper.envelope.tenant_id
Content-TypeHeaderapplication/jsonRequiredOnly JSON Sensor API envelopes are accepted by this HTTP surface.Sensor API response and error contract
Idempotency-KeyHeaderstringOptionalOptional platform retry key. Duplicate Caliper delivery is still deduplicated by canonical envelope/event hashes.platform.idempotency_key.request_hash
sensorBodyIRI or Sensor entityRequiredCaliper envelope sensor. It must resolve to an active caliper.sensor row for the tenant.caliper.envelope.sensor_iri
sendTimeBodydate-timeRequiredCaliper envelope sendTime supplied by the sender.caliper.envelope.send_time
dataVersionBodyIRIRequiredMust be http://purl.imsglobal.org/ctx/caliper/v1p2 for this surface.caliper.envelope.data_version
data[]Bodyarray<Event|Entity>RequiredAt least one Event or described Entity. Event rows require id, type, actor, action, object, and eventTime.caliper.event

Response schema

FieldInTypeRequiredDescriptionTrace
bodyResponseemptyAlways empty on success204 No Content has no JSON body. Use the read projections for envelope/event evidence.Sensor API response and error contract
raw_envelopeResponsejsonbPersisted, not returnedOriginal JSON-LD envelope is stored as the interchange authority.caliper.envelope.raw_envelope
envelope_hashResponsesha256Persisted, not returnedCanonical envelope hash used for duplicate detection and read projection lookup.caliper.envelope.envelope_hash

cURL

export POST_HEADERS=$(mktemp)
export POST_BODY=$(mktemp)
export IDEMPOTENCY_KEY="caliper-demo-$(date +%s)-$(node -e 'process.stdout.write(crypto.randomUUID())')"
curl -fsS -D "$POST_HEADERS" -o "$POST_BODY" -X POST "$BASE/caliper/v1p2/events" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Timeback-Tenant: $TENANT" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --data @caliper-envelope.json
export ENVELOPE_HASH=$(grep -i '^caliper-envelope-hash:' "$POST_HEADERS" | head -1 | cut -d' ' -f2 | tr -d '\r')
test -n "$ENVELOPE_HASH"

Example response

HTTP/2 204

TimeBack read projection

getCaliperEventProjection

Read one tenant-owned Caliper event projection by event IRI.

#
GET/caliper/v1p2/events?eventIri={eventIri}
Request
Authenticated read projection for verification, demo, QC, and integration apps. This is not an official Caliper Sensor API operation.
Response
Returns normalized event metadata plus the raw Caliper event for the caller's tenant.
Status codes
200 401 403 404 500

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredToken tenantId must match X-Timeback-Tenant.Sensor registration, tenant resolution, and bearer auth
X-Timeback-TenantHeadertenant idRequiredTenant boundary for the event lookup. Must match the token tenantId claim.caliper.event.tenant_id
eventIriQueryIRIRequiredCaliper Event id supplied in the original event object.caliper.event.event_iri

Response schema

FieldInTypeRequiredDescriptionTrace
eventRowIdResponseuuidRequiredPlatform row identifier for the normalized event.caliper.event.event_row_id
envelopeIdResponseuuidRequiredEnvelope row that carried the event.caliper.event.envelope_id
eventIriResponseIRIRequiredCaliper event id.caliper.event.event_iri
eventTypeResponseenumRequiredCaliper Event subclass such as AssessmentItemEvent.caliper.event.event_type
profileResponseenumRequiredCaliper profile. If omitted by the sender, this projection may infer it from event type without changing raw_event.caliper.event.profile
actionResponseenumRequiredCaliper action term.caliper.event.action
eventTimeResponsedate-timeRequiredLearning activity timestamp.caliper.event.event_time
rawEventResponsejsonRequiredOriginal Caliper JSON-LD event. Returned only to the authenticated tenant.caliper.event.raw_event
eventHashResponsesha256RequiredCanonical event hash used for replay evidence.caliper.event.event_hash

cURL

curl -fsS -G "$BASE/caliper/v1p2/events" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Timeback-Tenant: $TENANT" \
  --data-urlencode "eventIri=$EVENT_IRI"

Example response

{
  "eventRowId": "9f2d5f69-4900-4a12-b2d3-80f4c8f8df21",
  "envelopeId": "a093057d-c3ce-41bc-b35b-6d4a5b5cf765",
  "eventIri": "urn:uuid:11111111-1111-4111-8111-111111111111",
  "eventType": "AssessmentItemEvent",
  "profile": "AssessmentProfile",
  "action": "Completed",
  "eventTime": "2026-05-24T14:59:42.000Z",
  "rawEvent": {
    "@context": "http://purl.imsglobal.org/ctx/caliper/v1p2",
    "id": "urn:uuid:11111111-1111-4111-8111-111111111111",
    "type": "AssessmentItemEvent",
    "actor": {
      "id": "https://timeback.example.edu/users/student-1",
      "type": "Person",
      "name": "Ada Learner"
    },
    "action": "Completed",
    "object": {
      "id": "https://timeback.example.edu/items/fractions-1",
      "type": "AssessmentItem",
      "name": "Fractions check"
    },
    "generated": {
      "id": "https://timeback.example.edu/attempts/attempt-1",
      "type": "Attempt",
      "count": 1,
      "assignable": {
        "id": "https://timeback.example.edu/assignments/fractions",
        "type": "AssignableDigitalResource",
        "name": "Fractions practice"
      }
    },
    "eventTime": "2026-05-24T14:59:42.000Z",
    "edApp": {
      "id": "https://timeback.example.edu/apps/timeback",
      "type": "SoftwareApplication",
      "name": "TimeBack"
    },
    "group": {
      "id": "https://timeback.example.edu/classes/math-3-a",
      "type": "CourseSection",
      "name": "Math 3A"
    },
    "membership": {
      "id": "https://timeback.example.edu/memberships/student-1-math-3-a",
      "type": "Membership",
      "roles": [
        "Learner"
      ],
      "status": "Active"
    },
    "extensions": {
      "https://timeback.example.edu/extensions/outcomeScore": 1
    }
  },
  "eventHash": "sha256:1d9a3b4c5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f809"
}

TimeBack read projection

getCaliperEnvelopeProjection

Read one tenant-owned envelope projection by canonical envelope hash.

#
GET/caliper/v1p2/envelopes?hash={envelopeHash}
Request
Authenticated envelope evidence lookup. Use when an integration app or reviewer needs to inspect received envelope metadata without database access.
Response
Returns envelope metadata, status, raw payload access for the tenant, and event summaries.
Status codes
200 401 403 404 500

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredToken tenantId must match X-Timeback-Tenant.Sensor registration, tenant resolution, and bearer auth
X-Timeback-TenantHeadertenant idRequiredTenant boundary for envelope lookup. Must match the token tenantId claim.caliper.envelope.tenant_id
hashQuerysha256RequiredCanonical envelope hash.caliper.envelope.envelope_hash

Response schema

FieldInTypeRequiredDescriptionTrace
envelopeIdResponseuuidRequiredPlatform identifier for the received envelope.caliper.envelope.envelope_id
sensorIriResponseIRIRequiredCaliper envelope sensor IRI.caliper.envelope.sensor_iri
dataVersionResponseIRIRequiredAccepted Caliper context/data version.caliper.envelope.data_version
sendTimeResponsedate-timeRequiredSender supplied envelope sendTime.caliper.envelope.send_time
receivedAtResponsedate-timeRequiredPlatform receipt timestamp.caliper.envelope.received_at
envelopeStatusResponseenumRequiredreceived, processed, rejected, or duplicate.caliper.envelope.envelope_status
events[]ResponsearrayRequiredEvent summaries normalized from this envelope.caliper.event

cURL

curl -fsS -G "$BASE/caliper/v1p2/envelopes" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Timeback-Tenant: $TENANT" \
  --data-urlencode "hash=$ENVELOPE_HASH"

Example response

{
  "envelopeId": "a093057d-c3ce-41bc-b35b-6d4a5b5cf765",
  "sensorIri": "https://timeback.example.edu/sensors/caliper-demo",
  "dataVersion": "http://purl.imsglobal.org/ctx/caliper/v1p2",
  "sendTime": "2026-05-24T15:00:00.000Z",
  "receivedAt": "2026-05-24T15:00:02.000Z",
  "envelopeHash": "sha256:6f5a7f7a6f0e4d53b1e5f2e9a4d3e8b9b7c8d9e0f1029384756abcdef0123456",
  "envelopeStatus": "processed",
  "events": [
    {
      "eventIri": "urn:uuid:11111111-1111-4111-8111-111111111111",
      "eventType": "AssessmentItemEvent",
      "profile": "AssessmentProfile",
      "action": "Completed"
    }
  ]
}

Validation

Invalid Caliper values should be easy to identify.

These are the implementation rules promised by the approved architecture and backed by field/value definitions in the data dictionary.

RuleRequirementTrace
Envelope shapesensor, sendTime, dataVersion, and data are required; data must be an array with at least one Event or Entity.Envelope-first ingest and processing lifecycle
dataVersionOnly `http://purl.imsglobal.org/ctx/caliper/v1p2` is accepted for this surface.Validate Caliper vocabulary and infer only specified profile defaults
Event required propertiesEvent id, type, actor, action, object, and eventTime are required before an item can become a normalized event.Validate Caliper vocabulary and infer only specified profile defaults
Controlled vocabularyEvent type, action, entity type, and explicit profile must come from generated Caliper 1.2 term indexes.Source authority and generated term index
Profile inferenceOmitted profile may be derived from event type for normalized projection only; raw_event remains unchanged.Validate Caliper vocabulary and infer only specified profile defaults
Tenant scopeJWT tenant_id or tenantId must match X-Timeback-Tenant before persistence or read projection.Sensor registration, tenant resolution, and bearer auth
Sensor statusOnly active sensors may ingest; paused, retired, unknown, and cross-tenant sensors are rejected.Sensor registration, tenant resolution, and bearer auth
Duplicate deliverySame tenant and same canonical envelope/event hash is a safe duplicate, not a second event row.Canonical hashes and retry-safe idempotency
Extension handlingUnknown Caliper object properties are preserved as extensions but cannot satisfy required Caliper fields or redefine official terms.Preserve extensions without promoting them
PrivacyProblem details, audit metadata, logs, traces, search indexes, and conformance evidence must not echo raw learner PII or tokens.Privacy and redaction for learner activity payloads

Data Model

Stored data is either Caliper pass-through or platform gap fill.

The implementation must use these table and field meanings. Every table links to the approved data dictionary; every field listed below links to a field-level dictionary anchor.

TablePurposeSourceKey fields
caliper.sensorRegisters one Caliper Sensor IRI for one platform tenant and controls whether that sender may post Sensor API envelopes. Created before the first accepted envelope from a sender. Paused sensors reject new writes; retired sensors remain for history but cannot ingest.Platform gap fillsensor_id tenant_id sensor_iri display_name status credential_ref metadata created_at
caliper.envelopeStores one Caliper Sensor API envelope as the transport unit, preserving raw JSON-LD while adding tenant, receipt, hashing, and processing evidence. Created for each accepted or retained Sensor API delivery. Successful envelopes become processed; rejected and duplicate deliveries remain evidence rows.Mixed: 1EdTech pass-through plus platform gap fillenvelope_id tenant_id sensor_id sensor_iri data_version send_time received_at raw_envelope
caliper.eventStores normalized Caliper Event query fields while preserving raw_event as the source record. Created or updated after envelope validation. Each tenant keeps one current normalized row for each event IRI and a duplicate guard by canonical event hash.Mixed: 1EdTech pass-through plus platform gap fillevent_row_id tenant_id envelope_id event_iri event_type profile action actor
caliper.entityKeeps a current tenant-scoped view of Caliper Entity objects observed in events or describe-style payloads. Upserted whenever an entity object appears in accepted data. first_seen_at records first observation; last_seen_at records the latest observation.Mixed: 1EdTech pass-through plus platform gap fillentity_row_id tenant_id entity_iri entity_type name date_created date_modified raw_entity
caliper.conformance_runStores local docs, implementation, transport, profile, demo/prod, and surface-QC evidence without claiming official 1EdTech certification. Created by local gates, reviewer checks, implementation tests, surface QC, or integration proof. Rows are append-only evidence.Platform gap fillconformance_run_id tenant_id source_name source_version result evidence started_at finished_at

Field index

caliper.sensor.sensor_id Stable platform row identifier for a registered Caliper sender. caliper.sensor.tenant_id Shared platform tenant that owns this Caliper row. This replaces the prior workspace's local caliper.tenant table. caliper.sensor.sensor_iri Caliper Sensor IRI expected in the envelope sensor property for this registered sender. caliper.sensor.display_name Operator-facing sender name used in consoles, support, and release evidence. caliper.sensor.status Lifecycle gate that decides whether this registered sensor can ingest new envelopes. caliper.sensor.credential_ref Reference to credential material used by the platform to administer or rotate sender credentials; the secret itself is not stored here. caliper.sensor.metadata Small operational metadata about the sensor registration, such as owner team, rotation schedule, or external integration label. caliper.sensor.created_at Timestamp when the sensor registration row was created. caliper.sensor.updated_at Timestamp when lifecycle, credential reference, display name, or metadata last changed. caliper.envelope.envelope_id Stable platform identifier for one received Caliper envelope. caliper.envelope.tenant_id Shared platform tenant that owns this Caliper row. This replaces the prior workspace's local caliper.tenant table. caliper.envelope.sensor_id Registered sensor row matched from tenant_id plus the envelope sensor IRI. caliper.envelope.sensor_iri Caliper envelope sensor property preserved exactly as the sender supplied it or as the id of the supplied Sensor entity. caliper.envelope.data_version Caliper dataVersion for the envelope. This 1EdTech surface accepts only Caliper Analytics 1.2. caliper.envelope.send_time Caliper envelope sendTime timestamp supplied by the Sensor. caliper.envelope.received_at Platform timestamp when the endpoint received the envelope. caliper.envelope.raw_envelope Original Caliper JSON-LD envelope body accepted by the endpoint. caliper.envelope.canonical_envelope Deterministically ordered JSON representation used to compute envelope_hash and replay evidence. caliper.envelope.envelope_hash SHA-256 hash of canonical_envelope used to detect duplicate Sensor API deliveries. caliper.envelope.envelope_status Processing state for this envelope receipt. caliper.envelope.rejection_reason Redacted machine-readable reason explaining why an envelope was rejected. caliper.event.event_row_id Stable platform row identifier for one normalized event projection. caliper.event.tenant_id Shared platform tenant that owns this Caliper row. This replaces the prior workspace's local caliper.tenant table. caliper.event.envelope_id Envelope that carried this event. caliper.event.event_iri Caliper event id IRI supplied by the sender. caliper.event.event_type Caliper Event subclass preserved from the event type property. caliper.event.profile Caliper profile term associated with this event, supplied by the sender or inferred from event_type for projection. caliper.event.action Caliper controlled action term describing what the actor did. caliper.event.actor Caliper actor property. Usually a Person, SoftwareApplication, or Organization entity, or an IRI reference. caliper.event.object Caliper object property. This is the primary thing acted on by the actor. caliper.event.event_time Caliper eventTime timestamp representing when the learning activity occurred. caliper.event.ed_app Caliper edApp property. Educational application associated with the event. caliper.event.group_entity Caliper group property. Group, course section, class, or cohort context for the event. caliper.event.membership Caliper membership property. Membership relationship tying the actor to the group. caliper.event.generated Caliper generated property. Output generated by the action, such as Attempt, Result, Response, or another entity. caliper.event.target Caliper target property. Target entity for navigation, launch, move, or similar actions. caliper.event.referrer Caliper referrer property. Referring resource for navigation or reading events. caliper.event.federated_session Caliper federatedSession property. Federated session entity that correlates activity across tools. caliper.event.event_extensions Sender extension properties preserved outside normalized Caliper properties. caliper.event.raw_event Original Caliper JSON-LD event object accepted from the envelope. caliper.event.canonical_event Deterministically ordered event object used for hashing and replay evidence. caliper.event.event_hash SHA-256 hash of canonical_event. caliper.entity.entity_row_id Stable platform row identifier for one current entity projection. caliper.entity.tenant_id Shared platform tenant that owns this Caliper row. This replaces the prior workspace's local caliper.tenant table. caliper.entity.entity_iri Caliper entity id IRI supplied by the sender. caliper.entity.entity_type Caliper Entity class for this entity projection. caliper.entity.name Optional Caliper name property when the entity provides a display label. caliper.entity.date_created Optional Caliper dateCreated value from the entity object. caliper.entity.date_modified Optional Caliper dateModified value from the entity object. caliper.entity.raw_entity Most recent raw JSON-LD entity object observed for this tenant and entity IRI. caliper.entity.canonical_entity Deterministically ordered entity object used for hashing and change detection. caliper.entity.entity_hash SHA-256 hash of canonical_entity. caliper.entity.first_seen_at First platform receipt timestamp for this tenant and entity IRI. caliper.entity.last_seen_at Most recent platform receipt timestamp for this tenant and entity IRI. caliper.event_entity_link.event_entity_link_id Stable row identifier for one event-to-entity relation. caliper.event_entity_link.tenant_id Shared platform tenant that owns this Caliper row. This replaces the prior workspace's local caliper.tenant table. caliper.event_entity_link.event_row_id Normalized event row that contains or references the entity. caliper.event_entity_link.entity_row_id Normalized entity row found at raw_path in the event. caliper.event_entity_link.relation Caliper relation or nested role by which the event references the entity. caliper.event_entity_link.ordinal Sibling order when the same relation contains an array. caliper.event_entity_link.raw_path JSON path inside raw_event where this entity was found. caliper.conformance_run.conformance_run_id Stable identifier for one local conformance, documentation, implementation, or integration evidence run. caliper.conformance_run.tenant_id Optional platform tenant associated with this evidence run. caliper.conformance_run.source_name Name of the local or external gate that produced the evidence. caliper.conformance_run.source_version Version, commit, source bundle, or artifact label used by the evidence run. caliper.conformance_run.result Outcome of the evidence run. caliper.conformance_run.evidence Structured, redacted evidence payload from the run. caliper.conformance_run.started_at Timestamp when the evidence run started. caliper.conformance_run.finished_at Timestamp when the evidence run finished.

Allowed Values

Controlled terms stay in Caliper vocabulary.

Use the exact capitalization shown here. Product-local synonyms belong only in later Alpha documentation, not this 1EdTech surface.

Envelope processing status

envelope_status_ck for envelope_status. Full field definition: data dictionary.

4 values

Caliper Event type

event_type_ck for event_type. Full field definition: data dictionary.

21 values
AnnotationEvent A Caliper event class for annotation activity. Normalized rows use AnnotationProfile unless the sender supplies a compatible explicit profile. AssessmentEvent A Caliper event class for assessment activity. Normalized rows use AssessmentProfile unless the sender supplies a compatible explicit profile. AssessmentItemEvent A Caliper event class for assessment item activity. Normalized rows use AssessmentProfile unless the sender supplies a compatible explicit profile. AssignableEvent A Caliper event class for assignable activity. Normalized rows use AssignableProfile unless the sender supplies a compatible explicit profile. FeedbackEvent A Caliper event class for feedback activity. Normalized rows use FeedbackProfile unless the sender supplies a compatible explicit profile. ForumEvent A Caliper event class for forum activity. Normalized rows use ForumProfile unless the sender supplies a compatible explicit profile. GradeEvent A Caliper event class for grade activity. Normalized rows use GradingProfile unless the sender supplies a compatible explicit profile. MediaEvent A Caliper event class for media activity. Normalized rows use MediaProfile unless the sender supplies a compatible explicit profile. MessageEvent A Caliper event class for message activity. Normalized rows use ForumProfile unless the sender supplies a compatible explicit profile. NavigationEvent A Caliper event class for navigation activity. Normalized rows use GeneralProfile unless the sender supplies a compatible explicit profile. QuestionnaireEvent A Caliper event class for questionnaire activity. Normalized rows use SurveyProfile unless the sender supplies a compatible explicit profile. QuestionnaireItemEvent A Caliper event class for questionnaire item activity. Normalized rows use SurveyProfile unless the sender supplies a compatible explicit profile. ResourceManagementEvent A Caliper event class for resource management activity. Normalized rows use ResourceManagementProfile unless the sender supplies a compatible explicit profile. SearchEvent A Caliper event class for search activity. Normalized rows use SearchProfile unless the sender supplies a compatible explicit profile. SessionEvent A Caliper event class for session activity. Normalized rows use SessionProfile unless the sender supplies a compatible explicit profile. SurveyEvent A Caliper event class for survey activity. Normalized rows use SurveyProfile unless the sender supplies a compatible explicit profile. SurveyInvitationEvent A Caliper event class for survey invitation activity. Normalized rows use SurveyProfile unless the sender supplies a compatible explicit profile. ThreadEvent A Caliper event class for thread activity. Normalized rows use ForumProfile unless the sender supplies a compatible explicit profile. ToolLaunchEvent A Caliper event class for tool launch activity. Normalized rows use ToolLaunchProfile unless the sender supplies a compatible explicit profile. ToolUseEvent A Caliper event class for tool use activity. Normalized rows use ToolUseProfile unless the sender supplies a compatible explicit profile. ViewEvent A Caliper event class for view activity. Normalized rows use GeneralProfile unless the sender supplies a compatible explicit profile.

Caliper Profile

profile_ck for profile. Full field definition: data dictionary.

15 values

Caliper Action

action_ck for action. Full field definition: data dictionary.

80 values
Abandoned The actor abandoned the event object, generated result, media control, resource, or target named by the Caliper event. Accepted The actor accepted the event object, generated result, media control, resource, or target named by the Caliper event. Activated The actor activated the event object, generated result, media control, resource, or target named by the Caliper event. Added The actor added the event object, generated result, media control, resource, or target named by the Caliper event. Archived The actor archived the event object, generated result, media control, resource, or target named by the Caliper event. Attached The actor attached the event object, generated result, media control, resource, or target named by the Caliper event. Bookmarked The actor bookmarked the event object, generated result, media control, resource, or target named by the Caliper event. ChangedResolution The actor changed resolution the event object, generated result, media control, resource, or target named by the Caliper event. ChangedSize The actor changed size the event object, generated result, media control, resource, or target named by the Caliper event. ChangedSpeed The actor changed speed the event object, generated result, media control, resource, or target named by the Caliper event. ChangedVolume The actor changed volume the event object, generated result, media control, resource, or target named by the Caliper event. Classified The actor classified the event object, generated result, media control, resource, or target named by the Caliper event. ClosedPopout The actor closed popout the event object, generated result, media control, resource, or target named by the Caliper event. Commented The actor added a comment. Completed The actor completed the object, session, assessment, item, or activity. Copied The actor copied the event object, generated result, media control, resource, or target named by the Caliper event. Created The actor created a resource, entity, or record. Deactivated The actor deactivated the event object, generated result, media control, resource, or target named by the Caliper event. Declined The actor declined the event object, generated result, media control, resource, or target named by the Caliper event. Deleted The actor deleted or requested deletion of a resource, entity, or record. Described The actor described the event object, generated result, media control, resource, or target named by the Caliper event. DisabledClosedCaptioning The actor disabled closed captioning the event object, generated result, media control, resource, or target named by the Caliper event. Disliked The actor disliked the event object, generated result, media control, resource, or target named by the Caliper event. Downloaded The actor downloaded the event object, generated result, media control, resource, or target named by the Caliper event. EnabledClosedCaptioning The actor enabled closed captioning the event object, generated result, media control, resource, or target named by the Caliper event. Ended The actor ended the event object, generated result, media control, resource, or target named by the Caliper event. EnteredFullScreen The actor entered full screen the event object, generated result, media control, resource, or target named by the Caliper event. ExitedFullScreen The actor exited full screen the event object, generated result, media control, resource, or target named by the Caliper event. ForwardedTo The actor forwarded to the event object, generated result, media control, resource, or target named by the Caliper event. Graded The actor graded work, a result, or an assessment object. Hid The actor hid the event object, generated result, media control, resource, or target named by the Caliper event. Highlighted The actor highlighted the event object, generated result, media control, resource, or target named by the Caliper event. Identified The actor identified the event object, generated result, media control, resource, or target named by the Caliper event. JumpedTo The actor jumped to the event object, generated result, media control, resource, or target named by the Caliper event. Launched The actor launched a tool, application, resource, or LTI link. Liked The actor liked the event object, generated result, media control, resource, or target named by the Caliper event. Linked The actor linked the event object, generated result, media control, resource, or target named by the Caliper event. LoggedIn The actor started an authenticated session. LoggedOut The actor ended an authenticated session. MarkedAsRead The actor marked as read the event object, generated result, media control, resource, or target named by the Caliper event. MarkedAsUnread The actor marked as unread the event object, generated result, media control, resource, or target named by the Caliper event. Modified The actor modified an existing resource, entity, or record. Muted The actor muted the event object, generated result, media control, resource, or target named by the Caliper event. NavigatedTo The actor navigated to a target resource or location. OpenedPopout The actor opened popout the event object, generated result, media control, resource, or target named by the Caliper event. OptedIn The actor opted in the event object, generated result, media control, resource, or target named by the Caliper event. OptedOut The actor opted out the event object, generated result, media control, resource, or target named by the Caliper event. Paused The actor paused the event object, generated result, media control, resource, or target named by the Caliper event. Posted The actor posted a message, comment, or discussion item. Printed The actor printed the event object, generated result, media control, resource, or target named by the Caliper event. Published The actor published the event object, generated result, media control, resource, or target named by the Caliper event. Questioned The actor questioned the event object, generated result, media control, resource, or target named by the Caliper event. Ranked The actor ranked the event object, generated result, media control, resource, or target named by the Caliper event. Recommended The actor recommended the event object, generated result, media control, resource, or target named by the Caliper event. Removed The actor removed the event object, generated result, media control, resource, or target named by the Caliper event. Reset The actor reset the event object, generated result, media control, resource, or target named by the Caliper event. Restarted The actor restarted the event object, generated result, media control, resource, or target named by the Caliper event. Restored The actor restored the event object, generated result, media control, resource, or target named by the Caliper event. Resumed The actor resumed the event object, generated result, media control, resource, or target named by the Caliper event. Retrieved The actor retrieved the event object, generated result, media control, resource, or target named by the Caliper event. Returned The actor returned the event object, generated result, media control, resource, or target named by the Caliper event. Reviewed The actor reviewed the event object, generated result, media control, resource, or target named by the Caliper event. Rewound The actor rewound the event object, generated result, media control, resource, or target named by the Caliper event. Saved The actor saved the event object, generated result, media control, resource, or target named by the Caliper event. Searched The actor issued a search query. Sent The actor sent the event object, generated result, media control, resource, or target named by the Caliper event. Shared The actor shared the event object, generated result, media control, resource, or target named by the Caliper event. Showed The actor showed the event object, generated result, media control, resource, or target named by the Caliper event. Skipped The actor skipped the event object, generated result, media control, resource, or target named by the Caliper event. Started The actor started the object, session, assessment, media, or activity. Submitted The actor submitted work, answers, responses, or another generated object. Subscribed The actor subscribed the event object, generated result, media control, resource, or target named by the Caliper event. Tagged The actor tagged the event object, generated result, media control, resource, or target named by the Caliper event. TimedOut The actor timed out the event object, generated result, media control, resource, or target named by the Caliper event. Unmuted The actor unmuted the event object, generated result, media control, resource, or target named by the Caliper event. Unpublished The actor unpublished the event object, generated result, media control, resource, or target named by the Caliper event. Unsubscribed The actor unsubscribed the event object, generated result, media control, resource, or target named by the Caliper event. Uploaded The actor uploaded the event object, generated result, media control, resource, or target named by the Caliper event. Used The actor used a tool, application, feature, or resource. Viewed The actor viewed a resource, item, page, message, or result.

Caliper Entity type

entity_type_ck for entity_type. Full field definition: data dictionary.

69 values
Agent A Caliper entity class for agent objects. Preserve the sender's class name exactly. AggregateMeasure A Caliper entity class for aggregate measure objects. Preserve the sender's class name exactly. AggregateMeasureCollection A Caliper entity class for aggregate measure collection objects. Preserve the sender's class name exactly. Annotation A Caliper entity class for annotation objects. Preserve the sender's class name exactly. Assessment A test, quiz, assessment, or assessment package. AssessmentItem A question or item inside an assessment. AssignableDigitalResource A Caliper entity class for assignable digital resource objects. Preserve the sender's class name exactly. Attempt A learner attempt or work attempt generated by an event. AudioObject An audio media object. BookmarkAnnotation A Caliper entity class for bookmark annotation objects. Preserve the sender's class name exactly. Chapter A Caliper entity class for chapter objects. Preserve the sender's class name exactly. Collection A Caliper entity class for collection objects. Preserve the sender's class name exactly. Comment A Caliper entity class for comment objects. Preserve the sender's class name exactly. CourseOffering A course offering that can contain one or more sections. CourseSection An instructional section or class instance used to group activity. DateTimeQuestion A Caliper entity class for date time question objects. Preserve the sender's class name exactly. DateTimeResponse A Caliper entity class for date time response objects. Preserve the sender's class name exactly. DigitalResource A digital learning resource. DigitalResourceCollection A collection of digital resources. Document A Caliper entity class for document objects. Preserve the sender's class name exactly. FillinBlankResponse A Caliper entity class for fillin blank response objects. Preserve the sender's class name exactly. Forum A forum or discussion container. Frame A Caliper entity class for frame objects. Preserve the sender's class name exactly. Group A group or collection of people, courses, or resources. HighlightAnnotation A Caliper entity class for highlight annotation objects. Preserve the sender's class name exactly. ImageObject An image media object. LearningObjective A Caliper entity class for learning objective objects. Preserve the sender's class name exactly. LikertScale A Caliper entity class for likert scale objects. Preserve the sender's class name exactly. Link A Caliper entity class for link objects. Preserve the sender's class name exactly. LtiLink An LTI launch link or placement. LtiSession An LTI-related session entity. MediaLocation A Caliper entity class for media location objects. Preserve the sender's class name exactly. MediaObject A media resource such as a video, audio, or image object. Membership A role or membership relationship between a person and a group. Message A forum or messaging object. MultipleChoiceResponse A Caliper entity class for multiple choice response objects. Preserve the sender's class name exactly. MultipleResponseResponse A Caliper entity class for multiple response response objects. Preserve the sender's class name exactly. MultiselectQuestion A Caliper entity class for multiselect question objects. Preserve the sender's class name exactly. MultiselectResponse A Caliper entity class for multiselect response objects. Preserve the sender's class name exactly. MultiselectScale A Caliper entity class for multiselect scale objects. Preserve the sender's class name exactly. NumericScale A Caliper entity class for numeric scale objects. Preserve the sender's class name exactly. OpenEndedQuestion A Caliper entity class for open ended question objects. Preserve the sender's class name exactly. OpenEndedResponse A Caliper entity class for open ended response objects. Preserve the sender's class name exactly. Organization An organization such as a school, district, department, or provider. Page A Caliper entity class for page objects. Preserve the sender's class name exactly. Person A learner, teacher, parent, or other human actor. Treat names and identifiers as sensitive learner or roster data. Query A search query or query entity. Question A Caliper entity class for question objects. Preserve the sender's class name exactly. Questionnaire A questionnaire or survey instrument. QuestionnaireItem An item within a questionnaire or survey. Rating A Caliper entity class for rating objects. Preserve the sender's class name exactly. RatingScaleQuestion A Caliper entity class for rating scale question objects. Preserve the sender's class name exactly. RatingScaleResponse A Caliper entity class for rating scale response objects. Preserve the sender's class name exactly. Response A learner response object generated by an interaction. Result A score, result, or graded output generated by assessment or grading activity. Scale A Caliper entity class for scale objects. Preserve the sender's class name exactly. Score A numeric or categorical score entity. SearchResponse A search response entity generated by a search event. SelectTextResponse A Caliper entity class for select text response objects. Preserve the sender's class name exactly. Session A session entity used to correlate a learner's or tool's activity. SharedAnnotation A Caliper entity class for shared annotation objects. Preserve the sender's class name exactly. SoftwareApplication A software tool, learning app, platform, or sensor-side application. Survey A survey instrument. SurveyInvitation An invitation to participate in a survey. TagAnnotation A Caliper entity class for tag annotation objects. Preserve the sender's class name exactly. Thread A discussion thread. TrueFalseResponse A Caliper entity class for true false response objects. Preserve the sender's class name exactly. VideoObject A video media object. WebPage A web page resource.

Event-to-entity relation

event_entity_relation_ck for relation. Full field definition: data dictionary.

11 values

Privacy

Raw learning activity is protected tenant data.

Caliper events can contain learner, parent, teacher, classroom, app, resource, result, attempt, and session data. The implementation must preserve valid Caliper JSON-LD but redact secondary surfaces.

SurfaceRuleTrace
raw payloadsRaw Caliper payloads are tenant-scoped sensitive records. They may preserve valid Caliper PII but are not copied to logs, Problems, audit metadata, public docs, search indexes, or conformance evidence.Privacy and redaction for learner activity payloads
read projectionRead projections require tenant-matched JWTs and return only the caller's tenant data.Privacy and redaction for learner activity payloads
examplesPublic examples use sample data and must not resemble real student, parent, teacher, token, or tenant identifiers.Privacy and redaction for learner activity payloads

Implementation Spec

The next deliverable implements this contract.

Implementation must be derived from this page, the approved architecture, and the approved data dictionary. It is one Postgres-backed deploy at CALIPER_BASE_URL; demo access uses the seeded platform tenant UUID 00000000-0000-4000-8000-00000000ca12 on the same deploy. If implementation finds a gap, it should trigger rollback rather than invent behavior.

OperationRequired smokeRollback signal
mintDemoTokenUnauthenticated POST with tenantId=00000000-0000-4000-8000-00000000ca12 returns a JWT and seeded sensor IRI from the same implementation deploy.Cold client cannot obtain demo credentials from this page, or the docs imply a second deploy.
persistCaliperEnvelopeAuthenticated POST of the sample envelope returns 204; duplicate POST does not create a second event row.Success body/status drifts back to the prior 202 contract or rejects valid Caliper v1p2 terms.
getCaliperEventProjectionAuthenticated GET by event IRI returns the stored event only for the matching tenant.Read projection leaks another tenant or cannot verify a successful write.
getCaliperEnvelopeProjectionAuthenticated GET by hash returns envelope metadata and event summaries for the tenant.Read projection requires direct database access or exposes unredacted error payloads.

Machine-readable contract: contract.json. Source snapshot: caliper-customer-website-source.json.

Provenance

Every behavior links backward to approved truth.

This page is generated from the approved Caliper architecture and data dictionary, with Stripe's API reference used as the customer-website benchmark for completeness and findability.

Official sources

Files read and adapted

  • https://docs.stripe.com/api
  • loop/caliper/artifacts/1edtech/architecture/site/caliper-architecture-traceability.json
  • loop/caliper/artifacts/1edtech/architecture/site/index.html
  • loop/caliper/artifacts/1edtech/data_dictionary/source/caliper-data-dictionary-source.json
  • loop/caliper/artifacts/1edtech/data_dictionary/site/index.html
  • vendor/caliper-prior-workspace/spec_bundle/MANIFEST.md
  • vendor/caliper-prior-workspace/ARCHITECTURE.md
  • vendor/caliper-prior-workspace/docs/1edtech-caliper-package.md
  • vendor/caliper-prior-workspace/docs/plain-english-guide.md
  • vendor/caliper-prior-workspace/docs/caliper-relational-json-architecture.md
  • vendor/caliper-prior-workspace/docs/conformance-and-documentation.md
  • vendor/caliper-prior-workspace/docs/adr/0001-generated-term-index.md
  • vendor/caliper-prior-workspace/docs/adr/0002-postgresql-primary.md
  • vendor/caliper-prior-workspace/docs/adr/0003-jsonld-authority.md
  • vendor/caliper-prior-workspace/docs/adr/0004-canonical-hashes.md
  • vendor/caliper-prior-workspace/docs/adr/0005-data-dictionary-provenance.md
  • vendor/caliper-prior-workspace/docs/adr/0006-tenant-sensor-boundary.md
  • vendor/caliper-prior-workspace/docs/adr/0007-envelope-first-ingest.md
  • vendor/caliper-prior-workspace/docs/adr/0008-entity-event-projection.md
  • vendor/caliper-prior-workspace/docs/adr/0009-extension-preservation.md
  • vendor/caliper-prior-workspace/docs/adr/0010-conformance-evidence.md
  • vendor/caliper-prior-workspace/docs/adr/0011-api-boundary-auth-hosting.md
  • vendor/caliper-prior-workspace/migrations/001_caliper_core.sql
  • vendor/caliper-prior-workspace/contracts/caliper-boundary.openapi.yaml
  • vendor/caliper-prior-workspace/src/caliper/caliperModel.ts
  • vendor/caliper-prior-workspace/src/caliper/caliperNormalizer.ts
  • vendor/caliper-prior-workspace/src/repository/caliperRepository.ts
  • vendor/caliper-prior-workspace/src/repository/postgresCaliperRepository.ts
  • vendor/caliper-prior-workspace/tests/fixtures.ts
  • vendor/caliper-prior-workspace/tests/caliperNormalizer.test.ts
  • vendor/caliper-prior-workspace/tests/supabaseRepository.test.ts
  • vendor/caliper-prior-workspace/site/index.html
  • vendor/caliper-prior-workspace/site/search-index.json
  • vendor/caliper-prior-workspace/site/spec-traceability.json
  • loop/caliper/artifacts/1edtech/implementation/summary.json
  • loop/caliper/artifacts/1edtech/implementation/impl/src/http/caliperHttp.mjs
  • loop/caliper/artifacts/1edtech/implementation/impl/tests/deployed.smoke.test.mjs