API Authentication
API Authentication
Section titled “API Authentication”Learn how to authenticate with the Mailiam API, manage API keys, and implement secure authentication in your applications.
Overview
Section titled “Overview”Mailiam uses API key authentication for server-side requests while supporting both authenticated and unauthenticated requests from browsers based on domain configuration.
Authentication Types
Section titled “Authentication Types”- API Key Authentication - Required for server-side API calls
- Domain-Based Authentication - Allows form submissions from verified domains
- Collection-Based Authentication - Optional API key requirement for collections
API Key Format
Section titled “API Key Format”Mailiam API keys follow a standardized format:
mlm_[environment]_[random_string]
Examples:mlm_sk_live_abc123def456... # Production keymlm_sk_test_xyz789abc123... # Test/development keyKey Types
Section titled “Key Types”| Type | Prefix | Environment | Use Case |
|---|---|---|---|
| Live | mlm_sk_live_ | Production | Production applications |
| Test | mlm_sk_test_ | Development | Testing and development |
| Restricted | mlm_rk_ | Any | Limited permissions |
Getting API Keys
Section titled “Getting API Keys”1. CLI Method (Recommended)
Section titled “1. CLI Method (Recommended)”# Create account and get API keymailiam signup
# Check current keymailiam auth status2. Dashboard Method
Section titled “2. Dashboard Method”- Log into Mailiam dashboard
- Navigate to API Keys section
- Generate new key with appropriate permissions
- Store securely in your application
Authentication Methods
Section titled “Authentication Methods”Server-Side Authentication
Section titled “Server-Side Authentication”For backend applications, include the API key in the request header:
curl -X POST https://api.mailiam.dev/projects \ -H "Authorization: Bearer mlm_sk_live_abc123..." \ -H "Content-Type: application/json" \ -d '{"name": "My Project"}'Alternative header formats:
# X-Api-Key headercurl -H "X-Api-Key: mlm_sk_live_abc123..." \ https://api.mailiam.dev/projects
# Mailiam-Api-Key headercurl -H "Mailiam-Api-Key: mlm_sk_live_abc123..." \ https://api.mailiam.dev/projectsClient-Side Form Submissions
Section titled “Client-Side Form Submissions”For browser form submissions to verified domains, no API key is required:
<!-- Direct form submission (no API key needed) --><form action="https://api.mailiam.dev/yourdomain.com/contact" method="POST"> <input name="name" placeholder="Name" required> <input name="email" type="email" placeholder="Email" required> <textarea name="message" placeholder="Message" required></textarea> <button type="submit">Send</button></form>JavaScript Fetch with API Key
Section titled “JavaScript Fetch with API Key”For client-side applications that need API access:
// Note: Only expose API keys for trusted client-side appsconst response = await fetch('https://api.mailiam.dev/instant/forms', { method: 'POST', headers: { 'Authorization': 'Bearer mlm_sk_live_abc123...', 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'Contact Form', email: 'contact@example.com' })});API Endpoints and Authentication
Section titled “API Endpoints and Authentication”Public Endpoints (No Authentication Required)
Section titled “Public Endpoints (No Authentication Required)”| Endpoint | Method | Description |
|---|---|---|
/v1/{domain}/send | POST | Form submission to verified domain |
/c/{collection}/{form} | POST | Collection form submission (if configured) |
/f/{formId} | POST | Instant form submission |
Protected Endpoints (API Key Required)
Section titled “Protected Endpoints (API Key Required)”| Endpoint | Method | Description |
|---|---|---|
/projects | GET, POST | Project management |
/domains | GET, POST | Domain management |
/instant/forms | GET, POST | Instant form management |
/collections | GET, POST | Collection management |
/analytics | GET | Usage analytics |
Administrative Endpoints (Elevated Permissions)
Section titled “Administrative Endpoints (Elevated Permissions)”| Endpoint | Method | Description |
|---|---|---|
/admin/tenants | GET, POST | Tenant management |
/admin/usage | GET | Global usage statistics |
/admin/billing | GET, POST | Billing management |
API Key Management
Section titled “API Key Management”Creating API Keys
Section titled “Creating API Keys”# Via CLImailiam auth create-key --name "Production API" --permissions "forms,domains"
# Via APIcurl -X POST https://api.mailiam.dev/api-keys \ -H "Authorization: Bearer mlm_sk_live_existing_key..." \ -H "Content-Type: application/json" \ -d '{ "name": "Production API", "permissions": ["forms", "domains", "analytics"], "restrictions": { "ip_whitelist": ["203.0.113.0/24"], "rate_limit": 1000 } }'Key Permissions
Section titled “Key Permissions”Configure granular permissions for API keys:
{ "permissions": [ "forms.read", "forms.write", "domains.read", "domains.write", "collections.read", "collections.write", "analytics.read", "projects.read", "projects.write" ], "restrictions": { "ip_whitelist": ["192.168.1.0/24", "203.0.113.10"], "domain_restrictions": ["example.com", "api.example.com"], "rate_limit": 5000, "expires_at": "2024-12-31T23:59:59Z" }}Rotating API Keys
Section titled “Rotating API Keys”Regularly rotate API keys for security:
# Create new keymailiam auth create-key --name "Production API v2"
# Test new keyexport MAILIAM_API_KEY="mlm_sk_live_new_key..."mailiam test config
# Update applications with new key# Then revoke old keymailiam auth revoke-key "old_key_id"Security Best Practices
Section titled “Security Best Practices”1. Environment Variables
Section titled “1. Environment Variables”Store API keys as environment variables:
# Developmentexport MAILIAM_API_KEY="mlm_sk_test_abc123..."
# Productionexport MAILIAM_API_KEY="mlm_sk_live_xyz789..."2. Never Commit Keys
Section titled “2. Never Commit Keys”Add to .gitignore:
# Environment files.env.env.local.env.production
# Configuration files with secretsmailiam.prod.yamlconfig/production.yaml3. Use Restricted Keys
Section titled “3. Use Restricted Keys”Create keys with minimal required permissions:
# Key only for form submissionsmailiam auth create-key \ --name "Forms Only" \ --permissions "forms.write" \ --rate-limit 100
# Key only for reading analyticsmailiam auth create-key \ --name "Analytics Read" \ --permissions "analytics.read" \ --rate-limit 504. IP Restrictions
Section titled “4. IP Restrictions”Limit API key usage to specific IP addresses:
{ "name": "Production API", "restrictions": { "ip_whitelist": [ "203.0.113.10", // Production server "192.168.1.0/24", // Internal network "2001:db8::/32" // IPv6 range ] }}5. Rate Limiting
Section titled “5. Rate Limiting”Set appropriate rate limits for each key:
{ "name": "High Volume API", "restrictions": { "rate_limit": 10000, // 10k requests per hour "burst_limit": 100 // 100 requests per minute }}Framework Integration
Section titled “Framework Integration”Next.js API Routes
Section titled “Next.js API Routes”export default async function handler(req, res) { if (req.method !== 'POST') { return res.status(405).json({ message: 'Method not allowed' }); }
try { const formData = new FormData(); Object.entries(req.body).forEach(([key, value]) => { formData.append(key, value); });
const response = await fetch('https://api.mailiam.dev/yourdomain.com/contact', { method: 'POST', headers: { 'X-Api-Key': process.env.MAILIAM_API_KEY }, body: formData });
if (response.ok) { res.status(200).json({ message: 'Message sent successfully' }); } else { const error = await response.json(); res.status(400).json({ error: error.message }); } } catch (error) { res.status(500).json({ error: 'Internal server error' }); }}Express.js Middleware
Section titled “Express.js Middleware”const express = require('express');const app = express();
// Middleware to add Mailiam API keyapp.use('/api/mailiam', (req, res, next) => { req.headers['x-api-key'] = process.env.MAILIAM_API_KEY; next();});
// Contact form endpointapp.post('/api/contact', async (req, res) => { const formData = new FormData(); Object.entries(req.body).forEach(([key, value]) => { formData.append(key, value); });
try { const response = await fetch('https://api.mailiam.dev/yourdomain.com/contact', { method: 'POST', headers: { 'X-Api-Key': process.env.MAILIAM_API_KEY }, body: formData });
const result = await response.json(); res.json(result); } catch (error) { res.status(500).json({ error: error.message }); }});Laravel Integration
Section titled “Laravel Integration”'mailiam' => [ 'api_key' => env('MAILIAM_API_KEY'), 'base_url' => 'https://api.mailiam.dev',],
// app/Services/MailiamService.php<?php
namespace App\Services;
use Illuminate\Support\Facades\Http;
class MailiamService{ protected $apiKey; protected $baseUrl;
public function __construct() { $this->apiKey = config('services.mailiam.api_key'); $this->baseUrl = config('services.mailiam.base_url'); }
public function submitForm($domain, $form, $data) { $response = Http::withHeaders([ 'X-Api-Key' => $this->apiKey, ])->post("{$this->baseUrl}/{$domain}/{$form}", $data);
return $response->json(); }}Error Handling
Section titled “Error Handling”Authentication Errors
Section titled “Authentication Errors”Handle authentication errors gracefully:
const submitForm = async (formData) => { try { const response = await fetch('https://api.mailiam.dev/yourdomain.com/contact', { method: 'POST', headers: { 'X-Api-Key': process.env.MAILIAM_API_KEY }, body: formData });
if (response.status === 401) { throw new Error('Invalid API key'); }
if (response.status === 403) { throw new Error('Insufficient permissions'); }
if (response.status === 429) { throw new Error('Rate limit exceeded'); }
if (!response.ok) { throw new Error('Request failed'); }
return await response.json(); } catch (error) { console.error('Form submission error:', error); throw error; }};Common HTTP Status Codes
Section titled “Common HTTP Status Codes”| Code | Meaning | Resolution |
|---|---|---|
200 | Success | Request processed successfully |
400 | Bad Request | Check request format and required fields |
401 | Unauthorized | Verify API key is correct and active |
403 | Forbidden | Check API key permissions |
404 | Not Found | Verify endpoint URL and domain |
429 | Too Many Requests | Implement rate limiting and backoff |
500 | Server Error | Contact support if persistent |
Testing Authentication
Section titled “Testing Authentication”Test API Key Validity
Section titled “Test API Key Validity”# Test API keycurl -H "Authorization: Bearer mlm_sk_live_your_key..." \ https://api.mailiam.dev/projects
# Expected response for valid key:{ "projects": [...], "count": 5}
# Expected response for invalid key:{ "error": "Invalid API key", "code": "AUTH_INVALID_KEY"}Test Permissions
Section titled “Test Permissions”# Test specific permissioncurl -H "Authorization: Bearer mlm_sk_live_your_key..." \ https://api.mailiam.dev/analytics
# Test form submissioncurl -X POST https://api.mailiam.dev/yourdomain.com/contact \ -H "X-Api-Key: mlm_sk_live_your_key..." \ -F "name=Test User" \ -F "email=test@example.com" \ -F "message=Test message"Debug Authentication Issues
Section titled “Debug Authentication Issues”# Check API key statusmailiam auth status --debug
# Test API connectivitymailiam test config --check-api
# Validate permissionsmailiam auth permissions --key-id "key_abc123"Monitoring API Usage
Section titled “Monitoring API Usage”Usage Analytics
Section titled “Usage Analytics”Monitor API key usage:
# View API usagemailiam analytics api-usage --last-30d
# View by API keymailiam analytics api-usage --key "mlm_sk_live_abc123" --last-7d
# Export usage datamailiam analytics export --type api-usage --format csvRate Limit Monitoring
Section titled “Rate Limit Monitoring”Track rate limit usage:
# Check current rate limitscurl -H "Authorization: Bearer mlm_sk_live_your_key..." \ https://api.mailiam.dev/rate-limits
# Response includes current usage{ "rate_limits": { "requests_per_hour": { "limit": 5000, "remaining": 4847, "reset_time": "2024-01-01T15:00:00Z" }, "requests_per_minute": { "limit": 100, "remaining": 92, "reset_time": "2024-01-01T14:31:00Z" } }}Need Help?
Section titled “Need Help?”Documentation Resources
Section titled “Documentation Resources”- API Endpoints Reference - Complete endpoint documentation
- Rate Limits - Detailed rate limiting information
- CLI Authentication - CLI-specific authentication
Support Channels
Section titled “Support Channels”- API Documentation: https://api.mailiam.dev/docs
- Support Email: api-support@mailiam.dev
- Discord Community: Real-time API help
- GitHub Issues: Report API bugs and issues
Common Questions
Section titled “Common Questions”Q: Can I use API keys in frontend JavaScript? A: Only for trusted environments. Use domain-based authentication for public websites.
Q: How do I rotate API keys without downtime? A: Create a new key, test it, update your applications, then revoke the old key.
Q: What happens if I exceed rate limits?
A: You’ll receive a 429 Too Many Requests response. Implement exponential backoff.
Q: Can I restrict API keys to specific domains? A: Yes, use domain restrictions when creating keys.
Proper API authentication ensures secure access to Mailiam’s services while maintaining the flexibility needed for various application architectures.