When to use
The standard activation flow requires the operator to open a browser, log in (Magic Link or OAuth) and wait for the registration to complete. For the first registration of an email, that is required. For every subsequent install by the same operator (same email), you can skip the browser entirely and activate the license in a single HTTP call. Ideal for:- Automated deploys (CI/CD, Terraform, Ansible)
- Multiple instances of the same product across servers
- Ephemeral containers that spin up and down frequently
- Programmatic provisioning (multi-tenant, multi-region)
The first activation still has to go through the manual flow (browser + Magic Link/OAuth). Only after that the email becomes “known” to the licensing server, and auto-activation starts working.
Endpoint
Success response (200):
api_key is ready to use immediately — there is no need to call /v1/activate afterward. The instance is already active server-side.
If the call is repeated with the same (email, instance_id), the response includes "reused": true and returns the same api_key from the previous call. This makes the call idempotent — safe for retry in boot scripts.
Trust model
The licensing server accepts the call using only the email as proof of identity. No second factor, no captcha, no rate limit. Why:- The email was verified once (in the initial manual registration via Magic Link or OAuth)
- Issuing a license to a customer is not a destructive action — all instances stay visible in the customer portal
- The customer can revoke
api_keys at any moment if they detect unauthorized use - The customer can disable auto-activation (
auto_activation_enabled = false) in the portal if they suspect the email leaked
Error codes
The
CUSTOMER_NOT_FOUND response is the canonical signal for the client to fall back to the manual flow. Always implement that fallback — a brand-new email needs to go through the manual flow first.
Recommended client flow
Standard env var
Evolution products read the operator email from theEVOLUTION_OPERATOR_EMAIL env var:
Idempotency in detail
The call is idempotent on(email, instance_id):
This is what makes the route safe to call on container startup — if the container has registered before, it gets the same key; if it’s new, it gets a fresh key.
Containers that always generate a new UUID on every boot accumulate APIKeys (one per boot) under the same customer. For true idempotent behavior, persist the
instance_id to a mounted volume (/data/instance-id) across restarts.How to disable for my customer
In the customer portal (https://license.evolutionfoundation.com.br/portal) there is an “Auto-Activation by Email” toggle.
When disabled:
- All
/v1/register/autocalls with your email return403 AUTO_ACTIVATION_DISABLED - New deploys mandatorily go through the manual flow (browser + Magic Link/OAuth)
- Your existing
api_keys keep working normally
- Operate in regulated environments and want an audit trail on every activation
- Have a publicly-known email and want to reduce attack surface
- Suspect misuse of the email
Auditing
Every call to/v1/register/auto produces an activation_logs row with alert_type = 'auto_activation'. The customer portal shows:
- Date/time of each auto-activation
- IP of the requesting server
- Approximate location (country/city via GeoIP)
- Result (
createdorreused)
Next steps
Manual flow
Full
/v1/register/init flow — required for first registrationTelemetry
What is sent on each licensing call
FAQ
Frequently asked questions
Overview
Licensing system summary