Getting Started
Integrate LoveConnet identity verification in minutes
LoveConnet is the world's first verified human identity platform for developers. Unlike traditional OAuth providers that only verify an email address, LoveConnet provides real face verification, AI-powered trust scores, and ID document checks โ all accessible through a simple REST API or one of our SDKs.
What makes LoveConnet different?
Real biometric verification, not just selfies
AI behavioral analysis across 50+ signals
Bracketed data only โ never raw DOBs or scores
Quick Start (3 steps)
Create an app
Go to the Developer Portal and click "Create app". You'll receive a client_id and client_secret.
Generate an API key
In your app's settings, generate an API key. Keys start with lc_live_ (production) or lc_test_ (sandbox). Store it securely โ it's only shown once.
Install an SDK and make your first call
Choose your language below and start verifying users in under 5 minutes.
javascriptnpm install @loveconnet/js
import { LoveConnet } from '@loveconnet/js';
const lc = new LoveConnet({
clientId: 'YOUR_CLIENT_ID',
redirectUri: 'https://yourapp.com/callback',
apiKey: 'lc_live_xxx',
});
// Redirect user to login
await lc.login(['profile', 'verified', 'trust_score']);Authentication
OAuth 2.0 Authorization Code Flow with PKCE
LoveConnet uses OAuth 2.0 with PKCE (Proof Key for Code Exchange, RFC 7636). PKCE is mandatory for all clients โ including server-side apps. This eliminates the need to expose client secrets in mobile or frontend code and prevents authorization code interception attacks.
400 error. Our SDKs handle PKCE automatically โ you don't need to implement it yourself.Step 1: Authorization Request
Redirect the user's browser to the authorization endpoint. The user will see the LoveConnet consent screen showing which permissions your app is requesting.
httpGET https://loveconnet.com/api/oauth/authorize
?client_id=lc_abc123def456
&redirect_uri=https://yourapp.com/callback
&response_type=code
&scope=openid profile email verified trust_score age
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256
&state=xyzrandom123Parameters
client_idRequiredYour app's client ID from the portalredirect_uriRequiredMust match one of your registered URIs exactlyresponse_typeRequiredAlways "code"scopeRequired"openid" is mandatory. Add: profile, email, verified, trust_score, agecode_challengeRequiredBase64url-encoded SHA256 hash of your code_verifiercode_challenge_methodRequiredAlways "S256"stateRecommendedRandom string to prevent CSRF โ verify it on callbackStep 2: Token Exchange
After the user approves, they're redirected to your redirect_uri with an authorization code. Exchange it for tokens:
httpPOST https://loveconnet.com/api/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=AUTH_CODE_FROM_CALLBACK
&redirect_uri=https://yourapp.com/callback
&client_id=lc_abc123def456
&code_verifier=YOUR_ORIGINAL_CODE_VERIFIERThe response contains your access token, refresh token, and ID token:
json{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "v1.MjAyNi0wNS0wNFQx...",
"id_token": "eyJhbGciOiJSUzI1NiIs...",
"scope": "openid profile email verified trust_score"
}Step 3: Call the API
Use the access token to call any API endpoint. Pass it as the X-User-Token header along with your API key:
httpGET https://loveconnet.com/api/v1/user/profile
X-API-Key: lc_live_xxx
X-User-Token: eyJhbGciOiJSUzI1NiIs...
โ 200 OK
{
"sub": "clx1abc2def3",
"name": "Sarah Johnson",
"bio": "Love hiking and coffee โ",
"picture": "https://cdn.loveconnet.com/photos/..."
}Token Refresh
Access tokens expire after 1 hour. Use the refresh token to get a new one without re-prompting the user:
httpPOST https://loveconnet.com/api/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token=v1.MjAyNi0wNS0wNFQx...
&client_id=lc_abc123def456SDK Installation
Official SDKs for every major platform
@loveconnet/jsnpm install @loveconnet/jsimport { LoveConnet } from '@loveconnet/js';
const lc = new LoveConnet({
clientId: 'YOUR_CLIENT_ID',
redirectUri: 'https://yourapp.com/callback',
apiKey: 'lc_live_xxx',
});
// Start PKCE login โ opens consent screen
await lc.login(['profile', 'verified', 'trust_score']);
// On callback page โ exchange code for tokens
await lc.handleCallback(window.location.href);
// Fetch verified user data
const profile = await lc.api.getProfile();
console.log(profile.name); // "Sarah Johnson"
console.log(profile.face_verified); // true
const trust = await lc.api.getTrustScore();
console.log(trust.trust_level); // "EXCELLENT"@loveconnet/react-nativenpm install @loveconnet/react-nativeimport { useLoveConnet } from '@loveconnet/react-native';
function LoginScreen() {
const { login, user, isAuthenticated, logout } = useLoveConnet({
clientId: 'YOUR_CLIENT_ID',
redirectUri: 'myapp://callback',
apiKey: 'lc_live_xxx',
});
if (isAuthenticated) {
return (
<View>
<Text>Welcome {user.name}!</Text>
<Text>Verified: {user.face_verified ? 'โ
' : 'โ'}</Text>
<Button title="Logout" onPress={logout} />
</View>
);
}
return <Button title="Sign in" onPress={() => login(['profile', 'verified'])} />;
}loveconnetpip install loveconnetfrom loveconnet import LoveConnet, AsyncLoveConnet
# โโ Synchronous (scripts, Flask, Django) โโ
lc = LoveConnet(api_key="lc_live_xxx")
profile = lc.get_profile(user_token="eyJ...")
print(f"{profile.name} โ Verified: {profile.face_verified}")
trust = lc.get_trust_score(user_token="eyJ...")
print(f"Trust: {trust.trust_level}") # "EXCELLENT"
age = lc.get_age_range(user_token="eyJ...")
print(f"Over 18: {age.over_18}") # True
# โโ Asynchronous (FastAPI, async Django) โโ
async with AsyncLoveConnet(api_key="lc_live_xxx") as lc:
profile = await lc.get_profile(user_token="eyJ...")
trust = await lc.get_trust_score(user_token="eyJ...")loveconnetflutter pub add loveconnetimport 'package:loveconnet/loveconnet.dart';
final lc = LoveConnet(
clientId: 'YOUR_CLIENT_ID',
redirectUri: 'myapp://callback',
apiKey: 'lc_live_xxx',
);
// Login via system browser
await lc.login(scopes: [Scope.profile, Scope.verified]);
// Handle deep link callback
final user = await lc.handleCallback(uri);
print('${user.name} โ Verified: ${user.faceVerified}');
// Tokens stored in Keychain (iOS) / EncryptedSharedPrefs (Android)
await lc.restoreSession(); // Auto-restore on app startloveconnet/sdkcomposer require loveconnet/sdkuse LoveConnet\LoveConnet;
$lc = new LoveConnet('lc_live_xxx');
$profile = $lc->getProfile($userToken);
echo $profile->name; // "Sarah Johnson"
echo $profile->faceVerified; // true
$trust = $lc->getTrustScore($userToken);
echo $trust->trustLevel; // "EXCELLENT"
// Laravel โ register as singleton
$this->app->singleton(LoveConnet::class, fn () =>
new LoveConnet(config('services.loveconnet.api_key'))
);
// Controller โ inject via DI
public function verify(Request $request, LoveConnet $lc) {
$profile = $lc->getProfile($request->bearerToken());
return response()->json(['verified' => $profile->faceVerified]);
}API Reference
All REST endpoints with request and response examples
Base URL: https://loveconnet.com/api
Required Headers
X-API-Key: lc_live_xxx โ Your API key (always required)X-User-Token: eyJ... โ User's OAuth access token (for /user/* endpoints)/v1/user/profilescope: profileFreeReturns the user's basic profile: name, bio, and primary profile photo. This is the most commonly used endpoint.
json{
"sub": "clx1abc2def3",
"name": "Sarah Johnson",
"bio": "Love hiking and coffee โ",
"picture": "https://cdn.loveconnet.com/photos/abc123.jpg"
}/v1/user/emailscope: emailFreeReturns the user's email address and whether it has been verified through our email confirmation flow.
json{
"email": "[email protected]",
"email_verified": true
}/v1/user/verifiedscope: verifiedFreeReturns whether the user has completed face verification (live biometric) and/or government ID verification. This is LoveConnet's signature feature.
json{
"face_verified": true,
"id_verified": true
}/v1/user/trustscope: trust_scoreStarterReturns the user's trust level bracket based on our AI behavioral analysis (50+ signals). The raw score is never exposed โ only the bracket label and range.
json{
"trust_level": "EXCELLENT",
"trust_bracket": "80-100"
}/v1/user/agescope: ageStarterReturns the user's age as a range bracket (e.g. "25-34") and boolean flags for common legal thresholds. The exact date of birth is never exposed.
json{
"age_range": "25-34",
"over_18": true,
"over_21": true
}/v1/auth/userinfoscope: All grantedFreeStandard OIDC-style userinfo endpoint. Returns all claims the user has consented to in a single response. Useful for getting everything in one call.
json{
"sub": "clx1abc2def3",
"name": "Sarah Johnson",
"email": "[email protected]",
"email_verified": true,
"face_verified": true,
"id_verified": true,
"trust_level": "EXCELLENT",
"over_18": true
}/v1/app/statsscope: None (API key only)FreeReturns your app's aggregate statistics. No user token required โ just your API key.
json{
"total_users": 1250,
"active_users": 980,
"app_id": "lc_abc123",
"tier": "STARTER"
}Trust & Verification as-a-Service
Verification badges, safety scores, image/text screening, and bot detection.
/v1/users/:id/verificationsscope: verification_statusStarterReturns all verification badges: email, phone, face (biometric), and government ID verification status with timestamps.
curl -X GET "https://loveconnet.com/api/v1/users/:id/verifications" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"user_id": "clx1abc2def3",
"verifications": {
"email": { "verified": true },
"phone": { "verified": true },
"face": { "verified": true, "verified_at": "2026-03-15T..." },
"identity": { "verified": false, "verified_at": null }
},
"fully_verified": false
}/v1/users/:id/safety-scorescope: trust_scoreStarterReturns the user's computed safety score (0-100), badge label, and the contributing factors analyzed by our AI.
curl -X GET "https://loveconnet.com/api/v1/users/:id/safety-score" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"user_id": "clx1abc2def3",
"score": 87,
"badge": "TRUSTED",
"factors": [
{ "name": "account_age", "impact": 15, "detail": "Account older than 90 days" },
{ "name": "verification", "impact": 25, "detail": "Face verified" },
{ "name": "behavior", "impact": 20, "detail": "No safety alerts" }
]
}/v1/verify/imagescope: verify_contentProScreen any image URL for explicit/unsafe content using GPT-4o. Returns category scores for nudity, violence, hate, drugs, and spam.
curl -X POST "https://loveconnet.com/api/v1/verify/image" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"safe": true,
"confidence": 0.95,
"categories": {
"nudity": 0.02,
"violence": 0.01,
"hate": 0.0,
"drugs": 0.0,
"spam": 0.03
},
"reason": null
}/v1/verify/textscope: verify_contentProScreen text for scam indicators and manipulation patterns. Combines keyword-based scam detection with AI grooming/manipulation pattern analysis.
curl -X POST "https://loveconnet.com/api/v1/verify/text" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"safe": true,
"scam": {
"detected": false,
"warnings": []
},
"manipulation": {
"score": 5,
"indicators": []
}
}/v1/verify/bot-checkscope: None (API key only)StarterGenerate a behavioral bot detection challenge. The user must interact with the challenge and submit behavioral data (hold duration, mouse movements, etc).
curl -X POST "https://loveconnet.com/api/v1/verify/bot-check" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"challenge_id": "ch_9f8a7b6c5d4e",
"expires_at": "2026-05-04T17:15:00Z"
}/v1/verify/bot-check/validatescope: None (API key only)StarterValidate a bot check challenge with the user's behavioral data. Returns is_human boolean and a signed verification token if passed.
curl -X POST "https://loveconnet.com/api/v1/verify/bot-check/validate" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"is_human": true,
"token": "eyJhbGciOiJIUzI1NiIs...",
"reason": null
}Safety & Content Moderation API
AI-powered image moderation, text screening, and conversation analysis.
/v1/moderate/imagescope: moderate_contentProFull image moderation powered by GPT-4o. Analyzes for nudity, violence, hate speech, drugs, and spam with confidence scores and an actionable recommendation.
curl -X POST "https://loveconnet.com/api/v1/moderate/image" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"approved": true,
"confidence": 0.93,
"categories": {
"nudity": 0.01,
"violence": 0.0,
"hate_speech": 0.0,
"drugs": 0.0,
"spam": 0.02
},
"reason": null,
"recommendation": "APPROVE"
}/v1/moderate/textscope: moderate_contentStarterText safety screening combining scam keyword detection with AI manipulation/grooming pattern analysis. Returns risk level and actionable recommendation.
curl -X POST "https://loveconnet.com/api/v1/moderate/text" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"safe": false,
"risk_level": "MEDIUM",
"scam_detection": {
"flagged": true,
"warning_count": 1,
"warnings": [{
"keyword": "send money",
"category": "financial",
"severity": "HIGH",
"message": "Potential financial scam detected"
}]
},
"manipulation_detection": {
"score": 15,
"indicators": []
},
"recommendation": "FLAG_FOR_REVIEW"
}/v1/moderate/conversationscope: moderate_contentProAnalyze an entire conversation history for grooming/manipulation patterns. Pass messages as sender/receiver roles. Returns threat level with unique behavioral indicators.
curl -X POST "https://loveconnet.com/api/v1/moderate/conversation" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"threat_level": "LOW",
"average_risk_score": 8,
"messages_analyzed": 24,
"unique_indicators": [],
"recommendation": "SAFE"
}/v1/moderate/categoriesscope: None (public)FreeList all moderation categories with descriptions and which tiers can access each type of moderation.
curl -X GET "https://loveconnet.com/api/v1/moderate/categories" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"image_categories": [
{ "id": "nudity", "name": "Nudity & Sexual Content", "score_range": "0-1" },
{ "id": "violence", "name": "Violence & Gore", "score_range": "0-1" }
],
"text_categories": [
{ "id": "scam", "name": "Scam Detection" },
{ "id": "grooming", "name": "Grooming Detection" }
],
"tiers": {
"image_moderation": "PRO",
"text_moderation": "STARTER+",
"conversation_analysis": "PRO"
}
}Matching & Compatibility API
Compatibility scoring, user preferences, interests, and profile photos.
/v1/match/compatibilityscope: matchingStarterCalculate a multi-dimensional compatibility score between two consented users. Analyzes shared interests, lifestyle habits, relationship goals, and language overlap.
curl -X POST "https://loveconnet.com/api/v1/match/compatibility" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"user_a_id": "clx1abc2def3",
"user_b_id": "clx4ghi5jkl6",
"overall_score": 78,
"dimensions": {
"shared_interests": { "score": 85, "shared": ["hiking", "cooking"], "count": 2 },
"lifestyle": { "score": 75, "matches": 3, "total": 4 },
"relationship_goals": { "score": 100, "a": "long_term", "b": "long_term" },
"language": { "score": 100, "shared": ["English"] }
}
}/v1/users/:id/preferencesscope: profileStarterReturns the user's matching preferences including age range, distance radius, preferred genders, and relationship goal.
curl -X GET "https://loveconnet.com/api/v1/users/:id/preferences" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"user_id": "clx1abc2def3",
"preferences": {
"age_range": { "min": 25, "max": 35 },
"max_distance_km": 50,
"preferred_genders": ["female"],
"relationship_goal": "long_term"
}
}/v1/users/:id/interestsscope: profileFreeReturns the user's interests, lifestyle data (smoking, drinking, exercise, diet), music tastes, languages, and relationship goal.
curl -X GET "https://loveconnet.com/api/v1/users/:id/interests" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"user_id": "clx1abc2def3",
"interests": ["hiking", "cooking", "photography"],
"lifestyle": {
"smoking": "never",
"drinking": "socially",
"exercise": "active",
"diet": null,
"education": "bachelors",
"religion": null,
"height_cm": 175
},
"music": {
"top_artists": ["Burna Boy", "Wizkid"],
"top_genres": ["Afrobeats", "R&B"]
},
"languages": ["English", "Twi"]
}/v1/users/:id/photosscope: photosStarterReturns the user's profile photos with thumbnail URLs, primary flag, and display order.
curl -X GET "https://loveconnet.com/api/v1/users/:id/photos" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"user_id": "clx1abc2def3",
"photo_count": 4,
"photos": [
{ "id": "ph_1", "url": "https://...", "thumbnail_url": "https://...", "is_primary": true, "order": 0 },
{ "id": "ph_2", "url": "https://...", "thumbnail_url": "https://...", "is_primary": false, "order": 1 }
]
}Discovery API
Build dating experiences powered by LoveConnet's verified user base
What is the Discovery API?
The Discovery API enables third-party developers to build dating/social apps on top of LoveConnet's verified human identity platform. Users authenticate via Sign in with LoveConnet, and your app can browse profiles, swipe, match, and get AI-powered recommendations โ all backed by verified real humans.
Paginated, filtered profile discovery with anti-scraping protection
Like, pass, superlike with mutual match detection & webhooks
Scored recommendations based on interests, location & verification
Required Headers
X-API-Key: lc_live_xxx โ Your API key (always required)X-User-Token: eyJ... โ User's OAuth token with discovery scopediscovery scope. Users must also have discoverable consent enabled to appear in browse results. All endpoints include anti-scraping, honeypot detection, and daily quota enforcement.Profile Discovery & Browsing
Browse, filter, and explore verified profiles with secure pagination.
/v1/discover/profilesscope: discoveryFreeBrowse verified profiles with filtering. Supports age range, gender, distance (requires lat/lng), interests, online status, and trust score filters. Results use signed pagination tokens to prevent scraping. Daily quota is enforced per tier.
age_min, age_max, gender, verified_only, min_trust_score, distance_km, lat, lng, interests, online_now, limit, page_tokencurl -X GET "https://loveconnet.com/api/v1/discover/profiles" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"data": [
{
"user_id": "clx1abc2def3",
"name": "Sarah",
"age": 26,
"bio": "Love hiking and coffee โ",
"city": "Accra",
"gender": "female",
"photos": [{ "url": "https://cdn.loveconnet.com/..." }],
"verifications": { "face": true, "id": true, "photo": true },
"is_online": true,
"interests": ["hiking", "cooking", "photography"]
}
],
"pagination": {
"page_token": "eyJ0eXAiOiJKV1Qi...",
"has_more": true,
"limit": 10
},
"quota": { "remaining": 149, "limit": 150 },
"request_id": "req_a1b2c3d4e5f6"
}/v1/discover/filtersscope: None (public)FreeReturns all available filter options with types, ranges, and defaults. Use this to populate filter UIs dynamically. No authentication required.
curl -X GET "https://loveconnet.com/api/v1/discover/filters" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"filters": {
"age": { "min": 18, "max": 100, "type": "range" },
"gender": { "options": ["male", "female", "non_binary", "other"], "type": "select" },
"distance_km": { "min": 1, "max": 500, "type": "range", "requires": ["lat", "lng"] },
"verified_only": { "type": "boolean", "default": true },
"min_trust_score": { "min": 0, "max": 100, "type": "range" },
"interests": { "type": "comma_separated" },
"online_now": { "type": "boolean", "default": false }
},
"sort_options": ["last_active", "trust_score", "distance"],
"max_page_size": 20
}/v1/discover/recommendationsscope: discoveryFreeAI-powered profile recommendations scored by shared interests, city proximity, verification level, and recent activity. Returns up to 10 ranked profiles with score explanations.
curl -X GET "https://loveconnet.com/api/v1/discover/recommendations" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"data": [
{
"user_id": "clx4ghi5jkl6",
"name": "Ama",
"age": 24,
"recommendation_score": 85,
"recommendation_reasons": [
"Shared interests: hiking, cooking",
"Same city",
"Verified identity",
"Recently active"
],
"verifications": { "face": true, "id": true, "photo": false },
"photos": [{ "url": "https://cdn.loveconnet.com/..." }]
}
],
"algorithm": "interest_match_v1",
"request_id": "req_f6e5d4c3b2a1"
}Swiping & Matching
Like, pass, superlike with real-time mutual match detection and 30-second undo window.
/v1/discover/likescope: discoveryFreeLike a profile. Automatically checks for mutual match. If both users have liked each other, a match.created webhook is dispatched. Daily like quota enforced per tier. Honeypot detection protects against bots.
curl -X POST "https://loveconnet.com/api/v1/discover/like" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..." \
-H "Content-Type: application/json" \
-d '{ "target_user_id": "clx4ghi5jkl6" }'json{
"liked": true,
"is_match": true,
"match": {
"user_a_id": "clx1abc2def3",
"user_b_id": "clx4ghi5jkl6",
"matched_at": "2026-05-05T20:00:00.000Z"
},
"quota": { "remaining": 49, "limit": 50 },
"undo_available": true,
"undo_expires_in": 30,
"request_id": "req_b2c3d4e5f6a1"
}/v1/discover/passscope: discoveryFreePass/skip a profile. The user will not appear in future discovery results for 30 days. Includes 30-second undo window.
curl -X POST "https://loveconnet.com/api/v1/discover/pass" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..." \
-H "Content-Type: application/json" \
-d '{ "target_user_id": "clx4ghi5jkl6" }'json{
"passed": true,
"undo_available": true,
"undo_expires_in": 30,
"request_id": "req_c3d4e5f6a1b2"
}/v1/discover/superlikescope: discoveryStarterSuper-like a profile (premium action). Requires Basic tier or above. Limited daily quota. Matches from superlikes are tagged with type "superlike" in webhooks.
curl -X POST "https://loveconnet.com/api/v1/discover/superlike" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..." \
-H "Content-Type: application/json" \
-d '{ "target_user_id": "clx4ghi5jkl6" }'json{
"superliked": true,
"is_match": false,
"quota": { "remaining": 4, "limit": 5 },
"request_id": "req_d4e5f6a1b2c3"
}/v1/discover/matchesscope: discoveryFreeRetrieve all mutual matches for the authenticated user. Supports cursor-based pagination. Returns matched profiles with match type (like/superlike) and timestamp.
curl -X GET "https://loveconnet.com/api/v1/discover/matches" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"data": [
{
"user_id": "clx4ghi5jkl6",
"name": "Ama",
"photos": [{ "url": "https://cdn.loveconnet.com/..." }],
"verifications": { "face": true, "id": false, "photo": false },
"matched_at": "2026-05-05T20:00:00.000Z",
"match_type": "like"
}
],
"pagination": {
"cursor": "2026-05-05T20:00:00.000Z",
"has_more": false,
"limit": 20
},
"request_id": "req_e5f6a1b2c3d4"
}/v1/discover/undoscope: discoveryFreeUndo the last like or pass action within a 30-second window. Only the most recent action can be undone. Returns 400 if the window has expired or no action is pending.
curl -X POST "https://loveconnet.com/api/v1/discover/undo" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"undone": true,
"action": "like",
"target_user_id": "clx4ghi5jkl6",
"request_id": "req_f6a1b2c3d4e5"
}Safety & Analytics
Report, block, and monitor discovery analytics for your app.
/v1/discover/reportscope: discoveryFreeReport a profile for policy violations. Valid reasons: fake_profile, inappropriate_content, harassment, spam, underage, scam, other. Triggers a user.safety_flagged webhook to your app.
curl -X POST "https://loveconnet.com/api/v1/discover/report" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..." \
-H "Content-Type: application/json" \
-d '{ "target_user_id": "clx4ghi5jkl6", "reason": "fake_profile", "details": "Profile uses stock photos" }'json{
"reported": true,
"message": "Report submitted. Our safety team will review within 24 hours.",
"request_id": "req_a1b2c3d4e5f6"
}/v1/discover/blockscope: discoveryFreeBlock a user. They will be permanently excluded from this user's discovery feed and match results for this app.
curl -X POST "https://loveconnet.com/api/v1/discover/block" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..." \
-H "Content-Type: application/json" \
-d '{ "target_user_id": "clx4ghi5jkl6" }'json{
"blocked": true,
"message": "User blocked. They will no longer appear in your discovery feed.",
"request_id": "req_b2c3d4e5f6a1"
}/v1/discover/statsscope: None (API key only)FreeReturns today's aggregated discovery analytics for your app: profiles browsed, likes, passes, superlikes, matches, reports, with computed like rate and match rate percentages. API key only โ no user token needed.
curl -X GET "https://loveconnet.com/api/v1/discover/stats" \
-H "X-API-Key: lc_live_xxx" \
-H "X-User-Token: eyJ..."json{
"period": "today",
"date": "2026-05-05",
"metrics": {
"profiles_browsed": 1250,
"likes": 340,
"passes": 780,
"superlikes": 45,
"matches": 28,
"reports": 3,
"like_rate_percent": 27,
"match_rate_percent": 8
},
"request_id": "req_c3d4e5f6a1b2"
}Discovery Quotas by Tier
| Action | Free | Starter | Pro |
|---|---|---|---|
| Browse (discover) | 150/day | 500/day | 2,000/day |
| Like | 50/day | 200/day | 1,000/day |
| Pass | 100/day | 500/day | 2,000/day |
| Superlike | โ | 5/day | 25/day |
| Report | 10/day | 25/day | 100/day |
| Block | 20/day | 50/day | 200/day |
Discovery Webhooks
Configure webhook URLs in your Developer Portal to receive real-time events:
| Event | Trigger | Payload |
|---|---|---|
| match.created | Both users liked each other | user_a_id, user_b_id, matched_at, type |
| user.safety_flagged | A user was reported | reported_user_id, reporter_id, reason |
API Keys
How API key authentication works
Every API request requires an API key in the X-API-Key header. Keys are generated from the Developer Portal and are tied to a specific app.
lc_live_*Production keys โ real user data, rate limits enforced, usage counts toward your tier quota.lc_test_*Test keys โ sandbox environment, mock data, no rate limits. Perfect for development.Pricing & Tiers
Affordable plans for every developer
Error Handling
Standardized error responses with semantic codes and request IDs
All errors return a standardized JSON body with a semantic code, human-readable message, and a unique request_id for debugging:
json{
"error": {
"code": "FORBIDDEN",
"message": "Scope 'trust_score' is required for this endpoint.",
"status": 403,
"request_id": "req_a1b2c3d4e5f6g7h8",
"docs_url": "https://loveconnet.com/developers/docs#errors"
}
}| Status | Code | When |
|---|---|---|
| 400 | BAD_REQUEST | Missing params, invalid PKCE, or malformed body |
| 401 | UNAUTHORIZED | Missing/invalid API key or expired user token |
| 402 | TIER_UPGRADE_REQUIRED | Endpoint requires a higher tier |
| 403 | FORBIDDEN | Insufficient scope or app suspended |
| 409 | CONFLICT | Idempotency key reused with different params |
| 429 | RATE_LIMIT_EXCEEDED | Respect the Retry-After header |
| 500 | INTERNAL_ERROR | Our fault โ auto-retried by SDKs |
X-Request-ID header. Include it when contacting support for faster debugging.Rate Limits
Fair usage policies per tier
Rate limits are enforced per API key using Redis-backed distributed counters. When you exceed your limit, you'll receive a 429 response with a Retry-After header indicating seconds until reset.
Global Rate Limits
| Tier | Calls/month | Burst/min | Keys | Auths/month |
|---|---|---|---|---|
| Free | 5,000 | 60/min | 2 | 1,000 |
| Starter | 50,000 | 300/min | 5 | 25,000 |
| Pro | 500,000 | 1,000/min | 20 | 250,000 |
| Enterprise | Unlimited | 5,000/min | Unlimited | Unlimited |
Per-Endpoint Rate Limits
| Endpoint Category | Free | Starter | Pro |
|---|---|---|---|
| Identity (profile, email, verified) | 60/min | 300/min | 1,000/min |
| Trust & Safety scores | 30/min | 150/min | 500/min |
| Content moderation (image) | 10/min | 60/min | 300/min |
| Content moderation (text) | 30/min | 150/min | 500/min |
| Discovery (browse/like/pass) | 60/min | 300/min | 1,000/min |
| Groups (discover/search) | 60/min | 300/min | 1,000/min |
| Reels (feed/trending) | 60/min | 300/min | 1,000/min |
| Livestream (browse/join) | 60/min | 300/min | 1,000/min |
| OAuth (token/authorize) | 20/min | 100/min | 500/min |
Rate Limit Headers
Every response includes rate limit information in headers:
httpX-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
X-RateLimit-Reset: 1714934400
Retry-After: 42 โ only on 429 responsesOur SDKs (Python, PHP, JS) include automatic retry with exponential backoff for 429 and 5xx responses. Enterprise customers can request custom rate limits.
Security
Enterprise-grade security by default
API Versioning
Stability guarantees and deprecation policy
The LoveConnet API uses URI-based versioning. The current stable version is v1. All endpoints are prefixed with /api/v1/.
Stability Guarantees
Deprecation Policy
| Phase | Timeline | Action |
|---|---|---|
| Announcement | Day 0 | Deprecation notice published on Changelog + email to all developers |
| Warning Headers | Day 0+ | Sunset and Deprecation headers added to all deprecated endpoints |
| Migration Guide | Within 30 days | Detailed migration guide published with code examples |
| Sunset | 12 months minimum | Deprecated version returns 410 Gone โ migrate by this date |
Deprecation Headers
httpDeprecation: true
Sunset: Sat, 01 May 2027 00:00:00 GMT
Link: <https://loveconnet.com/developers/docs/migration/v2>; rel="successor-version"Pagination
Three pagination patterns used across the API
Different endpoints use different pagination strategies depending on the data characteristics. All paginated responses include a pagination object.
Used for browsable feeds. Tokens are cryptographically signed JWTs containing the page offset and filter state, preventing index manipulation and scraping.
http// Request
GET /v1/discover/profiles?limit=10
// Response โ first page
{
"pagination": {
"page_token": "eyJ0eXAiOiJKV1Qi...",
"has_more": true,
"limit": 10
}
}
// Request โ next page
GET /v1/discover/profiles?limit=10&page_token=eyJ0eXAiOiJKV1Qi...Used for time-ordered lists. The cursor is a timestamp or ID marking your position. Ideal for real-time data where new items may be inserted.
http// Request
GET /v1/discover/matches?limit=20
// Response
{
"pagination": {
"cursor": "2026-05-05T20:00:00.000Z",
"has_more": true,
"limit": 20
}
}
// Request โ next page
GET /v1/discover/matches?limit=20&cursor=2026-05-05T20:00:00.000ZClassic page + limit pagination. Simple and predictable. Used for feeds where total count and page jumping are useful.
http// Request
GET /v1/reels/feed?page=1&limit=10
// Response
{
"pagination": {
"page": 1,
"limit": 10,
"has_more": true
}
}
// Request โ next page
GET /v1/reels/feed?page=2&limit=10Webhooks
Real-time event notifications for your integration
Webhooks let your app receive real-time notifications when events happen on the LoveConnet platform. Configure webhook endpoints in the Developer Portal under your app's settings.
How Webhooks Work
Add a webhook URL + select events in the portal
You get an HMAC-SHA256 secret for signature verification
We POST JSON to your URL when events fire
Verify the signature, respond with 2xx
Event Types (20 events)
| Event | Category | When it fires |
|---|---|---|
| consent.granted | Consent | User grants OAuth consent to your app |
| consent.revoked | Consent | User revokes your app access |
| consent.scopes_updated | Consent | User modifies granted scopes |
| user.verified | User | User completes face or ID verification |
| user.trust_updated | User | User's trust bracket changes |
| user.profile_updated | User | User updates profile fields |
| user.deactivated | User | User deactivates their account |
| user.reactivated | User | User reactivates their account |
| user.photo_moderated | User | Photo approved/rejected by moderation |
| user.safety_flagged | User | User flagged by safety system |
| match.created | Matching | Mutual like detected โ match created |
| match.expired | Matching | Match expired (no conversation started) |
| match.unmatched | Matching | User unmatched from a connection |
| chat.message_sent | Chat | New message in a matched conversation |
| chat.message_flagged | Chat | Message flagged by safety AI |
| app.tier_changed | Billing | Your app tier upgraded/downgraded |
| app.usage_threshold | Billing | Usage hit 80% or 100% of tier limit |
| app.rate_limited | Billing | Rate limit triggered on your API key |
| webhook.disabled | System | Webhook auto-disabled after failures |
| test.ping | System | Manual test ping from the portal |
Webhook Payload Format
json{
"id": "evt_a1b2c3d4e5f6g7h8",
"event": "user.verified",
"api_version": "v1",
"created_at": "2026-05-05T20:30:00Z",
"data": {
"user_id": "clx1abc2def3",
"verification_type": "face",
"verified_at": "2026-05-05T20:30:00Z"
}
}Signature Verification
Every webhook request includes an X-LoveConnet-Signature header containing the HMAC-SHA256 signature of the request body, signed with your webhook secret.
javascriptconst crypto = require('crypto');
function verifyWebhook(body, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// In your endpoint handler:
const isValid = verifyWebhook(
JSON.stringify(req.body),
req.headers['x-loveconnet-signature'],
process.env.WEBHOOK_SECRET
);
if (!isValid) return res.status(401).send('Invalid signature');Retry Policy
Groups API
Integrate LoveConnet community groups into your app
What is the Groups API?
Browse and join LoveConnet interest-based groups. Users can discover groups by location, search by topic, view details, and join/leave groups โ all through your app.
Scope: groups โข Base path: /v1/groups
/v1/groups/categoriesscope: groupsFreeList all available group categories (e.g. Fitness, Travel, Music, Photography). Use to populate category filter UIs.
json{
"data": [
{ "id": "fitness", "name": "Fitness", "slug": "fitness", "group_count": 450 },
{ "id": "travel", "name": "Travel", "slug": "travel", "group_count": 320 },
{ "id": "music", "name": "Music", "slug": "music", "group_count": 280 }
],
"request_id": "req_a1b2c3d4e5f6"
}/v1/groups/discoverscope: groupsFreeDiscover groups by location. Pass lat/lng to find nearby groups. Returns groups sorted by relevance and activity.
json{
"data": [
{
"group_id": "grp_abc123",
"name": "Accra Hikers",
"description": "Weekly hiking adventures around Ghana",
"category": "fitness",
"member_count": 45,
"type": "PUBLIC",
"city": "Accra",
"avatar_url": "https://cdn.loveconnet.com/..."
}
],
"request_id": "req_b2c3d4e5f6a1"
}/v1/groups/searchscope: groupsFreeSearch groups by name or topic. Supports optional category filter. Query must be at least 2 characters.
json{
"data": [...],
"query": "hiking",
"request_id": "req_c3d4e5f6a1b2"
}/v1/groups/:groupIdscope: groupsFreeGet complete details for a specific group including name, description, member count, rules, and creator info.
json{
"data": {
"group_id": "grp_abc123",
"name": "Accra Hikers",
"description": "Weekly hiking adventures",
"category": "fitness",
"member_count": 45,
"max_members": 100,
"type": "PUBLIC",
"is_private": false,
"approval_required": false,
"city": "Accra",
"tags": ["hiking", "outdoors", "fitness"],
"created_at": "2026-01-15T10:00:00Z"
},
"request_id": "req_d4e5f6a1b2c3"
}/v1/groups/:groupId/joinscope: groupsFreeJoin a group on behalf of the authenticated user. Some groups require approval โ in that case, a join request is submitted.
json{
"joined": true,
"request_id": "req_e5f6a1b2c3d4"
}/v1/groups/:groupId/leavescope: groupsFreeLeave a group on behalf of the authenticated user.
json{
"left": true,
"request_id": "req_f6a1b2c3d4e5"
}/v1/groups/:groupId/membersscope: groupsFreeList members of a group with roles (ADMIN, MODERATOR, MEMBER) and join timestamps.
json{
"data": [
{ "user_id": "clx1abc2def3", "name": "Sarah", "role": "ADMIN", "joined_at": "2026-01-15T10:00:00Z" },
{ "user_id": "clx4ghi5jkl6", "name": "Ama", "role": "MEMBER", "joined_at": "2026-02-20T14:30:00Z" }
],
"total": 45,
"request_id": "req_a2b3c4d5e6f7"
}Reels API
Short-form dating video content
What is the Reels API?
Access LoveConnet's TikTok-style dating reels. Browse feeds, get trending content, discover nearby creators, view chemistry scores, and interact with likes and views.
Scope: reels โข Base path: /v1/reels โข Pagination: offset-based
/v1/reels/feedscope: reelsFreePersonalized reel feed for the authenticated user. Supports page, limit, type filter, and sort_by options. Returns video URLs, creator info, and engagement stats.
json{
"data": [
{
"reel_id": "reel_xyz789",
"video_url": "https://cdn.loveconnet.com/reels/...",
"thumbnail_url": "https://cdn.loveconnet.com/thumbs/...",
"caption": "Morning hike vibes โฐ๏ธ",
"creator": {
"user_id": "clx1abc2def3",
"name": "Sarah",
"face_verified": true
},
"stats": { "views": 1250, "likes": 340, "comments": 28 },
"created_at": "2026-05-05T08:00:00Z"
}
],
"pagination": { "page": 1, "limit": 10, "has_more": true },
"request_id": "req_a1b2c3d4e5f6"
}/v1/reels/trendingscope: reelsFreeTrending reels ranked by engagement velocity. Great for discovery features.
json{
"data": [...],
"pagination": { "page": 1, "limit": 10, "has_more": true },
"request_id": "req_b2c3d4e5f6a1"
}/v1/reels/nearbyscope: reelsFreeReels from creators near the user. Accepts radius_km parameter (default 50km).
json{
"data": [...],
"radius_km": 50,
"pagination": { "page": 1, "limit": 10, "has_more": true },
"request_id": "req_c3d4e5f6a1b2"
}/v1/reels/:idscope: reelsFreeGet full details for a single reel including video URL, creator, stats, music track, and category.
json{
"data": {
"reel_id": "reel_xyz789",
"video_url": "https://cdn.loveconnet.com/reels/...",
"caption": "Morning hike โฐ๏ธ",
"creator": { "user_id": "clx1abc2def3", "name": "Sarah" },
"stats": { "views": 1250, "likes": 340, "comments": 28 },
"music": { "title": "Essence", "artist": "Wizkid" },
"created_at": "2026-05-05T08:00:00Z"
},
"request_id": "req_d4e5f6a1b2c3"
}/v1/reels/:id/chemistryscope: reelsStarterGet the chemistry/compatibility score between the authenticated user and the reel creator. Powered by shared interests and behavioral signals.
json{
"data": {
"score": 78,
"factors": ["Shared interest: hiking", "Same city", "Similar age range"]
},
"request_id": "req_e5f6a1b2c3d4"
}/v1/reels/:id/viewscope: reelsFreeRecord that the user viewed a reel. Used for analytics and feed personalization.
json{ "viewed": true, "request_id": "req_f6a1b2c3d4e5" }/v1/reels/:id/likescope: reelsFreeLike a reel. The creator receives a notification.
json{ "liked": true, "request_id": "req_a2b3c4d5e6f7" }/v1/reels/:id/unlikescope: reelsFreeRemove a like from a reel.
json{ "unliked": true, "request_id": "req_b3c4d5e6f7a8" }Livestream API
Live video interactions and real-time engagement
What is the Livestream API?
Integrate LoveConnet live streaming into your app. Browse live streams, join as a viewer, interact via comments and reactions, send virtual gifts, and view stream analytics.
Scope: livestream โข Base path: /v1/streams โข Pagination: offset-based
/v1/streamsscope: livestreamFreeBrowse live streams with optional filters: status (LIVE, SCHEDULED, ENDED), category, page, limit. Default shows currently live streams.
json{
"data": [
{
"stream_id": "str_abc123",
"title": "Friday Night Q&A",
"status": "LIVE",
"category": "JUST_CHATTING",
"host": { "user_id": "clx1abc2def3", "name": "Sarah", "face_verified": true },
"viewer_count": 127,
"thumbnail_url": "https://cdn.loveconnet.com/...",
"started_at": "2026-05-05T20:00:00Z"
}
],
"pagination": { "page": 1, "limit": 20, "has_more": true },
"request_id": "req_a1b2c3d4"
}/v1/streams/categoriesscope: livestreamFreeList all available stream categories with names and emoji icons. Use to populate category filters.
json{
"data": [
{ "id": "JUST_CHATTING", "name": "Just Chatting", "emoji": "๐ฌ" },
{ "id": "SPEED_DATING", "name": "Speed Dating", "emoji": "โก" },
{ "id": "Q_AND_A", "name": "Q&A", "emoji": "โ" },
{ "id": "MUSIC", "name": "Music & Karaoke", "emoji": "๐ต" }
],
"request_id": "req_b2c3d4e5"
}/v1/streams/:streamIdscope: livestreamFreeGet complete details for a specific stream including host info, viewer count, status, category, and replay availability.
json{
"data": {
"stream_id": "str_abc123",
"title": "Friday Night Q&A",
"description": "Ask me anything about dating in Accra!",
"status": "LIVE",
"category": "Q_AND_A",
"host": { "user_id": "clx1abc2def3", "name": "Sarah", "face_verified": true },
"viewer_count": 127,
"has_replay": true,
"started_at": "2026-05-05T20:00:00Z"
},
"request_id": "req_c3d4e5f6"
}/v1/streams/:streamId/joinscope: livestreamFreeJoin a live stream as a viewer. Returns connection info needed to render the stream.
json{
"joined": true,
"viewer_count": 128,
"request_id": "req_d4e5f6a1"
}/v1/streams/:streamId/leavescope: livestreamFreeLeave a live stream gracefully. Decrements viewer count.
json{ "left": true, "request_id": "req_e5f6a1b2" }/v1/streams/:streamId/commentsscope: livestreamFreeGet live comments for a stream. Accepts limit parameter (default 50). Returns threaded comments with user info.
json{
"data": [
{
"comment_id": "cmt_abc123",
"user_id": "clx4ghi5jkl6",
"user_name": "Ama",
"content": "Great advice! ๐",
"created_at": "2026-05-05T20:15:00Z"
}
],
"request_id": "req_f6a1b2c3"
}/v1/streams/:streamId/commentscope: livestreamFreePost a live comment. Supports threaded replies via optional parent_id.
json{
"data": { "comment_id": "cmt_xyz789", "content": "Love this stream!" },
"request_id": "req_a2b3c4d5"
}/v1/streams/:streamId/reactscope: livestreamFreeSend a real-time reaction to the stream (โค๏ธ, ๐ฅ, ๐, ๐, ๐, ๐, ๐ฏ, ๐ฅณ). Reactions are broadcast to all viewers.
json{ "reacted": true, "type": "๐ฅ", "request_id": "req_b3c4d5e6" }/v1/streams/gifts/catalogscope: livestreamFreeBrowse the virtual gift catalog with prices, animations, and categories.
json{
"data": [
{ "id": "rose", "name": "Rose", "emoji": "๐น", "price_coins": 10, "category": "classic" },
{ "id": "crown", "name": "Crown", "emoji": "๐", "price_coins": 500, "category": "premium" }
],
"request_id": "req_c4d5e6f7"
}/v1/streams/:streamId/giftscope: livestreamStarterSend a virtual gift to the streamer. Requires sufficient coin balance. Supports quantity and optional message.
json{
"sent": true,
"gift": "rose",
"quantity": 1,
"coins_spent": 10,
"request_id": "req_d5e6f7a8"
}Status API
System health, readiness, and uptime monitoring
What is the Status API?
Monitor the LoveConnet API health in real-time. Use these endpoints for load balancer readiness probes, uptime dashboards, and alerting integrations. No API key required.
Base path: /health โข No authentication required
/healthPublicDeep health check returning system status, component health (database, Redis, memory), response time, uptime, and API version. Use for status page dashboards.
json{
"status": "healthy",
"timestamp": "2026-05-05T21:00:00.000Z",
"uptime": 864000,
"version": "1.0.0",
"checks": {
"database": { "status": "pass", "latency_ms": 3 },
"redis": { "status": "pass", "latency_ms": 1 },
"memory": { "status": "pass", "latency_ms": 0, "message": "245MB / 512MB (48%)" }
},
"response_time_ms": 5
}/health/readyPublicReadiness probe for load balancers. Returns 200 when the service can accept traffic (database & Redis reachable). Use as K8s/ECS readiness check.
json{ "status": "ready", "ready": true }/health/livePublicLiveness probe. Returns 200 if the process is running. No dependency checks โ used by container orchestrators to detect hangs.
json{ "status": "alive", "alive": true, "uptime": 864000, "pid": 12345 }/health/statsPublicDetailed runtime stats: uptime, memory usage (RSS, heap), Node.js version, and environment. Great for ops dashboards.
json{
"uptime_seconds": 864000,
"uptime_formatted": "10d 0h 0m 0s",
"memory": {
"rss_mb": 312,
"heap_used_mb": 245,
"heap_total_mb": 512
},
"node_version": "v20.11.0",
"environment": "production"
}Status Values
Developer Portal API
Manage your apps, API keys, webhooks, and domain verification
What is the Developer Portal API?
Programmatically manage your entire developer lifecycle: register apps, rotate secrets, generate API keys, configure webhooks, and verify custom domains. All endpoints require JWT authentication as the app owner.
Base path: /developer โข Auth: JWT (app owner) โข Rate limited: 20/min
App Management
/developer/appsAllList all your registered apps with pagination. Returns client IDs, names, status, redirect URIs, and creation dates.
json{
"apps": [
{
"clientId": "lc_app_abc123",
"name": "My Dating Widget",
"status": "ACTIVE",
"tier": "PRO",
"redirectUris": ["https://myapp.com/callback"],
"createdAt": "2026-01-15T10:00:00Z"
}
],
"total": 1,
"page": 1
}/developer/appsAllRegister a new OAuth application. Requires name, redirect URIs. Returns client ID and secret (shown only once).
json{
"clientId": "lc_app_abc123",
"clientSecret": "lc_secret_xyz...(shown once)",
"name": "My Dating Widget",
"redirectUris": ["https://myapp.com/callback"],
"allowedScopes": ["profile", "trust"],
"status": "ACTIVE"
}/developer/apps/:clientIdAllUpdate an app's name, logo, website, privacy policy, terms of service, redirect URIs, or allowed scopes.
json{ "updated": true, "clientId": "lc_app_abc123" }/developer/apps/:clientIdAllDelete an app permanently. All API keys and webhooks are revoked. This cannot be undone.
json{ "deleted": true }/developer/apps/:clientId/rotate-secretAllRotate the client secret. The old secret is immediately invalidated. The new secret is shown only once.
json{
"clientId": "lc_app_abc123",
"newSecret": "lc_secret_new...(shown once)",
"rotatedAt": "2026-05-05T21:00:00Z"
}API Key Management
/developer/apps/:clientId/keysAllGenerate a new API key for an app. Supports test and live modes. The full key is shown only once.
json{
"keyId": "key_abc123",
"apiKey": "lc_live_sk_...(shown once)",
"name": "Production Key",
"isLive": true,
"createdAt": "2026-05-05T21:00:00Z"
}/developer/apps/:clientId/keysAllList all API keys for an app. Keys are masked (only last 4 chars shown).
json{
"keys": [
{ "keyId": "key_abc123", "name": "Production", "maskedKey": "...x7f2", "isLive": true, "createdAt": "2026-05-05" },
{ "keyId": "key_def456", "name": "Test", "maskedKey": "...a3b1", "isLive": false, "createdAt": "2026-04-20" }
]
}/developer/apps/:clientId/keys/:keyIdAllRevoke an API key immediately. All requests using this key will return 401.
json{ "revoked": true, "keyId": "key_abc123" }Webhook Management
/developer/apps/:clientId/webhookAllConfigure a webhook endpoint for an app. Specify the URL and which events to subscribe to.
json{
"webhookId": "wh_abc123",
"url": "https://myapp.com/webhooks/loveconnet",
"events": ["user.verified", "consent.revoked", "match.created"],
"secret": "whsec_...(shown once)",
"status": "ACTIVE"
}/developer/webhooksAllList all configured webhooks for your apps with status and event subscriptions.
json{
"webhooks": [
{ "webhookId": "wh_abc123", "url": "https://myapp.com/...", "events": ["user.verified"], "status": "ACTIVE", "lastDeliveredAt": "2026-05-05T20:30:00Z" }
]
}/developer/webhooks/testAllSend a test.ping event to a webhook endpoint to verify it's receiving events correctly.
json{
"delivered": true,
"statusCode": 200,
"responseTimeMs": 142
}/developer/webhooks/logsAllView the last 20 webhook delivery attempts with status codes, response times, and retry counts.
json{
"logs": [
{
"eventId": "evt_abc123",
"event": "user.verified",
"statusCode": 200,
"responseTimeMs": 85,
"attempt": 1,
"deliveredAt": "2026-05-05T20:30:00Z"
}
]
}Domain Verification
Verify ownership of your domain to enable Verified Badge embeds and higher trust levels. Two methods supported: DNS TXT record or file-based verification.
/developer/apps/:clientId/domain/challengeGenerate a domain verification challenge. Returns a unique token and instructions for both DNS and file verification methods.
json{
"challenge": "loveconnet-verify=lc_v_abc123xyz789",
"methods": {
"dns": {
"type": "TXT",
"host": "_loveconnet-verify.myapp.com",
"value": "lc_v_abc123xyz789"
},
"file": {
"path": "/.well-known/loveconnet-verify.txt",
"content": "lc_v_abc123xyz789"
}
},
"expiresAt": "2026-05-12T21:00:00Z"
}/developer/apps/:clientId/domain/verifyAttempt to verify your domain using the specified method (dns or file). On success, your app gets a verified domain badge.
json{
"verified": true,
"domain": "myapp.com",
"verifiedAt": "2026-05-05T21:00:00Z",
"method": "dns"
}Analytics & Usage
/developer/apps/:clientId/analyticsGet aggregated analytics for your app: total API calls, unique users, consent grants, and error rates.
json{
"totalCalls": 42500,
"uniqueUsers": 1240,
"consentGrants": 890,
"errorRate": 0.02,
"topEndpoints": [
{ "endpoint": "discover.profiles", "calls": 15000 },
{ "endpoint": "reels.feed", "calls": 8500 }
]
}/developer/apps/:clientId/usageGet detailed usage breakdown by day for the last N days (default 30). Shows per-endpoint call counts.
json{
"usage": {
"2026-05-05": { "discover.profiles": 500, "reels.feed": 300 },
"2026-05-04": { "discover.profiles": 480, "reels.feed": 290 }
},
"total": 42500,
"limit": 500000,
"percentUsed": 8.5
}/developer/apps/:clientId/audit-logsView audit trail of all management actions: key rotations, webhook changes, scope updates, tier changes, etc.
json{
"logs": [
{
"action": "API_KEY_GENERATED",
"userId": "clx1abc2def3",
"timestamp": "2026-05-05T21:00:00Z",
"metadata": { "keyName": "Production" }
}
],
"total": 45
}Billing & Metered Pricing
Stripe/Paystack integration, per-call metered rates, and subscription management
How Billing Works
LoveConnet uses a base tier + metered overage model (like Stripe). You choose a tier for included API calls. Each call beyond the included quota is billed per-call at metered rates. Two payment gateways supported: Stripe (USD, international) and Paystack (GHS, Ghana).
Tier Pricing (Base Subscription)
| Tier | Price (USD) | Price (GHS) | Calls/month | API Keys | AI Calls |
|---|---|---|---|---|---|
| Free | $0 | GHโต 0 | 1,000 | 2 | 0 |
| Growth | $49/mo | GHโต 735/mo | 10,000 | 5 | 500 |
| Business | $199/mo | GHโต 2,985/mo | 100,000 | 20 | 5,000 |
| Scale | $499/mo | GHโต 7,485/mo | 1,000,000 | 50 | 25,000 |
| Enterprise | $1,999/mo | GHโต 29,985/mo | 10,000,000 | 200 | 100,000 |
Metered Per-Call Rates (Overage)
When you exceed your tier's included calls, each additional call is billed at metered rates. Pro and Enterprise tiers use metered billing automatically.
| Category | Endpoints | Rate (per call) |
|---|---|---|
| Basic | profile, email, verified, trust, age, userinfo | Free |
| AI Compatibility | ai/compatibility, ai/icebreakers | $0.02 |
| AI Moderation | ai/moderate-image, ai/moderate-text | $0.05 / $0.005 |
| AI Fraud & Safety | ai/fraud-score, ai/safety-score | $0.05 / $0.03 |
| AI Profile | ai/profile-analysis, ai/face-detect | $0.03 |
| AI Coaching | ai/dating-advice, ai/smart-replies | $0.01 |
| AI Insights | ai/conversation-insights, ai/weekly-insights | $0.02 |
| Discovery | discover.profiles, discover.like, discover.pass | $0.01 |
| Groups/Reels/Streams | groups.*, reels.*, streams.* | Free |
Billing Endpoints
/developer/billing/subscriptionGet current subscription tier, status, gateway (Stripe/Paystack), usage, and renewal date.
json{
"tier": "PRO",
"status": "ACTIVE",
"gateway": "stripe",
"currentUsage": 42500,
"limit": 500000,
"percentUsed": 8.5,
"renewsAt": "2026-06-05T00:00:00Z",
"meteredCostThisMonth": { "totalCents": 450, "breakdown": { "basic": 320, "ai": 100, "matching": 30 } }
}/developer/billing/tiersList all available tiers with pricing, limits, and features. Use to display upgrade cards in your portal.
json{
"tiers": [
{ "id": "FREE", "name": "Free", "priceCents": 0, "callsPerMonth": 5000, "maxKeys": 2 },
{ "id": "STARTER", "name": "Starter", "priceCents": 900, "callsPerMonth": 50000, "maxKeys": 5 },
{ "id": "PRO", "name": "Pro", "priceCents": 2900, "callsPerMonth": 500000, "maxKeys": 20, "meteredBilling": true },
{ "id": "ENTERPRISE", "name": "Enterprise", "priceCents": 3900, "callsPerMonth": 5000000, "maxKeys": 100, "meteredBilling": true }
]
}/developer/billing/checkoutStart a checkout session. Specify the tier, payment gateway (stripe or paystack), email, and success/cancel URLs. Returns a redirect URL.
json{
"url": "https://checkout.stripe.com/pay/cs_live_...",
"gateway": "stripe",
"tier": "PRO",
"expiresAt": "2026-05-05T22:00:00Z"
}/developer/billing/cancelCancel your subscription. Access continues until the end of the current billing period, then downgrades to Free.
json{
"cancelled": true,
"effectiveAt": "2026-06-05T00:00:00Z",
"message": "Your PRO plan will remain active until June 5, 2026"
}/developer/billing/metered-ratesGet the per-call metered rate table used for overage billing on Pro and Enterprise tiers.
json{
"rates": {
"basic": { "description": "profile, email, trust", "centsPer100Calls": 10 },
"content": { "description": "image moderation", "centsPer100Calls": 50 },
"ai": { "description": "AI discovery, recommendations", "centsPer100Calls": 100 },
"matching": { "description": "like, pass, compatibility", "centsPer100Calls": 100 },
"verification": { "description": "safety, trust checks", "centsPer100Calls": 20 }
}
}Payment Gateway Webhooks
We handle Stripe and Paystack webhook callbacks to activate/deactivate subscriptions automatically. You don't need to integrate with these โ they work behind the scenes.
POST /webhooks/developer/stripeHandles checkout.session.completed, customer.subscription.deletedPOST /webhooks/developer/paystackHandles charge.success, subscription.disableStripe-Style Features
AI API
Premium AI-powered dating intelligence endpoints
AI-Powered Dating Intelligence
12 premium AI endpoints powered by GPT-4o, AWS Rekognition, and custom ML models. All AI endpoints support sandbox mode (test keys return mock data), idempotency, and metered billing.
Base path: /v1/ai โข Auth: X-API-Key + X-User-Token โข Scope: ai
/v1/ai/compatibility$0.02/callAI-powered compatibility scoring between two users. Returns overall score, chemistry breakdown, explanation, and highlights.
json{
"data": {
"overall_score": 87,
"chemistry": 92,
"explanation": "High compatibility based on shared interests",
"highlights": ["Both enjoy hiking", "Similar communication styles"]
},
"request_id": "req_m1abc_x7f2k9"
}/v1/ai/icebreakers$0.01/callGenerate personalized conversation starters based on two user profiles. Optionally include reel context for targeted openers.
json{
"data": {
"icebreakers": [
"I noticed you are into hiking too - what is the most memorable trail?",
"Your travel photos are amazing! Next dream destination?",
"I see we both love sushi - favorite spot?"
]
}
}/v1/ai/smart-replies$0.01/callGenerate contextual reply suggestions based on conversation history. Perfect for in-chat suggestion chips.
json{
"data": {
"replies": [
"That sounds amazing!",
"I would love to hear more about that",
"When are you free to meet up?"
]
}
}/v1/ai/profile-analysis$0.03/callAnalyze a user profile and return a quality score with actionable improvement suggestions and strengths.
json{
"data": {
"score": 72,
"suggestions": ["Add more photos showing hobbies", "Bio could mention interests"],
"strengths": ["Great smile", "Bio is authentic", "Verified profile"]
}
}/v1/ai/moderate-image$0.05/callAnalyze an image for inappropriate content using GPT-4o vision. Returns safety classification across nudity, violence, hate, and spam.
json{
"data": {
"safe": true,
"confidence": 0.98,
"categories": { "nudity": 0.01, "violence": 0.0, "hate": 0.0, "spam": 0.02 }
}
}/v1/ai/moderate-text$0.005/callAnalyze text for toxicity, grooming patterns, and safety risks. Combines GPT-4o AI analysis with pattern-based scoring.
json{
"data": {
"safe": true,
"reason": null,
"ai_confidence": 0.95,
"patterns": { "score": 0, "indicators": [] }
}
}/v1/ai/fraud-score$0.05/callML-powered fraud risk assessment. Returns risk score (0-100), risk level, contributing factors, and recommended action.
json{
"data": {
"risk_score": 12,
"risk_level": "LOW",
"risk_factors": [],
"recommended_action": "ALLOW",
"confidence": 0.94,
"model_version": "v2.1"
}
}/v1/ai/safety-score$0.03/callComprehensive user safety score with trust badge and contributing factors. Use for trust badges in your app.
json{
"data": {
"score": 92,
"badge": "TRUSTED",
"factors": [
{ "name": "Account age", "impact": 10, "detail": "6 months" },
{ "name": "Verified photo", "impact": 15, "detail": "Face verified" }
]
}
}/v1/ai/face-detect$0.03/callDetect and validate faces in photos using AWS Rekognition. Returns face count, quality assessment, and anti-spoofing signals.
json{
"data": {
"valid": true,
"faceCount": 1,
"details": { "blur": "sharp", "occluded": false, "headPose": { "yaw": 2, "pitch": -1 } }
}
}/v1/ai/dating-advice$0.01/callAI relationship coach generates personalized dating tips based on user behavior and interaction patterns.
json{
"data": {
"advice": [
{ "category": "profile", "title": "Photo Tip", "advice": "Add a photo showing hobbies", "relevance": 0.92 },
{ "category": "conversation", "title": "Ask Open Questions", "advice": "Try asking about experiences", "relevance": 0.87 }
]
}
}/v1/ai/conversation-insights$0.02/callAnalyze all active conversations for health, engagement, tips, and suggested actions.
json{
"data": {
"insights": [{
"matchName": "Alex",
"health": "thriving",
"tips": ["Great energy! Keep asking thoughtful questions"],
"suggestedActions": ["Plan a date!"]
}]
}
}/v1/ai/weekly-insights$0.02/callWeekly summary: matching activity, message trends, peak hours, and personalized improvement tips.
json{
"data": {
"week": "2026-W18",
"matchingActivity": { "newMatches": 5, "messagesExchanged": 42 },
"suggestions": ["Message earlier - matches respond fastest at 9am"],
"personalizedTip": "Conversation quality improved 15% this week!"
}
}Sandbox Mode
Use a test API key (generated with isLive: false) to get realistic mock data from all endpoints. No real data is accessed, no AI costs are incurred, and usage is not billed. The response header X-Sandbox: true confirms sandbox mode.
Idempotency
All POST endpoints support the Idempotency-Key header. This ensures retries don't cause duplicate operations. Keys are cached for 24 hours.
bashcurl -X POST https://api.loveconnet.com/v1/ai/compatibility \
-H "X-API-Key: lc_live_sk_xxx" \
-H "Idempotency-Key: my-unique-request-id-123" \
-H "Content-Type: application/json" \
-d '{"user_id_1": "abc", "user_id_2": "def"}'Idempotency-Replayed: true header set on cached responsesOpenAPI Specification
A full OpenAPI 3.0 JSON spec is available for auto-SDK generation, Postman import, and API documentation tools.
bashGET https://api.loveconnet.com/developer/openapi.jsonCalls API
Audio and video calling with LiveKit WebRTC
Real-Time Audio & Video Calls
10 endpoints for 1:1 and group calling powered by LiveKit WebRTC. Start, answer, end, and schedule calls with full credential management for client-side integration.
Base path: /v1/calls โข Auth: X-API-Key โข Scope: calls
/v1/calls/start$0.01Start an audio or video call between matched users. Returns LiveKit token and room name.
json{
"data": {
"id": "call_abc123",
"matchId": "match_xyz",
"callType": "VIDEO",
"status": "RINGING",
"token": "lk_token_xxx",
"roomName": "room-abc123"
}
}/v1/calls/:id/answerFreeAnswer an incoming call. Returns LiveKit credentials for the receiver to join.
json{
"data": {
"id": "call_abc123",
"status": "CONNECTED",
"token": "lk_token_yyy",
"roomName": "room-abc123"
}
}/v1/calls/:id/endFreeEnd an active call. Records duration and notifies both parties.
json{
"data": {
"id": "call_abc123",
"status": "COMPLETED",
"duration": 185
}
}/v1/calls/:id/declineFreeDecline an incoming call. Notifies the caller.
json{
"data": {
"id": "call_abc123",
"status": "DECLINED"
}
}/v1/calls/:id/credentialsFreeGet LiveKit WebRTC credentials for an ongoing call. Use when reconnecting.
json{
"data": {
"token": "lk_token_xxx",
"roomName": "room-abc123",
"serverUrl": "wss://livekit.your-server.com"
}
}/v1/calls/historyFreeGet global call history. Filter by status; supports pagination via limit and offset.
json{
"data": {
"calls": [
{ "id": "call_1", "callType": "VIDEO", "status": "COMPLETED", "duration": 342 },
{ "id": "call_2", "callType": "AUDIO", "status": "MISSED", "duration": 0 }
],
"total": 24
}
}/v1/calls/:id/participants$0.01Add a participant to an existing call to upgrade to a group call.
json{
"data": {
"callId": "call_abc123",
"targetUserId": "user_456",
"status": "INVITED"
}
}/v1/calls/scheduleFreeSchedule a future call. Supports repeating schedules and pre-call reminders.
json{
"data": {
"id": "sched_001",
"matchId": "match_xyz",
"callType": "VIDEO",
"scheduledAt": "2026-05-10T18:00:00Z",
"status": "PENDING"
}
}/v1/calls/scheduledFreeList all scheduled calls for a user.
json{
"data": {
"scheduledCalls": [
{ "id": "sched_001", "scheduledAt": "2026-05-10T18:00:00Z", "callType": "VIDEO" }
]
}
}/v1/calls/scheduled/:idFreeCancel a scheduled call.
json{
"data": { "cancelled": true }
}Video Dates
Scheduled video dates with chemistry ratings
Structured Video Dating
5 endpoints for managing video dates with scheduling, chemistry prompts, and post-date ratings. Build engaging video dating experiences with structured conversation prompts.
Base path: /v1/video-dates โข Auth: X-API-Key โข Scope: calls
/v1/video-dates$0.01Create a video date invitation. Supports scheduled dates and speed-date mode.
json{
"data": {
"id": "vdate_001",
"initiatorId": "user_1",
"participantId": "user_2",
"status": "PENDING",
"isSpeedDate": false
}
}/v1/video-dates/:id/respondFreeAccept or decline a video date invitation.
json{
"data": {
"id": "vdate_001",
"status": "ACCEPTED"
}
}/v1/video-dates/:id/rateFreeSubmit a chemistry rating and feedback after a video date.
json{
"data": {
"rated": true,
"chemistryRating": 4.5,
"wouldMeetAgain": true
}
}/v1/video-dates/historyFreeGet the user's video date history with ratings and status.
json{
"data": {
"dates": [
{ "id": "vdate_001", "status": "COMPLETED", "chemistryRating": 4.5, "wouldMeetAgain": true }
]
}
}/v1/video-dates/promptsFreeGet chemistry conversation prompts for video dates. Use as ice-breaker cards during the call.
json{
"data": {
"prompts": [
{ "category": "icebreaker", "prompt": "What made you swipe right on me?" },
{ "category": "deep", "prompt": "What does your ideal weekend look like?" },
{ "category": "fun", "prompt": "If you could teleport anywhere, where?" }
]
}
}SDKs & Libraries
Install our official TypeScript SDK for the fastest integration. Handles authentication, rate limits, retries, and TypeScript types out of the box.
bashnpm install @loveconnet/sdkjavascriptimport LoveConnet from '@loveconnet/sdk';
const lc = new LoveConnet({
apiKey: 'lc_live_xxx', // or lc_test_xxx for sandbox
});
// Scope to a specific user
const user = lc.forUser('user_jwt_token');
// AI Compatibility
const { data } = await user.ai.compatibility('user_123', 'user_456');
console.log(data.data.overall_score); // 87
// Image Moderation
const mod = await lc.ai.moderateImage('https://example.com/photo.jpg');
console.log(mod.data.data.safe); // true| Module | Methods | Description |
|---|---|---|
lc.ai | 12 | Compatibility, moderation, fraud detection, dating advice |
lc.discovery | 6 | Browse profiles, like, pass, super-like, matches |
lc.calls | 9 | Start/answer/end calls, WebRTC credentials, scheduling |
lc.videoDates | 5 | Create dates, respond, rate chemistry, prompts |
lc.health | 3 | System health, readiness, liveness probes |
javascriptimport { LoveConnetApiError } from '@loveconnet/sdk';
try {
await user.ai.compatibility('a', 'b');
} catch (err) {
if (err instanceof LoveConnetApiError) {
console.log(err.code); // 'RATE_LIMIT_EXCEEDED'
console.log(err.status); // 429
console.log(err.message); // 'Monthly API call limit exceeded'
}
}javascriptconst lc = new LoveConnet({
apiKey: 'lc_live_xxx',
maxRetries: 3,
onRateLimit: (retryAfter) => {
console.log("Rate limited, retrying in " + retryAfter + "s");
},
});Error Code Registry
Complete machine-readable error catalog. Fetch programmatically via GET /developer/errors.
| Code | Status | Description |
|---|---|---|
MISSING_API_KEY | 401 | No API key provided in X-API-Key header |
INVALID_API_KEY | 401 | Key format is invalid (expected lc_live_* or lc_test_*) |
API_KEY_EXPIRED | 401 | Key has passed its 90-day expiry |
API_KEY_REVOKED | 401 | Key was manually revoked |
MISSING_USER_TOKEN | 401 | X-User-Token required for user-scoped endpoints |
| Code | Status | Description |
|---|---|---|
INSUFFICIENT_SCOPE | 403 | Key lacks the required scope for this endpoint |
TIER_UPGRADE_REQUIRED | 403 | Feature not available on your current tier |
APP_SUSPENDED | 403 | Application suspended due to policy violations |
| Code | Status | Description |
|---|---|---|
RATE_LIMIT_EXCEEDED | 429 | Monthly API call limit exceeded |
BURST_LIMIT_EXCEEDED | 429 | Too many requests per second |
| Code | Status | Description |
|---|---|---|
INVALID_REQUEST | 400 | Request body validation failed |
INVALID_USER_ID | 400 | User ID is invalid or not found |
INVALID_MATCH_ID | 400 | Match ID is invalid or not found |
INVALID_IMAGE_URL | 400 | Image URL is invalid or inaccessible |
| Code | Status | Description |
|---|---|---|
SUBSCRIPTION_REQUIRED | 402 | Active subscription required |
PAYMENT_FAILED | 402 | Payment method failed |
METERED_QUOTA_EXCEEDED | 402 | Metered usage quota exceeded |
| Code | Status | Description |
|---|---|---|
INTERNAL_ERROR | 500 | Internal server error |
SERVICE_UNAVAILABLE | 503 | Service temporarily unavailable |
AI_SERVICE_ERROR | 502 | AI provider did not respond in time |
Programmatic access: Fetch the full catalog (with resolutions) via GET /api/developer/errors or the flat lookup via GET /api/developer/errors/codes.