Form validation is essential for data quality and user experience. TinyFn provides validation endpoints that work consistently across any language or framework - no regex knowledge required.
Available Validation Endpoints
Email Validation
GET /v1/validate/email?email=user@example.com
Validates email syntax including international domains. Returns parsed parts (local, domain).
URL Validation
GET /v1/validate/url?url=https://example.com
Validates URL format. Returns parsed components (protocol, host, path, query).
Phone Validation
GET /v1/validate/phone?phone=%2B12125551234&country=US
Validates phone numbers with international support. Returns formatted versions.
Credit Card Validation
GET /v1/validate/credit-card?number=4532015112830366
Validates credit card numbers using Luhn algorithm. Identifies card type.
Password Strength
GET /v1/validate/password-strength?password=MySecurePass123!
Analyzes password strength. Returns score and improvement suggestions.
IP Address Validation
GET /v1/validate/ip?ip=192.168.1.1
Validates IPv4 and IPv6 addresses. Identifies type and range.
Example: React Registration Form
import { useState } from 'react';
const API_KEY = process.env.REACT_APP_TINYFN_KEY;
async function validateField(type, value) {
const endpoints = {
email: `/v1/validate/email?email=${encodeURIComponent(value)}`,
url: `/v1/validate/url?url=${encodeURIComponent(value)}`,
phone: `/v1/validate/phone?phone=${encodeURIComponent(value)}&country=US`
};
const response = await fetch(`https://api.tinyfn.io${endpoints[type]}`, {
headers: { 'X-API-Key': API_KEY }
});
return response.json();
}
export function RegistrationForm() {
const [email, setEmail] = useState('');
const [errors, setErrors] = useState({});
const handleEmailBlur = async () => {
const result = await validateField('email', email);
if (!result.is_valid) {
setErrors(prev => ({ ...prev, email: 'Please enter a valid email' }));
} else {
setErrors(prev => ({ ...prev, email: null }));
}
};
return (
<form>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
onBlur={handleEmailBlur}
placeholder="Email address"
/>
{errors.email && <span className="error">{errors.email}</span>}
</form>
);
}
Example: Python Backend Validation
import requests
from functools import lru_cache
API_KEY = os.environ.get('TINYFN_KEY')
BASE_URL = 'https://api.tinyfn.io/v1'
@lru_cache(maxsize=1000)
def validate_email(email: str) -> tuple[bool, str | None]:
"""Validate email with caching."""
response = requests.get(
f'{BASE_URL}/validate/email',
params={'email': email},
headers={'X-API-Key': API_KEY}
)
data = response.json()
if data['is_valid']:
return True, None
return False, 'Invalid email address'
def validate_registration(data: dict) -> dict[str, str]:
"""Validate all registration fields."""
errors = {}
# Email validation
is_valid, error = validate_email(data.get('email', ''))
if not is_valid:
errors['email'] = error
# Password strength
response = requests.get(
f'{BASE_URL}/validate/password-strength',
params={'password': data.get('password', '')},
headers={'X-API-Key': API_KEY}
)
strength = response.json()
if strength['score'] < 3:
errors['password'] = f"Password too weak. {strength['feedback']}"
return errors
# Usage in Flask/FastAPI
@app.post('/api/register')
def register(data: RegisterRequest):
errors = validate_registration(data.dict())
if errors:
raise HTTPException(400, detail=errors)
# Continue with registration...
Why Use TinyFn for Validation?
No Regex Maintenance
Email regex patterns are notoriously complex. We handle edge cases so you don't have to maintain fragile patterns.
Consistent Across Stack
Same validation logic in your React frontend and Python backend. No drift between client and server validation.
International Support
Phone numbers, international emails, Unicode - all handled correctly without additional libraries.
Detailed Responses
Get parsed components, suggestions, and error messages. Build better UX with rich validation feedback.
Start Validating Today
Get your free API key and validate 100 fields per month for free.
Get Free API Key