Foundations
Writing
Voice and tone rules, plus the microcopy registry, formatter library, and error catalog that back every piece of text in the product.
Voice & tone
Concise
Say the one thing that matters. Cut qualifiers and throat-clearing.
Active
"Your key was revoked," not "Your key has been revoked by the system."
User-centric
Describe what the user can do next, not what the system did internally.
Never blame
A validation error is a mismatch to fix, not a mistake the user made.
Match intent
This reads like infra documentation, not marketing — developers trust precision over enthusiasm.
Microcopy registry
Sample keys and values from lib/copy.ts.
| Category | Key | Value |
|---|---|---|
| emptyStates | noSearchRequests | No search requests yet |
| emptyStates | noApiKeys | No API keys yet — create one to start making requests |
| emptyStates | noActivity | Nothing has happened here yet |
| emptyStates | noResults | No results match your filters |
| confirmations | deleteApiKey | This will immediately revoke the key. Any service using it will start failing. |
| confirmations | deleteWebhook | This endpoint will stop receiving events immediately. |
| confirmations | downgradePlan | Your QPS limit will drop at the start of the next billing cycle. Existing requests won't be interrupted. |
| confirmations | leaveWithUnsavedChanges | Your changes haven't been saved. Leaving now will discard them. |
| ctas | primary | Start Building |
| ctas | secondary | View Docs |
| ctas | upgrade | Upgrade for higher QPS |
| ctas | createApiKey | Create API key |
| ctas | retryRequest | Retry request |
| tooltips | latencyP50 | Median response time across the last 1,000 requests |
| tooltips | qps | Queries per second currently provisioned for this key |
| tooltips | deepSearch | Multi-hop retrieval across sources — higher latency, higher recall |
| tooltips | freshnessIndex | How recently this result was crawled or re-indexed |
| onboarding | welcomeTitle | You're ready to make your first call |
| onboarding | apiKeyStep | Grab your API key from the dashboard — it's shown once, so copy it now |
| onboarding | firstRequestStep | Send a request to /v1/search with a query and mode |
| onboarding | inviteTeamStep | Invite teammates to share usage and billing on one workspace |
Formatters
Every row is a live call into lib/format.ts — not hardcoded output.
| Function | Input | Output |
|---|---|---|
| formatMoney | 284112 | $2,841.12 |
| formatMoney (compact) | 128492000, { compact: true } | $1.3M |
| formatNumber | 1284920 | 1,284,920 |
| formatPercent | 0.997 | 99.7% |
| formatBytes | 1536 | 1.50 KB |
| formatBytes | 184320000 | 176 MB |
| formatDate | 2026-07-20T09:14:00.000Z | Jul 20, 2026 |
| formatTime | 2026-07-20T09:14:00.000Z | 9:14 AM |
| formatDateTime | 2026-07-20T09:14:00.000Z | Jul 20, 2026, 9:14 AM |
| formatRelativeTime | 2026-07-20T09:14:00.000Z, now=2026-08-03 | 2 weeks ago |
| formatDateRange | 2026-07-20T09:14:00.000Z → 2026-07-24T17:40:00.000Z | Jul 20–24, 2026 |
| formatDuration | 340 | 340ms |
| formatDuration | 92000 | 1m 32s |
| formatDuration | 5_430_000 | 1h 30m |
| formatList | ["Deep Search", "Web Search", "Web Chat"] | Deep Search, Web Search, and Web Chat |
| initials | "Sarah Chen" | SC |
Error catalog
Every entry in lib/errors.ts.
| Code | Title | Body | CTA |
|---|---|---|---|
| UNAUTHORIZED | Sign in required | Your session has expired or your API key is missing. Sign in again or attach a valid key. | Sign in |
| FORBIDDEN | You don't have access to this | Your account or API key doesn't have permission for this resource. Ask a workspace admin to grant access. | Request access |
| NOT_FOUND | We couldn't find that | This search request, key, or resource doesn't exist — it may have been deleted or the ID is wrong. | — |
| RATE_LIMITED | You've hit your rate limit | Your API key is provisioned for a fixed QPS. Slow down your request rate or upgrade for higher throughput. | Upgrade for higher QPS |
| CONFLICT | That already exists | A resource with this name or identifier already exists in your workspace. Choose a different one. | — |
| TIMEOUT | The request timed out | An upstream source didn't respond in time. This is usually transient — retrying often succeeds. | Retry request |
| SERVER_ERROR | Something went wrong on our end | We hit an unexpected error processing this request. Our team has been notified automatically. | Retry request |
| VALIDATION_ERROR | Check your request | One or more fields are missing or malformed. Review the request body against the API reference. | View Docs |