Step 01: Get an API key
Create a free account on portal.convirza.com. The first key is generated for you. Free credits cover your first scored calls so you can run the rest of this quickstart end to end without entering a card.
Create my free API keyStep 02: Authenticate your first request
Pass the key in the Authorization header as a bearer token. Every request is scoped to the account that owns the key.
# Step 1: exchange your API key and secret for a token (valid 7 days)
curl -X POST https://platform-oauth.convirza.com/oauth/token/client-credentials \
-H "Content-Type: application/json" \
-d '{"api_key": "your-api-key", "api_secret": "your-api-secret"}'
# Step 2: use the token
curl https://platform-api.convirza.com/v3/conversations/calls \
-H "Authorization: Bearer <access_token>"// Node.js 18+ has fetch built in.
// Step 1: exchange your API key and secret for a token (valid 7 days)
const authRes = await fetch('https://platform-oauth.convirza.com/oauth/token/client-credentials', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
api_key: process.env.CONVIRZA_API_KEY,
api_secret: process.env.CONVIRZA_API_SECRET,
}),
});
const { access_token } = await authRes.json();
// Step 2: call the API with the token
const res = await fetch('https://platform-api.convirza.com/v3/conversations/calls', {
headers: { Authorization: `Bearer ${access_token}` },
});
const data = await res.json();
console.log(data);import os
import requests
# Step 1: exchange your API key and secret for a token (valid 7 days)
auth = requests.post(
'https://platform-oauth.convirza.com/oauth/token/client-credentials',
json={
'api_key': os.environ['CONVIRZA_API_KEY'],
'api_secret': os.environ['CONVIRZA_API_SECRET'],
},
)
access_token = auth.json()['access_token']
# Step 2: call the API with the token
response = requests.get(
'https://platform-api.convirza.com/v3/conversations/calls',
headers={'Authorization': f'Bearer {access_token}'},
)
print(response.json())Step 03: Upload a recording
Send an mp3 or wav file, or a URL to one. The endpoint returns a call ID immediately, and processing runs asynchronously after the response comes back.
curl https://platform-api.convirza.com/v3/conversations/calls \
-H "Authorization: Bearer <access_token>"
# Full reference: docs.convirza.com// access_token from the auth step above
const res = await fetch('https://platform-api.convirza.com/v3/conversations/calls', {
headers: {
Authorization: `Bearer ${access_token}`,
},
});
const { data } = await res.json();
console.log(data); // array of scored call objects
// Full reference: docs.convirza.com# access_token from the auth step above
response = requests.get(
'https://platform-api.convirza.com/v3/conversations/calls',
headers={'Authorization': f'Bearer {access_token}'},
)
calls = response.json()['data']
print(calls) # list of scored call objects
# Full reference: docs.convirza.comStep 04: Pull the results
Call Get Call By ID with include=transcription,summary,scorecard. The scorecard status field shows when scoring is done. For live tracking-number calls, add a post-call webhook instead of polling.
# The webhook gives you a call ID. One request returns the rest.
curl "https://platform-api.convirza.com/v3/conversations/calls/{id}?include=transcription,summary,scorecard,dni_data" \
-H "Authorization: Bearer $CONVIRZA_TOKEN"import express from 'express';
import crypto from 'node:crypto';
const app = express();
// The static parameter or custom header you configured on the webhook or
// subscription. Convirza does not sign payloads - this check is yours.
const EXPECTED_KEY = process.env.CONVIRZA_WEBHOOK_KEY;
app.post(
'/webhooks/convirza',
express.json(),
(req, res) => {
const received = req.header('X-My-Webhook-Key') ?? '';
const valid =
received.length === EXPECTED_KEY.length &&
crypto.timingSafeEqual(Buffer.from(received), Buffer.from(EXPECTED_KEY));
if (!valid) {
return res.status(401).send('invalid key');
}
// Respond fast, then enqueue the work. Dedupe on the call ID.
res.status(200).send('ok');
enqueue(req.body);
},
);
app.listen(3000);import hmac
import os
from flask import Flask, request, abort
app = Flask(__name__)
# The static parameter or custom header you configured on the webhook or
# subscription. Convirza does not sign payloads - this check is yours.
EXPECTED_KEY = os.environ['CONVIRZA_WEBHOOK_KEY']
@app.post('/webhooks/convirza')
def convirza_webhook():
received = request.headers.get('X-My-Webhook-Key', '')
if not hmac.compare_digest(received, EXPECTED_KEY):
abort(401, 'invalid key')
# Respond fast, then enqueue the work. Dedupe on the call ID.
enqueue(request.get_json())
return ('ok', 200)Step 05: Move to production
Add billing when you need credits beyond your free $20. If you operate at the scale of a vertical SaaS or agency network, talk to a solutions engineer about volume pricing and a dedicated onboarding plan.
Talk to a solutions engineer