Event API
Accepts Business Events from applications — validates and persists them append-only in the Event Store.
Base: https://pbcp-api.pcampus.co
POST /events
Ingest a single Business Event. Events are immutable once stored.
Headers: x-tenant-id (required)
Request body
{
"schemaVersion": "1.0",
"tenantId": "pharmacy-demo",
"eventId": "550e8400-e29b-41d4-a716-446655440000",
"eventName": "order.created",
"occurredAt": "2026-06-28T10:15:00.000Z",
"actor": {
"type": "user",
"id": "staff-42"
},
"source": {
"system": "pharmacy-pos",
"channel": "pos"
},
"payload": {
"orderId": "ORD-1001"
}
}| Field | Required | Description |
|---|---|---|
schemaVersion | Yes | Always "1.0" |
tenantId | Yes | Must match x-tenant-id header |
eventId | Yes | UUID — publisher-supplied, used for dedup |
eventName | Yes | namespace.entity.action format, e.g. order.created |
occurredAt | Yes | ISO-8601 timestamp when event actually happened |
actor | Yes | { type, id } — who triggered the event |
source | Yes | { system, channel } — where it came from |
payload | Yes | Domain-specific data (free JSON object) |
Response 201 Created
{
"eventId": "550e8400-e29b-41d4-a716-446655440000",
"status": "accepted",
"schemaVersion": "1.0",
"ingestedAt": "2026-06-28T10:15:01.123Z"
}Errors
| Status | Code | When |
|---|---|---|
400 | VALIDATION_ERROR | Missing or invalid required fields |
400 | SCHEMA_VERSION_UNSUPPORTED | Unknown schemaVersion |
409 | DUPLICATE_EVENT | Same (tenantId, eventId) already stored |
500 | INTERNAL | Unexpected server error |
POST /events/batch
Ingest multiple events in a single request.
Headers: x-tenant-id (required)
Request body
[
{ "schemaVersion": "1.0", "eventId": "...", "eventName": "order.created", ... },
{ "schemaVersion": "1.0", "eventId": "...", "eventName": "product.sold", ... }
]Response
Partial success semantics — each item returns its own status: "accepted" | "rejected" with reason.
Event naming convention
{entity}.{action}
{namespace}.{entity}.{action}Pharmacy event catalog (pilot):
| Event | When to fire |
|---|---|
customer.registered | New customer registers |
customer.visited | Patient visits the store |
session.started | Start of a sales session |
product.viewed | View a product |
product.searched | Search for a product |
cart.updated | Update the cart |
order.created | Create an order |
order.completed | Order completed |
payment.completed | Payment successful |
prescription.dispensed | Dispense a prescription |
SDK usage (JavaScript)
import { PBCPClient } from '@pbcp/sdk'
const pbcp = new PBCPClient({
baseUrl: 'https://pbcp-api.pcampus.co',
tenantId: 'pharmacy-demo',
})
await pbcp.track('order.created', {
orderId: 'ORD-1001',
total: 2500,
currency: 'THB',
})track(eventName, payload) handles eventId generation, occurredAt, actor, and source automatically.