შესავალი

Activi Voice API საშუალებას გაძლევს შენი სისტემა (CRM, ბილინგი, ERP, ვებსაიტი) დააკავშირო სატელეფონო სისტემასთან და AI ასისტენტთან:

Base URLhttps://voip.activi.ge/api/v1
ფორმატიJSON (UTF-8), ქართული ტექსტი სრულად მხარდაჭერილია
ტელეფონის ფორმატინებისმიერი: 599123456, +995 599 12 34 56, 995599123456 — სისტემა ავტომატურად აერთიანებს (599123456)
თარიღებიYYYY-MM-DD HH:MM (თბილისის დრო)

ავტორიზაცია

API გასაღებს ქმნის კლიენტი პანელში: API → ახალი გასაღები. გასაღები ჩანს მხოლოდ ერთხელ და ინახება დაშიფრული (hash). ყოველ მოთხოვნას დაურთე header:

Authorization: Bearer av_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ალტერნატივა: X-API-Key: av_.... თითოეული გასაღები ეკუთვნის ერთ კლიენტს და ხედავს მხოლოდ მის მონაცემებს.

🔒 IP შეზღუდვა: გასაღებს შეიძლება მიეთითოს დაშვებული IP-ები ან ქსელები (მაგ. 185.10.20.30, 31.146.0.0/16). სხვა მისამართიდან მოთხოვნა უარყოფილია 403-ით. რეკომენდებულია production-ისთვის.
GET /ping

კავშირის და გასაღების შემოწმება.

curl https://voip.activi.ge/api/v1/ping -H "Authorization: Bearer av_..."

{"ok": true, "company": "შპს ალფა", "your_ip": "185.10.20.30"}

შეცდომები და ლიმიტები

წარმატებულ პასუხს აქვს "ok": true. შეცდომისას — HTTP კოდი და {"ok": false, "error": "აღწერა"}.

კოდიმნიშვნელობა
400არასწორი მოთხოვნა (ველი აკლია ან არასწორი ფორმატია)
401გასაღები არ არის ან არასწორია
403IP არ არის დაშვებული, ან ფუნქცია არ შედის პაკეტში
404ობიექტი ვერ მოიძებნა
409უკვე არსებობს
429ძალიან ბევრი მოთხოვნა — დაელოდე და გაიმეორე

ლიმიტი: 120 მოთხოვნა წუთში ერთი IP-დან (burst 60). მრავალჯერადი არასწორი გასაღები IP-ს დროებით ბლოკავს. დიდი მოცულობისთვის გამოიყენე bulk — ერთ მოთხოვნაში 5000-მდე აბონენტი.

აბონენტების შემოტანა / განახლება

POST /customers

ქმნის ან ანახლებს აბონენტებს ტელეფონის ნომრით (upsert). ერთ მოთხოვნაში 1–5000 ჩანაწერი. Body — სია, ან {"customers": [...]}.

ველიტიპიაღწერა
phone *stringტელეფონი — უნიკალური გასაღები
namestringსახელი, გვარი
orgstringკომპანია / ორგანიზაცია
notestringშენიშვნა
ნებისმიერი სხვაstring / number / boolინახება data-ში და ხელმისაწვდომია AI-სთვის. მაგ.: debt, due_date, status, contract, tariff, last_payment. null შლის ველს.
curl -X POST https://voip.activi.ge/api/v1/customers \
  -H "Authorization: Bearer av_..." \
  -H "Content-Type: application/json" \
  -d '[
    {"phone": "599123456", "name": "გიორგი ბერიძე", "org": "შპს ალფა",
     "debt": 125.50, "currency": "GEL", "due_date": "2026-10-20",
     "status": "ვადაგადაცილებული", "contract": "N-4521"},
    {"phone": "577987654", "name": "ნინო კაპანაძე", "debt": 0, "status": "აქტიური"}
  ]'

{"ok": true, "created": 1, "updated": 1, "errors": []}
💡 სინქრონიზაციის რჩევა: დღეში ერთხელ (ან ყოველი ცვლილებისას) გაგზავნე ყველა აბონენტი, ვისი მონაცემიც შეიცვალა. ერთ მოთხოვნაში 5000-მდე; მეტისთვის — რამდენიმე მოთხოვნა.

აბონენტების სია და ძებნა

GET /customers ?phone=599123456
curl "https://voip.activi.ge/api/v1/customers?phone=599123456" -H "Authorization: Bearer av_..."

{"ok": true, "count": 1, "customers": [{
  "phone": "599123456", "name": "გიორგი ბერიძე", "org": "შპს ალფა", "note": "",
  "data": {"debt": 125.5, "due_date": "2026-10-20", "status": "ვადაგადაცილებული"},
  "created": "2026-10-11 01:46", "updated": "2026-10-11 09:12"}]}

ერთი აბონენტი

GET /customers/{phone}
DELETE /customers/{phone}
curl -X DELETE https://voip.activi.ge/api/v1/customers/599123456 -H "Authorization: Bearer av_..."

{"ok": true, "deleted": "599123456"}

ზარების ისტორია

GET /calls ?since=2026-10-01
{"ok": true, "calls": [
  {"start": "2026-10-11 10:15:02", "from": "995599123456", "to": "s", "duration": 84, "status": "ANSWERED"}]}

status: ANSWERED, NO ANSWER, BUSY, FAILED. ბოლო 5000 ჩანაწერი.

AI ზარების ანგარიშები

GET /ai-calls ?since=2026-10-01

ყოველი საუბარი AI ასისტენტთან — ავტომატურად ამოღებული ინფორმაციით.

{"ok": true, "ai_calls": [{
  "id": "019a...", "at": "2026-10-11 10:20", "caller": "595512180", "duration": 91,
  "name": "დიმიტრი", "client_company": "შპს ბეტა", "phone": "599127000",
  "topic": "გაყიდვები", "product": "Activi POS", "preferred_time": "ხვალ 15:00",
  "callback": true, "summary": "დიმიტრის აინტერესებს POS მაღაზიისთვის...",
  "transcript": "AI: გამარჯობა!...", "status": "new"}]}

გამოტოვებული ზარები

GET /missed ?since=2026-10-01
{"ok": true, "missed": [{"id": "a1b2c3", "did": "2424022", "from": "599123456", "at": "2026-10-11 10:31", "status": "new"}]}

ზარის წამოწყება (click-to-call)

POST /call

ჯერ რეკავს შიდა ნომერს (თანამშრომლის ტელეფონს); როცა აიღებს — უკავშირდება აბონენტს. მხოლოდ საქართველოს ნომრები.

curl -X POST https://voip.activi.ge/api/v1/call -H "Authorization: Bearer av_..." -H "Content-Type: application/json" \
  -d '{"extension": "100", "to": "599123456"}'

{"ok": true, "status": "ringing", "extension": "100", "to": "599123456"}

ჩანაწერები

GET /recordings ?since=2026-10-01
GET /recordings/{file}
{"ok": true, "recordings": [{"file": "c1a2b3_20261011-101502_in_2424022_599123456.wav",
  "at": "20261011-101502", "direction": "in", "parties": ["2424022", "599123456"],
  "size": 482044, "url": "https://voip.activi.ge/api/v1/recordings/c1a2b3_20261011-101502_in_2424022_599123456.wav"}]}

ფაილის ჩამოსატვირთად იგივე Authorization header. ფორმატი: WAV, 8 kHz. შენახვის ვადა დამოკიდებულია პაკეტზე.

ანგარიში და პაკეტი

GET /account
{"ok": true, "company": {"name": "შპს ალფა", "type": "company", "code": "404123456"},
 "balance": 85.40, "currency": "GEL", "ai_available": true,
 "package": {"name": "AI სტარტი", "price": 120, "status": "active", "period_end": "2026-11-10",
             "ai_minutes_included": 150, "ai_minutes_used": 42.5, "max_numbers": 1, "max_extensions": 10}}

ნომრები

GET /numbers
{"ok": true, "numbers": [{"number": "2424022", "online": true, "mode": "ai"}]}

შიდა ნომრები

GET /extensions
POST /extensions
DELETE /extensions/{extension}
curl -X POST https://voip.activi.ge/api/v1/extensions -H "Authorization: Bearer av_..." -H "Content-Type: application/json" \
  -d '{"extension": "106", "name": "ნინო — გაყიდვები"}'

{"ok": true, "server": "voip.activi.ge", "port": 5060, "transport": "udp", "extensions": [
  {"extension": "106", "name": "ნინო — გაყიდვები", "password": "Xy7...", "online": false,
   "setup_url": "https://voip.activi.ge/p/..."}]}

setup_url — პირადი გვერდი SIP ტელეფონის (Zoiper, Linphone) დასაყენებლად. გაუგზავნე თანამშრომელს.

Webhook-ები

პანელში (API → Webhook) მიუთითე შენი HTTPS მისამართი — მოვლენისას გამოვგზავნით POST JSON-ს:

eventროდის
ai_callAI ასისტენტთან საუბარი დასრულდა (შეჯამებით)
missed_callზარს არავინ უპასუხა
POST https://your-system.ge/activi-webhook
Content-Type: application/json
X-Activi-Signature: 5d41402abc4b2a76b9719d911017c592...

{"event": "ai_call", "company": "c1a2b3", "at": "2026-10-11T10:22:05",
 "data": {"id": "019a...", "caller": "595512180", "name": "დიმიტრი", "phone": "599127000",
          "topic": "გაყიდვები", "product": "Activi POS", "preferred_time": "ხვალ 15:00",
          "summary": "...", "duration": 91}}

ხელმოწერის შემოწმება

X-Activi-Signature = HMAC-SHA256(body, საიდუმლო), hex. საიდუმლო ჩანს პანელში Webhook-ის ქვეშ. ყოველთვის შეამოწმე — ასე დარწმუნდები, რომ მოთხოვნა ჩვენგანაა.

import hmac, hashlib
from flask import Flask, request, abort

SECRET = b"შენი_webhook_საიდუმლო"
app = Flask(__name__)

@app.post("/activi-webhook")
def hook():
    sig = hmac.new(SECRET, request.get_data(), hashlib.sha256).hexdigest()
    if not hmac.compare_digest(sig, request.headers.get("X-Activi-Signature", "")):
        abort(401)
    ev = request.get_json()
    if ev["event"] == "ai_call":
        print("ახალი ლიდი:", ev["data"]["name"], ev["data"]["phone"])
    return {"ok": True}

უპასუხე 2xx-ით 10 წამში. მოვლენა იგზავნება ერთხელ — თუ შენი სერვერი მიუწვდომელია, მონაცემები მაინც ხელმისაწვდომია /ai-calls და /missed-ით.

AI-სთან ინტეგრაცია

როცა აბონენტი რეკავს, AI ასისტენტი ავტომატურად ეძებს მას დამრეკავის ნომრით და იღებს /customers-ით შემოტანილ ყველა ველს. მაგალითად, თუ გაგზავნე:

{"phone": "599123456", "name": "გიორგი", "debt": 125.50, "due_date": "2026-10-20", "status": "ვადაგადაცილებული"}

და გიორგი დარეკავს, AI მიესალმება სახელით და, თუ ჰკითხავს — ეტყვის: „თქვენი დავალიანება შეადგენს 125 ლარსა და 50 თეთრს, გადახდის ვადა იყო 20 ოქტომბერი.“

Activi Voice API v1 · კითხვებისთვის დაგვიკავშირდით