HTTP status codes
Retry strategies
For transient errors (429, 500, 502, 503, 504):
Production security checklist
Before going live, verify each item:API key is server-side only
API key is server-side only
Never expose
edp_live_ keys to the browser or commit them to version control. Use environment variables. All Edpire API calls must go through your backend — the browser should only talk to your own proxy routes.Webhook signatures verified
Webhook signatures verified
Reject any incoming webhook that fails HMAC-SHA256 verification. Use
timingSafeEqual to prevent timing attacks.Minimum scopes
Minimum scopes
Each API key has only the scopes it needs. A key that only reads data should not have
write:submissions.Allowed Origins configured
Allowed Origins configured
Only your production domains are in the embed allow list. Remove localhost/staging before launch.
learner_ref is server-generated
learner_ref is server-generated
Never let the client construct or choose the
learner_ref. Always generate it server-side from your auth session.Idempotent webhook handlers
Idempotent webhook handlers
Duplicate events do not cause duplicate records. Check
submission_id uniqueness before writing.Rate limiting handled
Rate limiting handled
Your code respects
Retry-After headers and backs off on 429 responses.Correct answers are opt-in only
Correct answers are opt-in only
Stored answer keys are never returned. By default
/check returns only correctness signals. Passing include_correct_answers: true does return the correct answers, by design, so review and practice modes can show them. Set that flag server-side based on your own logic, and never forward it from client input.HTTPS in production
HTTPS in production
Webhook URLs must use HTTPS. HTTP is only permitted for
localhost during development.