One destination per configured MT5 server. Registration returns 201; an existing destination returns 409. Store the generated secret when returned: it cannot be retrieved later. Supplied secrets are not echoed. An update affects the next attempt without a restart; an in-flight delivery may still use the old URL and key. Coordinate overlap with the receiver. Redirects are not followed.
Verify before parsing
The sender signs the exact bytes of the HTTP body. Parsing and re-encoding JSON first can break the signature. Example for trusted server-side Python code:event_id with a unique constraint in the same CRM transaction as the state update. Return 2xx only after commit (also for an already processed ID). Delivery is at least once, not ordered. Failed responses/timeouts retry with the same ID and body but a fresh signature timestamp. No destination means events stay pending; registration can deliver an older backlog.
The envelope has
event_id, type, UTC occurred_at and event-specific data. It contains no account passwords or bearer tokens.
