Skip to main content
Events are the main ingestion surface. Swapnice stores them as claims, not as destructive overwrites of a profile field. Resolved outputs are computed from those claims.

What every event must carry

Omit secrets, emails, and payment tokens from payload and context.

Intent categories

These five categories are the ontology profile and intent reads speak. Designed finer types you can map into those categories:
  • outcome.participate
  • outcome.purchase
  • outcome.complete_collection
  • sentiment.positive / sentiment.negative
  • affiliate.self_label / affiliate.group_association
  • habit.repeated_interest / habit.repeated_activity
  • activation.ready_for_next_step
V1 accepts ontology_category as one of outcome, sentiment, affiliate, habit, activation. Put the finer type in event_type or payload if you need it.

Suggested event catalog

Use this as the first mapping workshop with Swapnice. You do not need all of them for a pilot. Pilot minimum: one explicit claim (profile.selected) and one behavioral conversion (purchase.completed).

Example events

Claims, not overwrites

If two sources disagree, both claims stay. The profile picker chooses a winner and keeps alternatives. Resolution today: highest confidence, then most recent. Designed rules that later resolution will also honor:
  • Explicit user-declared signals outrank inferred behavior
  • Recency matters unless an older explicit signal is still active
  • Higher-trust sources outrank lower-trust sources
  • Truth can be context-specific (“favorite for apparel” ≠ “favorite for collectibles”)
  • A claim is only usable for purposes still granted
  • Revoke, delete, and correction requests remove that claim from purpose-scoped reads
That is why the API returns resolution_method, evidence, and alternatives. Partners can see why a fact won.

Ordering, idempotency, and async

  • Events for one app_id + customer_id are FIFO through a single coordination object
  • Replaying the same Idempotency-Key returns the original event_id
  • A reused key with a different body returns 409 idempotency_conflict
  • POST /v1/events returns 202 with processing_status: queued
  • Profile reads see the event after archive projection. If a profile is empty, wait and retry GET /v1/events/:id until processed
Batch: POST /v1/events/batch accepts 1–100 of the same shape.

Confidence guidance

Garbage confidence makes profile reads harder to trust. Prefer fewer, cleaner events in the pilot.

Catalog objects

When the object is a card, SKU, or collectible, upsert it as an entry and use that id in object. Intents then attach to a shared catalog instead of free-text names.