Envelopes
Successful responses wrap their payload indata:
error and, on 422 validation failures, a details map:
201. POST /api/v1/packages/from-template returns 200 instead when its externalId matches a package that already exists. Everything else that succeeds returns 200, including action calls made with POST such as a bulk send or a signing URL.
Status codes
Validation details
details keys are dotted paths into the request. Array items are addressed by index, so recipients.0.email is the email of the first recipient. Query parameters are validated the same way: GET /api/v1/packages?pageSize=500 returns 422 with details.pageSize.
A 422 on a body that references something the target resource does not have (an unknown roleIndex, for example) uses the same shape.
Rate limits
All/api/v1 routes share one limit: 120 requests per 60-second window, counted per source IP address. The count is kept per server replica, so the effective ceiling across the fleet can be higher; treat 120 as the floor. Beyond it the API returns:
Retry-After is the number of seconds until the window resets. Wait at least that long before retrying.

