onairos
Version:
The Onairos Library is a collection of functions that enable Applications to connect and communicate data with Onairos Identities via User Authorization. Integration for developers is seamless, simple and effective for all applications. LLM SDK capabiliti
408 lines (349 loc) • 9.24 kB
Markdown
# SDK Quick Reference Guide
## 🚀 Essential Endpoints & Flows
### Base URL: `https://api2.onairos.uk`
## 🔐 Authentication Headers
```javascript
// Pattern 1: API Key + User JWT (Primary)
const headers = {
'x-api-key': 'ona_your_32_character_api_key',
'Authorization': `Bearer ${userJwtToken}`,
'Content-Type': 'application/json'
};
// Pattern 2: User JWT Only (Enoch users)
const headers = {
'Authorization': `Bearer ${userJwtToken}`,
'Content-Type': 'application/json'
};
// Testing: Admin key bypasses validation
const adminKey = 'OnairosIsAUnicorn2025';
```
## 📧 Email Verification Flow
### Request Code
```http
POST /email/verification
{
"email": "user@example.com",
"action": "request"
}
```
### Verify Code & Get JWT
```http
POST /email/verification
{
"email": "user@example.com",
"action": "verify",
"code": "123456"
}
```
**Response (New User)**:
```json
{
"success": true,
"isNewUser": true,
"token": "eyJhbGciOiJIUzI1NiIs...",
"userName": "user123",
"enochInstructions": {
"recommendedFlow": "onboarding"
}
}
```
**Response (Existing User)**:
```json
{
"success": true,
"isNewUser": false,
"token": "eyJhbGciOiJIUzI1NiIs...",
"existingUserData": {
"hasExistingData": true,
"summary": {
"connectionsCount": 3,
"traitsCount": 5
}
},
"enochInstructions": {
"recommendedFlow": "dashboard"
}
}
```
## 🔒 PIN Management
### Store PIN
```http
POST /store-pin/mobile
Authorization: Bearer {userJwtToken}
{
"username": "user123",
"pin": "MySecure1!"
}
```
**PIN Requirements**: 8+ chars, 1 uppercase, 1 symbol
### Check PIN Status
```http
GET /store-pin/status/{username}
→ {"success": true, "hasPinStored": true}
```
## 🔗 OAuth Connectors
### YouTube Native Auth
```http
POST /youtube/native-auth
x-api-key: {apiKey}
Authorization: Bearer {userJwt}
{
"userAccountInfo": {
"username": "user123",
"email": "user@example.com",
"channelName": "My Channel",
"channelId": "UCxxxxx"
},
"accessToken": "ya29.a0AfH6SMC...",
"refreshToken": "4/0AX4XfWi...",
"idToken": "eyJhbGciOiJSUzI1NiIs..."
}
```
**Critical OAuth Config**:
```javascript
{
offlineAccess: true,
forceCodeForRefreshToken: true,
prompt: 'consent',
scopes: ['https://www.googleapis.com/auth/youtube.readonly', 'openid', 'profile', 'email']
}
```
### Other Platforms
- **LinkedIn**: `POST /linkedin/authorize`
- **Reddit**: `POST /reddit/authorize`
- **Pinterest**: `POST /pinterest/authorize`
- **Instagram**: `POST /instagram/authorize`
## 📊 Data Requests
### Get Data API URL
```http
POST /getAPIurlMobile
{
"Info": {
"storage": "local",
"appId": "your_app_id",
"confirmations": [{"data": "Large", "date": "2024-01-15T10:30:00Z"}],
"EncryptedUserPin": "encrypted_pin_data",
"account": "user123",
"proofMode": false
}
}
```
**Response**:
```json
{
"apiUrl": "https://api2.onairos.uk/mobileInferenceNoProof",
"token": "eyJhbGciOiJIUzI1NiIs..."
}
```
### Get Traits
```http
POST /traits
Authorization: Bearer {inferenceToken}
→ {"traits": {"openness": 0.75, "conscientiousness": 0.68}}
```
### Mobile Inference
```http
POST /mobileInferenceNoProof
Authorization: Bearer {inferenceToken}
{"Input": "text_to_analyze"}
```
## 👤 User Data
### Connected Accounts
```http
GET /connected-accounts?username={username}
→ {
"connectedAccounts": [
{
"platform": "YouTube",
"accountName": "My Channel",
"status": "active",
"hasData": true
}
]
}
```
### Connection Health
```http
GET /youtube/connection-status/{username}
→ {
"success": true,
"connectionStatus": "healthy",
"needsReauth": false,
"tokenDetails": {
"hasRefreshToken": true,
"isExpired": false
}
}
```
## 🏋️ Training & Models
### Training Progress (WebSocket)
```javascript
socket.emit('startTraining', {
username: 'user123',
encryptionMode: true,
platforms: ['youtube', 'linkedin']
});
// Receive updates
socket.on('trainingUpdate', (data) => {
console.log(`Progress: ${data.progress}% - ${data.stage}`);
});
```
### Download Model
```http
POST /mobile-training/download-model
Authorization: Bearer {userJwt}
→ {
"model": "base64_encoded_model_data",
"encryption": {"iv": "base64_iv", "key": "base64_key"}
}
```
## 🚨 Error Codes
| Code | Description | Action |
|------|-------------|---------|
| `MISSING_API_KEY` | No API key provided | Add x-api-key header |
| `INVALID_CODE` | Wrong verification code | Ask user to re-enter |
| `USER_NOT_FOUND` | User doesn't exist | Create new account |
| `PIN_REQUIRED` | PIN not set | Redirect to PIN setup |
| `RATE_LIMITED` | Too many requests | Wait and retry |
## 💻 Actual Implementation Patterns
### Direct API Calls (Your Actual Pattern)
```javascript
// 1. Email Verification (Direct)
const verifyEmail = async (email, code, apiKey) => {
const response = await fetch('https://api2.onairos.uk/email/verification', {
method: 'POST',
headers: {
'x-api-key': apiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify({
email: email,
action: 'verify',
code: code
})
});
return await response.json();
};
// 2. YouTube Mobile Signin (Your Actual Pattern)
const connectYouTubeMobile = async (tokens, username, apiKey) => {
const response = await fetch('https://api2.onairos.uk/youtube/mobileSignin', {
method: 'POST',
headers: {
'x-api-key': apiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify({
idToken: tokens.idToken,
accessToken: tokens.accessToken,
serverAuthCode: tokens.serverAuthCode,
username: username
})
});
return await response.json();
};
// 3. Mobile Training (WebSocket + HTTP)
const startMobileTraining = async (userJwt, socketId, platforms) => {
const response = await fetch('https://api2.onairos.uk/mobile-training/clean', {
method: 'POST',
headers: {
'Authorization': `Bearer ${userJwt}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
socketId: socketId,
connectedPlatforms: platforms
})
});
return await response.json();
};
// 4. Data Request (Your Info Pattern)
const requestDataAccess = async (userInfo) => {
const response = await fetch('https://api2.onairos.uk/getAPIurlMobile', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
Info: {
storage: "local",
appId: userInfo.appId,
confirmations: userInfo.confirmations,
EncryptedUserPin: userInfo.encryptedPin,
account: userInfo.username,
proofMode: false
}
})
});
return await response.json();
};
// 5. Mobile Model Download (Your Actual Pattern)
const downloadModel = async (username) => {
const response = await fetch('https://api2.onairos.uk/sendMobileModel', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
Info: {
username: username
}
})
});
return await response.json();
};
```
## ✅ Implementation Checklist
- [ ] **Auth**: Email verification + JWT storage
- [ ] **PIN**: Secure PIN storage with validation
- [ ] **OAuth**: Proper refresh token handling
- [ ] **Data**: Training + inference flows
- [ ] **Errors**: Handle all error codes gracefully
- [ ] **Testing**: Use admin key for development
### WebSocket Training Pattern
```javascript
// Complete training flow example
const runMobileTraining = async (jwtToken, username, platforms) => {
// 1. Connect to WebSocket
const socket = io('https://api2.onairos.uk');
// 2. Set up listeners
socket.on('trainingUpdate', (data) => {
console.log(`Progress: ${data.progress}% - ${data.stage}`);
updateTrainingUI(data);
});
socket.on('trainingCompleted', (data) => {
console.log('Training completed!', data);
showTrainingComplete(data);
});
// 3. Start training via HTTP
const response = await fetch('https://api2.onairos.uk/mobile-training/clean', {
method: 'POST',
headers: {
'Authorization': `Bearer ${jwtToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
socketId: socket.id,
connectedPlatforms: platforms
})
});
return await response.json();
};
```
**Key Implementation Points:**
1. **Use direct fetch calls** - no SDK wrapper needed
2. **Follow Info pattern** for data requests: `{Info: {username: "..."}}`
3. **WebSocket + HTTP combo** for training with real-time updates
4. **serverAuthCode is refresh token** in OAuth flows
5. **Store JWT securely** (Keychain/Keystore)
6. **Test with admin key** (`OnairosIsAUnicorn2025`) before production