# Plans and migration

Keep one account key across plans and upgrade to SDK 0.2.0. Replace legacy credentials and use the unified IronDome API origin.

Manage free and pay-as-you-go access from your IronDome account. All checks use `https://api.irondome.dev`; normal plan changes keep both your unified account key and the API origin unchanged.

## Enable paid access

1. Open [billing](https://app.irondome.dev/billing), complete setup, and confirm paid access is active.
2. Keep using your existing unified account key and SDK client. Wait for the account policy update to publish.
3. Send a controlled check, confirm success, and review recorded usage. The check consumes usage; accounting can lag.

A submitted billing form or pending plan update is not proof authorization has changed. Confirm account state before enabling production traffic.

## Upgrade to SDK 0.2.0

Version 0.2.0 defaults to `https://api.irondome.dev`. Update your dependency and use the constructor for your language:

| SDK | Install | Constructor |
| --- | --- | --- |
| JavaScript | `npm install @irondome-dev/sdk@0.2.0` | `new IronDome({ apiKey })` |
| Go | `go get github.com/IrondomeDev/sdks/go@v0.2.0` | `irondome.New(key, irondome.Options{})` |
| Rust | `irondome-sdk = "=0.2.0"` in Cargo.toml | `Client::new(key, Options::default())` |
| Python | [Public tagged source](/docs/guides/python#availability); PyPI pending | `Client(key)` or `AsyncClient(key)` |

Go's old `New(key, origin, options)` becomes `New(key, options)`. Rust's old `Client::new(key, origin, options)` becomes `Client::new(key, options)`. For trusted staging, set Go's `Options.BaseURL` or Rust's `Options::base_url` instead. Update Go imports to `github.com/IrondomeDev/sdks/go`.

Remove legacy free origins from your configuration. Single checks, bulk checks and health retain their routes and response contract: `/v1/check`, `/v1/check/bulk` and `/healthz`. Review [errors](/docs/errors) and [client lifecycles](/docs/guides/performance) before deploying.

## Replace a legacy key

Existing `dome_free_v1.` and `dome_live_v1.` keys are retired. Create a new unified account key in [API keys](https://app.irondome.dev/keys); newly issued keys begin with `dome_acct_v1.`. Treat the complete credential as opaque: editing a prefix does not migrate a signed key.

1. Save the newly issued key in your server's secret manager.
2. Change the API origin to `https://api.irondome.dev`. The old `free.irondome.dev` endpoint returns HTTP `410 Gone`; SDK 0.2.0 rejects legacy free origins.
3. Update all deployments and recreate clients that hold the replaced credential. Drain outstanding work before closing old clients.
4. Perform one controlled check and confirm success. This consumes usage.
5. Revoke any replaced credential still listed as active.

This is a one-time credential migration. Future normal plan changes use the same unified account key. Supabase native hooks keep their installation URL and signing secret; SDK upgrades do not replace hook configuration.

## Handle quota exhaustion

HTTP `429 monthly_quota_exceeded` means free-quota policy denies another check. Retrying does not reset it. Wait for the UTC monthly reset or explicitly arrange paid access.

Avoid automatic fallback between credentials or plans: it can change costs without the operator's knowledge. A quota failure is not a classification.

## Read usage

Use [GET /v1/usage](/docs/api/usage) for a free allowance. It returns HTTP `403 free_usage_only` for a paid context. Read paid usage and invoices in the [dashboard](https://app.irondome.dev/usage) and [billing page](https://app.irondome.dev/billing).

## Verify integrations

Retest [Supabase Auth](/docs/guides/supabase) and your server's signup flow after plan or credential changes. Keep failures separate from allowed-email results.

Review [plans and limits](/docs/plans) for counting and asynchronous quota behavior.
