Examples
Create and Store a Definition
curl -X POST http://localhost:8080/sagas/definitions \
-H 'Content-Type: application/json' \
-d '{
"name": "order-saga",
"version": "v1",
"failureHandling": {
"type": "retry",
"maxAttempts": 3,
"delayMillis": 500
},
"steps": [
{
"name": "reserve-inventory",
"up": {
"url": "http://inventory/reserve",
"verb": "POST",
"body": {
"orderId": "{{payload.orderId}}"
}
},
"down": {
"url": "http://inventory/release",
"verb": "POST",
"body": {
"orderId": "{{payload.orderId}}"
}
}
}
]
}'Robust Definition Using All Main Fields
This sample covers: backoff, multi-step flow, headers, body templates, explicit successStatusCodes, and success/failure callbacks.
{
"name": "order-fulfillment",
"version": "v2",
"failureHandling": {
"type": "backoff",
"maxAttempts": 5,
"initialDelayMillis": 200,
"maxDelayMillis": 5000,
"multiplier": 2.0,
"jitterRatio": 0.2
},
"steps": [
{
"name": "reserve-inventory",
"up": {
"url": "http://inventory/api/v1/reservations",
"verb": "POST",
"headers": {
"X-Correlation-Id": "{{payload.correlationId}}",
"Content-Type": "application/json"
},
"body": {
"orderId": "{{payload.orderId}}",
"items": "{{payload.items}}"
},
"successStatusCodes": [200, 201, 202]
},
"down": {
"url": "http://inventory/api/v1/reservations/{{step.0.up.body.reservationId}}/cancel",
"verb": "POST",
"headers": {
"X-Correlation-Id": "{{payload.correlationId}}"
},
"body": {
"reason": "compensation"
},
"successStatusCodes": [200, 204]
}
},
{
"name": "charge-payment",
"up": {
"url": "http://payments/api/v1/charges",
"verb": "POST",
"headers": {
"Authorization": "Bearer {{payload.paymentToken}}",
"X-Correlation-Id": "{{payload.correlationId}}"
},
"body": {
"orderId": "{{payload.orderId}}",
"amount": "{{payload.amount}}",
"reservationId": "{{step.0.up.body.reservationId}}"
},
"successStatusCodes": [200, 201]
},
"down": {
"url": "http://payments/api/v1/charges/{{step.1.up.body.chargeId}}/refund",
"verb": "POST",
"headers": {
"Authorization": "Bearer {{payload.paymentToken}}",
"X-Correlation-Id": "{{payload.correlationId}}"
},
"body": {
"orderId": "{{payload.orderId}}",
"reason": "compensation"
},
"successStatusCodes": [200, 202]
}
}
],
"onSuccessCallback": {
"url": "http://notifications/api/v1/order-success",
"verb": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": {
"orderId": "{{payload.orderId}}",
"chargeId": "{{step.1.up.body.chargeId}}"
},
"successStatusCodes": [200, 202, 204]
},
"onFailureCallback": {
"url": "http://notifications/api/v1/order-failed",
"verb": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": {
"orderId": "{{payload.orderId}}",
"message": "saga failed or compensated"
},
"successStatusCodes": [200, 202, 204]
}
}Run Stored Definition
curl -X POST http://localhost:8080/sagas/definitions/order-saga/v1/run \
-H 'Content-Type: application/json' \
-d '{"payload": {"orderId": "ord-123", "amount": 99.5}}'Run Inline Definition
curl -X POST http://localhost:8080/sagas/run \
-H 'Content-Type: application/json' \
-d '{"definition": {"name":"inline","version":"v1","failureHandling":{"type":"retry","maxAttempts":1,"delayMillis":200},"steps":[...]},"payload":{}}'Template Example
{
"url": "http://service/charge?reservation={{step.0.up.body.id}}",
"verb": "POST",
"body": {
"amount": "{{payload.amount}}"
}
}Load & Demo Scripts
scripts/saga_demo/run_saga.pyscripts/saga_demo/locust_square_chain_run.pyscripts/saga_demo/README.md