Create Event Block
/extensions/roboledger/{graph_id}/operations/create-event-blockPart of Extensions: RoboLedger.
Persist a real-world business event. apply_handlers=False (default): capture-only, status='captured'. apply_handlers=True: resolves an event_handler, fires the template, creates GL entries atomically, status='classified'. Use preview-event-block to dry-run before committing. For journal_entry_recorded, whether the entry writes back to a connected source system follows source (schedule/manual publish; system does not) unless metadata.publish_to_source says otherwise — set it false for an alignment entry mirroring a change already made upstream, which would otherwise be applied twice.
Idempotency: supply an Idempotency-Key header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict.
Authentication
Authenticate in any one of these ways — not all of them:
- API key in the
X-API-Keyheader. - Bearer token in the
Authorizationheader.
Path parameters
| Name | Type | Description |
|---|---|---|
graph_idrequired | string | Graph Id |
Header parameters
| Name | Type | Description |
|---|---|---|
Idempotency-Keyoptional | string | Idempotency-Key |
Request body
Required, application/json.
| Field | Type | Description |
|---|---|---|
event_typerequired | string | Open vocabulary: 'invoice_issued' | 'contract_signed' | 'bank_transaction' | ... |
event_categoryrequired | string | REA classification. Economic categories (sales, purchase, financing, payroll, treasury, adjustment, recognition, other) require event_class='economic'. Support categories (control, approval, reconciliation, inquiry) require event_class='support'. The DB CHECK rejects mismatched pairings. One of: |
event_classoptional | string | REA event class. 'economic' events change resources and drive GL postings; 'support' events are audit-trail / value-chain primitives (typically captured with apply_handlers=False). One of: Default: |
event_actionoptional | string | Canonical action verb refining `event_category`. Disambiguates concepts ERPs collapse: `transferAllRights` (ownership transfer, no physical movement) vs `transferCustody` (physical only, no rights transfer) — load-bearing for consignment, drop-shipping, marketplace settlement, escrow. Optional; null is valid for legacy events and during adapter rollout. One of: |
agent_idoptional | string | ID of the counterparty agent (customer, vendor, employee, lender) involved in the event. `null` for internal-only events. |
resource_typeoptional | string | REA resource kind being exchanged. One of: `goods`, `services`, `money`, `right`, `obligation`, `information`, `labor`. One of: |
resource_element_idoptional | string | ID of the specific element being exchanged, when known (e.g. the cash account for a treasury movement, the inventory item for a sale). |
occurred_atrequired | string (date-time) | When the event happened in the real world |
effective_atoptional | string (date-time) | Accounting recognition date, if different from occurred_at |
sourcerequired | string | 'manual' | 'system' | 'schedule', a connected provider name (e.g. 'quickbooks'), or a source_name registered via an 'external' connection. Validated against the graph's registered connections. |
external_idoptional | string | Source-system dedup key. (source, external_id) is enforced unique when external_id is provided, so retries from external adapters are idempotent at the DB level. |
external_urloptional | string | Deep link back to source-system record |
amountoptional | integer | Economic value of the event in **cents** of `currency`, signed. Sign convention follows the perspective of the entity that owns the graph: inflows positive, outflows negative. `null` for non-economic events (e.g. `event_class='support'`). |
currencyoptional | string | ISO 4217 currency code for `amount`. Default: |
descriptionoptional | string | Free-text human-readable summary of the event. |
metadataoptional | object | Free-form payload, opaque to the event surface. When `apply_handlers=True`, the matched handler's metadata schema validates this dict — required keys depend on the handler registered for `event_type`. Use `preview-event-block` to discover the expected shape without writing. |
dimension_idsoptional | string[] | IDs of dimension members tagging this event (e.g. department, fund, project). Propagate to the GL entries produced by the handler. |
obligated_by_event_idoptional | string | Forward-materialization link: the event that scheduled or obligated this one (e.g. depreciation entries point at the asset_acquired event). |
discharges_event_idoptional | string | Settlement link: the obligation this event discharges (e.g. cash_received pointing at the originating sale_invoiced). |
apply_handlersoptional | boolean | When True, resolves the event_type to a handler (Python registry first, then DSL) and fires it atomically with event creation. Default: |
Example request
curl -X POST "https://api.robosystems.ai/extensions/roboledger/{graph_id}/operations/create-event-block" \
-H "X-API-Key: $ROBOSYSTEMS_API_KEY" \
-H "Idempotency-Key: <Idempotency-Key>" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "ent_customer_acme",
"amount": 250000,
"currency": "USD",
"description": "April consulting retainer — Acme Corp",
"dimension_ids": [
"dim_dept_consulting"
],
"event_category": "sales",
"event_class": "economic",
"event_type": "invoice_issued",
"external_id": "qb_inv_4521",
"external_url": "https://app.qbo.intuit.com/app/invoice?txnId=4521",
"metadata": {
"invoice_number": "INV-2026-0421",
"terms": "net_30"
},
"occurred_at": "2026-05-01T14:30:00Z",
"resource_type": "services",
"source": "quickbooks"
}'Responses
200 Successful Response
| Field | Type | Description | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operationrequired | string | Kebab-case operation name | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operationIdrequired | string | op_-prefixed ULID for audit and SSE correlation | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
statusrequired | string | Operation lifecycle state One of: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resultoptional | EventBlockEnvelope | Command-specific result payload EventBlockEnvelope fields
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
atrequired | string | ISO-8601 UTC timestamp | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
createdByoptional | string | User ID that initiated the operation (null for legacy callers) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
idempotentReplayoptional | boolean | True when this envelope came from the idempotency cache — the underlying command did not execute again. False on fresh executions. Default: |
| Status | Meaning |
|---|---|
| 400 | Invalid request |
| 401 | Authentication required |
| 403 | Access denied |
| 404 | Resource not found |
| 409 | Idempotency-Key conflict — key reused with different body |
| 422 | Validation error |
| 429 | Rate limit exceeded |
| 500 | Internal server error |