Browse the API reference

Preview Event Block

post/extensions/roboledger/{graph_id}/operations/preview-event-block

Part of Extensions: RoboLedger.

Dry-run: resolve the matching handler and evaluate the transaction template without writing any rows. Returns the matched handler + planned debit/credit lines + any validation errors. Use this before create-event-block(apply_handlers=True) to confirm the GL plan.

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-Key header.
  • Bearer token in the Authorization header.

Path parameters

NameTypeDescription
graph_idrequiredstringGraph Id

Header parameters

NameTypeDescription
Idempotency-KeyoptionalstringIdempotency-Key

Request body

Required, application/json.

FieldTypeDescription
event_typerequiredstring

Open vocabulary: 'invoice_issued' | 'contract_signed' | 'bank_transaction' | ...

event_categoryrequiredstring

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: sales, purchase, financing, payroll, treasury, adjustment, recognition, other, control, approval, reconciliation, inquiry

event_classoptionalstring

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: economic, support

Default: economic

event_actionoptionalstring

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: produce, raise, consume, lower, use, cite, work, deliverService, pickup, dropoff, accept, transferCustody, transferAllRights, transfer, move, modify, combine, separate, copy

agent_idoptionalstring

ID of the counterparty agent (customer, vendor, employee, lender) involved in the event. `null` for internal-only events.

resource_typeoptionalstring

REA resource kind being exchanged. One of: `goods`, `services`, `money`, `right`, `obligation`, `information`, `labor`.

One of: goods, services, money, right, obligation, information, labor

resource_element_idoptionalstring

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_atrequiredstring (date-time)

When the event happened in the real world

effective_atoptionalstring (date-time)

Accounting recognition date, if different from occurred_at

sourcerequiredstring

'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_idoptionalstring

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_urloptionalstring

Deep link back to source-system record

amountoptionalinteger

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'`).

currencyoptionalstring

ISO 4217 currency code for `amount`.

Default: USD

descriptionoptionalstring

Free-text human-readable summary of the event.

metadataoptionalobject

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_idsoptionalstring[]

IDs of dimension members tagging this event (e.g. department, fund, project). Propagate to the GL entries produced by the handler.

obligated_by_event_idoptionalstring

Forward-materialization link: the event that scheduled or obligated this one (e.g. depreciation entries point at the asset_acquired event).

discharges_event_idoptionalstring

Settlement link: the obligation this event discharges (e.g. cash_received pointing at the originating sale_invoiced).

apply_handlersoptionalboolean

When True, resolves the event_type to a handler (Python registry first, then DSL) and fires it atomically with event creation.

Default: false

Example request

curl
curl -X POST "https://api.robosystems.ai/extensions/roboledger/{graph_id}/operations/preview-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

FieldTypeDescription
operationrequiredstring

Kebab-case operation name

operationIdrequiredstring

op_-prefixed ULID for audit and SSE correlation

statusrequiredstring

Operation lifecycle state

One of: completed, pending, failed

resultoptionalPreviewEventBlockResponse

Command-specific result payload

PreviewEventBlockResponse fields
FieldTypeDescription
matched_handleroptionalEventHandlerResponse
EventHandlerResponse fields
FieldTypeDescription
idrequiredstring
namerequiredstring
descriptionoptionalstring
event_typerequiredstring
event_categoryoptionalstring
match_sourceoptionalstring
match_agent_typeoptionalstring
match_resource_typeoptionalstring
match_metadata_expressionoptionalobject
transaction_templaterequiredobject
priorityrequiredinteger
is_activerequiredboolean
originrequiredstring
suggested_byoptionalstring
confidenceoptionalnumber
approved_byoptionalstring
approved_atoptionalstring (date-time)
created_atoptionalstring (date-time)
updated_atoptionalstring (date-time)
created_byoptionalstring
planned_transactionsoptionalTransactionPreview[]

A planned GL entry line from preview-event-block (no rows written).

TransactionPreview fields
FieldTypeDescription
entry_indexrequiredinteger
debit_element_idrequiredstring
credit_element_idrequiredstring
amount_centsrequiredinteger
interpolated_debit_amountrequiredstring
interpolated_credit_amountrequiredstring
validation_errorsoptionalstring[]
would_succeedrequiredboolean
handler_metadataoptionalobject

Handler-specific compute output. For Python handlers like 'asset_disposed', includes NBV, gain/loss, accumulated depreciation. Empty for DSL-handler previews.

atrequiredstring

ISO-8601 UTC timestamp

createdByoptionalstring

User ID that initiated the operation (null for legacy callers)

idempotentReplayoptionalboolean

True when this envelope came from the idempotency cache — the underlying command did not execute again. False on fresh executions.

Default: false

StatusMeaning
400Invalid request
401Authentication required
403Access denied
404Resource not found
409Idempotency-Key conflict — key reused with different body
422Validation error
429Rate limit exceeded
500Internal server error