# Using Test Mode

> Use test API keys and predefined scenarios to build and test your integration without affecting real data.

**Category:** getting-started | **Last updated:** March 13, 2026

---

Test mode lets you build your integration against predictable, deterministic responses without consuming your monthly validation quota.

## Test vs live keys

| | Test key | Live key |
|---|---------|----------|
| Prefix | `fidro_test_...` | `fidro_live_...` |
| Data | Predefined scenarios | Real validation |
| Quota | Does not count | Counts toward monthly limit |
| Use for | Development, CI/CD, staging | Production |

## Predefined test scenarios

Use these email addresses with your test key to simulate specific outcomes:

| Email | Risk score | Recommendation |
|-------|-----------|---------------|
| `safe@test.fidro.io` | 5 | allow |
| `risky@test.fidro.io` | 55 | review |
| `dangerous@test.fidro.io` | 85 | block |
| `disposable@test.fidro.io` | 72 | block |
| `vpn@test.fidro.io` | 45 | review |

These test emails always return the same scores, making them ideal for automated tests and CI pipelines.

## Test IPs

| IP | Scenario |
|----|---------|
| `203.0.113.1` | Clean residential IP |
| `198.51.100.1` | VPN/proxy detected |
| `192.0.2.1` | Tor exit node |

## Writing integration tests

```php
// PHPUnit example
public function test_blocks_high_risk_signups()
{
    // Use test API key in your test environment
    $response = $this->post('/register', [
        'email' => 'dangerous@test.fidro.io',
        'password' => 'SecurePassword123',
    ]);

    $response->assertSessionHasErrors('email');
    $this->assertDatabaseMissing('users', [
        'email' => 'dangerous@test.fidro.io',
    ]);
}
```

## Switching to live

When you're ready to go to production, swap your test key for a live key in your environment variables. No code changes needed — the API behaves identically, just with real data.