API Reference
PBCP
Event API

Event API

รับ Business Events จาก applications — validate, persist append-only ใน 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"
  }
}
FieldRequiredDescription
schemaVersionYesAlways "1.0"
tenantIdYesMust match x-tenant-id header
eventIdYesUUID — publisher-supplied, used for dedup
eventNameYesnamespace.entity.action format, e.g. order.created
occurredAtYesISO-8601 timestamp when event actually happened
actorYes{ type, id } — who triggered the event
sourceYes{ system, channel } — where it came from
payloadYesDomain-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

StatusCodeWhen
400VALIDATION_ERRORMissing or invalid required fields
400SCHEMA_VERSION_UNSUPPORTEDUnknown schemaVersion
409DUPLICATE_EVENTSame (tenantId, eventId) already stored
500INTERNALUnexpected 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):

EventWhen to fire
customer.registeredลูกค้าใหม่ลงทะเบียน
customer.visitedคนไข้มาร้าน
session.startedเริ่ม session การซื้อขาย
product.viewedดูสินค้า
product.searchedค้นหาสินค้า
cart.updatedอัพเดตตะกร้า
order.createdสร้าง order
order.completedorder เสร็จสมบูรณ์
payment.completedชำระเงินสำเร็จ
prescription.dispensedจ่ายยา

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.

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"
  }
}
FieldRequiredDescription
schemaVersionYesAlways "1.0"
tenantIdYesMust match x-tenant-id header
eventIdYesUUID — publisher-supplied, used for dedup
eventNameYesnamespace.entity.action format, e.g. order.created
occurredAtYesISO-8601 timestamp when event actually happened
actorYes{ type, id } — who triggered the event
sourceYes{ system, channel } — where it came from
payloadYesDomain-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

StatusCodeWhen
400VALIDATION_ERRORMissing or invalid required fields
400SCHEMA_VERSION_UNSUPPORTEDUnknown schemaVersion
409DUPLICATE_EVENTSame (tenantId, eventId) already stored
500INTERNALUnexpected 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):

EventWhen to fire
customer.registeredNew customer registers
customer.visitedPatient visits the store
session.startedStart of a sales session
product.viewedView a product
product.searchedSearch for a product
cart.updatedUpdate the cart
order.createdCreate an order
order.completedOrder completed
payment.completedPayment successful
prescription.dispensedDispense 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.