Skip to main content
The official NAWA Python SDK with synchronous and asynchronous support, auto-pagination, and comprehensive type hints.

Installation

pip install nawa-sdk
pip install nawa-sdk
Requirements: Python 3.8+

Quick start

from nawa import Nawa

nawa = Nawa(api_key="nawa_live_sk_xxx")

# Classify an Arabic comment
result = nawa.classify(
    text="ما شاء الله عليك، محتوى رهيب!",
    platform="youtube"
)

if result.error:
    print(result.error.type, result.error.message)
else:
    print(result.data.intent)    # "praise"
    print(result.data.dialect)   # "gulf"
    print(result.data.sentiment) # "positive"

Async support

The SDK provides a fully async client powered by httpx:
from nawa import AsyncNawa
import asyncio

async def main():
    nawa = AsyncNawa(api_key="nawa_live_sk_xxx")

    result = await nawa.classify(
        text="متى الجزء الثاني؟",
        platform="youtube"
    )

    if result.data:
        print(result.data.intent)   # "question"
        print(result.data.dialect)  # "gulf"

    await nawa.close()

asyncio.run(main())
Use AsyncNawa with async with for automatic cleanup:
async with AsyncNawa(api_key="nawa_live_sk_xxx") as nawa:
    result = await nawa.classify(text="متى الجزء الثاني؟", platform="youtube")

Classify comments

result = nawa.classify(
    text="متى الجزء الثاني؟",
    platform="youtube",
    channel_id="ch_123",
    metadata={"video_id": "vid_abc"}
)

if result.data:
    print(result.data.intent)             # "question"
    print(result.data.dialect)            # "gulf"
    print(result.data.dialect_confidence) # 0.95
    print(result.data.cached)            # False

Rubric classification

result = nawa.rubric.classify(
    text="وين الترجمة العربية؟",
    rubric={
        "categories": ["translation_request", "technical_issue", "content_feedback"],
        "descriptions": {
            "translation_request": "User wants subtitles or translation",
            "technical_issue": "Audio/video problems",
            "content_feedback": "Feedback on content quality",
        },
    },
)

if result.data:
    print(result.data.category)  # "translation_request"
    print(result.data.scores)    # {"translation_request": 0.94, ...}

Generate replies

result = nawa.comments.reply(
    comment_id="cmt_abc123",
    tone="friendly",
    context="Tech review channel"
)

if result.data:
    print(result.data.reply_text)    # "إن شاء الله الجزء الثاني قريب!"
    print(result.data.reply_dialect) # "gulf"

List comments with auto-pagination

# Single page
result = nawa.comments.list(
    platform="youtube",
    intent="question",
    limit=25
)

# Auto-pagination (iterator)
for comment in nawa.comments.list(platform="youtube"):
    print(comment.text, comment.intent)

# Async auto-pagination
async for comment in nawa.comments.list(platform="youtube"):
    print(comment.text, comment.intent)

Submit feedback

result = nawa.feedback.submit(
    request_id="req_abc123def456",
    field="dialect",
    expected_value="levantine",
    comment="This is Lebanese Arabic"
)

Webhook signature verification

from nawa.webhooks import verify_signature

is_valid = verify_signature(
    payload=request_body,
    signature=headers["x-nawa-signature"],
    timestamp=headers["x-nawa-timestamp"],
    secret="nawa_wh_your_secret"
)

Error handling

from nawa import Nawa
from nawa.errors import NawaAuthError, NawaRateLimitError, NawaCreditsError

nawa = Nawa(api_key="your_api_key")
result = nawa.classify(text="...", platform="youtube")

if result.error:
    if isinstance(result.error, NawaAuthError):
        print(f"Auth error: {result.error.code}")
    elif isinstance(result.error, NawaRateLimitError):
        print(f"Retry after: {result.error.retry_after}s")
    elif isinstance(result.error, NawaCreditsError):
        print(f"Buy credits: {result.error.suggested_action}")
    else:
        print(f"API error: {result.error.message}")

Configuration

nawa = Nawa(
    api_key="nawa_live_sk_xxx",

    # Retry configuration
    max_retries=3,         # Default: 3
    retry_delay=1.0,       # Base delay in seconds. Default: 1.0
    retry_backoff="exponential",  # "exponential", "linear", "none"

    # Timeout
    timeout=30.0,          # Request timeout in seconds. Default: 30.0

    # Base URL override (for testing)
    base_url="https://api.trynawa.com",  # Default
)