const API_KEY = 'evai_your_key_here';
const BASE_URL = 'https://api.evolu-ai.com/trpc';
async function createAnalysis(audioFile, salespersonId) {
// 1. Get presigned URL
const presignRes = await fetch(
`${BASE_URL}/upload.getPresignedUrl?input=${encodeURIComponent(JSON.stringify({
filename: audioFile.name,
contentType: audioFile.type
}))}`,
{ headers: { 'X-API-Key': API_KEY } }
);
const { result: { data: presignData } } = await presignRes.json();
// 2. Upload file
const formData = new FormData();
Object.entries(presignData.fields).forEach(([key, value]) => {
formData.append(key, value);
});
formData.append('file', audioFile);
await fetch(presignData.url, {
method: 'POST',
body: formData
});
// 3. Create analysis
const analysisRes = await fetch(`${BASE_URL}/analysis.create`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': API_KEY
},
body: JSON.stringify({
json: {
salespersonId: salespersonId,
audioKey: presignData.fields.key
}
})
});
return await analysisRes.json();
}
const filters = {
limit: 20,
filters: {
salespersonId: 'user_xxx',
dateFrom: '2024-01-01',
dateTo: '2024-01-31',
minScore: 80
}
};
const res = await fetch(
`${BASE_URL}/analysis.list?input=${encodeURIComponent(JSON.stringify(filters))}`,
{ headers: { 'X-API-Key': API_KEY } }
);
const { result: { data } } = await res.json();
# 1. Get URL
curl -X GET 'https://api.evolu-ai.com/trpc/upload.getPresignedUrl?input={"filename":"audio.mp3","contentType":"audio/mpeg"}' \
-H 'X-API-Key: evai_your_key'
# 2. Upload (use returned values)
curl -X POST 'RETURNED_URL' \
-F 'key=FIELD_KEY' \
-F 'bucket=evoluai-storage' \
-F 'X-Amz-Algorithm=AWS4-HMAC-SHA256' \
-F 'X-Amz-Credential=...' \
-F 'X-Amz-Date=...' \
-F 'X-Amz-Signature=...' \
-F 'file=@/path/audio.mp3'
curl -X POST 'https://api.evolu-ai.com/trpc/analysis.create' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: evai_your_key' \
-d '{
"json": {
"salespersonId": "user_xxx",
"audioKey": "analyses/comp_xxx/audio.mp3"
}
}'
const res = await fetch(`${BASE_URL}/user.create`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': API_KEY
},
body: JSON.stringify({
json: {
name: 'John Doe',
email: 'john@company.com',
role: 'salesperson',
supervisorId: 'user_supervisor_xxx'
}
})
});
const res = await fetch(
`${BASE_URL}/credits.getSummary`,
{ headers: { 'X-API-Key': API_KEY } }
);
const { result: { data } } = await res.json();
console.log(`Balance: ${data.currentBalance}`);
interface Analysis {
id: string;
salespersonId: string;
salespersonName: string;
clientName?: string;
score: number;
summary: string;
transcript: string;
profile: string;
stage: 'Connect' | 'Qualify' | 'Present' | 'Close' | 'Negotiate';
bant: {
budget: string;
authority: string;
need: string;
timing: string;
};
objections: Array<{
objection: string;
resolved: boolean;
}>;
strengths: string[];
improvements: string[];
dimensionScores: {
rapport: number;
listening: number;
objections: number;
clarity: number;
closing: number;
};
jobFunctionScore: number;
jobFunctionAnalysis: {
microObjectives: Array<{
criteria: string;
met: boolean;
timestamp: string | null;
evidence: string | null;
}>;
negativeIndicators: Array<{
criteria: string;
present: boolean;
timestamp: string | null;
evidence: string | null;
}>;
};
tokensUsed: number;
cost: number;
audioUrl: string;
audioDuration: number;
createdAt: string;
}
interface User {
id: string;
name: string;
email: string;
role: 'salesperson' | 'supervisor' | 'admin';
jobFunction?: {
id: string;
name: string;
type: string;
};
supervisor?: {
id: string;
name: string;
};
isActive: boolean;
}
interface CreditSummary {
currentBalance: number;
planCredits: number;
planName: string;
usedThisMonth: number;
remainingThisMonth: number;
totalTokensUsed: number;
estimatedMinutesRemaining: number;
}