A Python wrapper for the NLPearl API
Project description
NLPearl Python Wrapper
NLPearl is a Python wrapper for the NLPearl API, allowing developers to interact seamlessly with NLPearl's services. This package supports both API V1 and V2 with a unified interface.
Table of Contents
- Installation
- Getting Started
- Quick Start
- API Versions
- Usage Guide
- Complete API Reference
- Migration Guide
- Changelog
- License
Installation
pip install nlpearl
Getting Started
- Get your API key from NLPearl
- Set your API version (V2 is default)
- Start making API calls!
import os
import nlpearl as pearl
from dotenv import load_dotenv
# Configuration
load_dotenv()
env = os.environ
pearl.api_key = env["PROD_API_KEY"]
pearl.api_version = "v2" # Default, can be "v1" or "v2"
Quick Start
V2 Example (Default)
import os
import nlpearl as pearl
from dotenv import load_dotenv
load_dotenv()
pearl.api_key = os.environ["PROD_API_KEY"]
pearl.api_version = "v2" # Default
# Get all pearls
pearls = pearl.Pearl.get_all()
# Add a lead using pearl_id
pearl.Outbound.add_lead(
pearl_id,
phone_number="+1234567890",
call_data={"firstName": "John"}
)
# Get analytics
analytics = pearl.Pearl.get_analytics(
pearl_id,
from_date="2024-01-01T00:00:00.000Z",
to_date="2024-01-31T23:59:59.999Z"
)
V1 Example
import os
import nlpearl as pearl
from dotenv import load_dotenv
load_dotenv()
pearl.api_key = os.environ["PROD_API_KEY"]
pearl.api_version = "v1"
# Get all inbounds
inbounds = pearl.Inbound.get_all()
# Add a lead using outbound_id
pearl.Outbound.add_lead(
outbound_id,
phone_number="+1234567890",
call_data={"firstName": "John"}
)
# Get analytics
analytics = pearl.Outbound.get_analytics(
outbound_id,
from_date="2024-01-01T00:00:00.000Z",
to_date="2024-01-31T23:59:59.999Z"
)
API Versions
The wrapper uses the same class names for both V1 and V2, automatically routing to the correct endpoints based on pearl.api_version.
Version Differences
| Feature | V1 | V2 |
|---|---|---|
| Default | No | Yes |
| Structure | Separate Inbound/Outbound | Unified Pearl |
| ID Parameter | outbound_id, inbound_id |
pearl_id |
| Classes | Inbound, Outbound |
Pearl |
| Lead Operations | Outbound.add_lead(outbound_id, ...) |
Outbound.add_lead(pearl_id, ...) |
| Total Endpoints | 26 | 26 |
Unified API Approach
- Same class names - Use
pearl.Outbound,pearl.Pearl,pearl.Inbound - Automatic routing - Methods route to correct version based on
api_version - Clear errors - Helpful messages when using wrong version
- Version switching - Change
api_versionanytime
No separate V2 classes needed! Just set the version once and use the same API.
Usage Guide
V2 API (Default)
Account Operations (V2)
pearl.api_version = "v2"
# Get account info (works in both V1 and V2)
account = pearl.Account.get_account()
# V2-only account methods
users = pearl.Account.get_users() # Get list of users
phones = pearl.Account.get_phone_numbers() # Get active phone numbers
voices = pearl.Account.get_voices() # Get available voices by language
Pearl Management (V2)
pearl.api_version = "v2"
# Get all pearls
pearls = pearl.Pearl.get_all()
# Get specific pearl
pearl_details = pearl.Pearl.get(pearl_id)
# Create a new pearl
new_pearl = pearl.Pearl.create(
name="My Pearl",
pearl={"businessName": "My Company", "objective": "Sales"},
variables=[{"name": "firstName", "description": "Customer first name"}],
inbound={"isActive": True},
outbound={"isActive": True, "callerIdNumber": "+1234567890"}
)
# Update pearl settings
pearl.Pearl.update(
pearl_id,
name="Updated Pearl Name",
pearl={"businessName": "New Name"}
)
# Get pearl settings
settings = pearl.Pearl.get_settings(pearl_id)
# Update outbound/inbound settings
pearl.Pearl.update_outbound_settings(pearl_id, {"callerIdNumber": "+1234567890"})
pearl.Pearl.update_inbound_settings(pearl_id, {"isActive": True})
# Activate/Deactivate
pearl.Pearl.set_active(pearl_id, is_active=True)
# Get ongoing calls
ongoing = pearl.Pearl.get_ongoing_calls(pearl_id)
# Get calls with filters
calls = pearl.Pearl.get_calls(
pearl_id,
from_date=datetime(2024, 1, 1),
to_date=datetime(2024, 1, 31),
tags=["important"],
statuses=[100, 130],
search_input="John"
)
# Get analytics
analytics = pearl.Pearl.get_analytics(pearl_id, from_date, to_date)
# Reset customer memory
pearl.Pearl.reset_memory(pearl_id, phone_number="+1234567890")
Lead Management (V2)
# Add lead (using pearl_id, uses POST in V2)
lead = pearl.Outbound.add_lead(
pearl_id,
phone_number="+1234567890",
external_id="ext123",
time_zone_id="Pacific Standard Time",
call_data={"firstName": "John", "lastName": "Doe"}
)
# Get lead
lead = pearl.Outbound.get_lead_by_id(pearl_id, lead_id)
lead = pearl.Outbound.get_lead_by_external_id(pearl_id, "ext123")
lead = pearl.Outbound.get_lead_by_phone_number(pearl_id, "+1234567890")
# Update lead
pearl.Outbound.update_lead(
pearl_id,
lead_id,
status=100, # Mark as Success
call_data={"notes": "Contact successful"}
)
# Search leads
leads = pearl.Outbound.get_leads(
pearl_id,
statuses=[1, 10], # New and NeedRetry
search_input="John",
limit=50
)
# Delete leads
pearl.Outbound.delete_leads(pearl_id, [lead_id1, lead_id2])
pearl.Outbound.delete_leads_by_external_id(pearl_id, ["ext1", "ext2"])
V1 API
Account Operations (V1)
pearl.api_version = "v1"
# Get account info
account = pearl.Account.get_account()
Inbound Operations (V1 Only)
pearl.api_version = "v1"
# Get all inbounds
inbounds = pearl.Inbound.get_all()
# Get specific inbound
inbound = pearl.Inbound.get(inbound_id)
# Activate/Deactivate
pearl.Inbound.set_active(inbound_id, is_active=True)
# Get ongoing calls
ongoing = pearl.Inbound.get_ongoing_calls(inbound_id)
# Get calls with filters
calls = pearl.Inbound.get_calls(
inbound_id,
from_date=datetime(2024, 1, 1),
to_date=datetime(2024, 1, 31),
tags=["important"],
statuses=[100, 130],
search_input="John"
)
# Get analytics
analytics = pearl.Inbound.get_analytics(inbound_id, from_date, to_date)
Outbound Operations (V1)
# Get all outbounds
outbounds = pearl.Outbound.get_all()
# Get specific outbound
outbound = pearl.Outbound.get(outbound_id)
# Activate/Deactivate
pearl.Outbound.set_active(outbound_id, is_active=True)
# Get calls with filters
calls = pearl.Outbound.get_calls(
outbound_id,
from_date=datetime(2024, 1, 1),
to_date=datetime(2024, 1, 31),
statuses=[100, 130],
search_input="John"
)
# Make a call
result = pearl.Outbound.make_call(
outbound_id,
to="+1234567890",
call_data={"firstName": "Jane"}
)
# Get call requests
requests = pearl.Outbound.get_call_requests(
outbound_id,
from_date=datetime(2024, 1, 1),
to_date=datetime(2024, 1, 31)
)
# Get specific call request
request = pearl.Outbound.get_call_request(request_id)
# Get analytics
analytics = pearl.Outbound.get_analytics(outbound_id, from_date, to_date)
Lead Management (V1)
# Add lead (using outbound_id, uses PUT in V1)
lead = pearl.Outbound.add_lead(
outbound_id,
phone_number="+1234567890",
external_id="ext123",
call_data={"firstName": "John"}
)
# Update lead
pearl.Outbound.update_lead(outbound_id, lead_id, status=100)
# Search leads
leads = pearl.Outbound.get_leads(
outbound_id,
statuses=[1, 10], # Array of status codes
search_input="John"
)
# Other lead methods work the same
lead = pearl.Outbound.get_lead_by_id(outbound_id, lead_id)
pearl.Outbound.delete_leads(outbound_id, [lead_id1, lead_id2])
Shared Methods
These methods work in both V1 and V2:
Account
# Works in both versions
account = pearl.Account.get_account()
print(f"Balance: {account['creditBalance']}")
Call Operations
# Get call info (both versions)
call = pearl.Call.get_call(call_id)
# Delete calls (both versions)
pearl.Call.delete_calls([call_id1, call_id2])
Memory Management
# V1 and V2 (different implementations internally)
pearl.Pearl.reset_customer_memory(pearl_id, phone_number)
# V2 alias
pearl.Pearl.reset_memory(pearl_id, phone_number)
Complete API Reference
V1 Endpoints (26 total)
| Class | Method | Description |
|---|---|---|
| Account | get_account() |
Get account information |
| Call | get_call(call_id) |
Get call details |
| Call | delete_calls(call_ids) |
Delete multiple calls |
| Inbound | get_all() |
List all inbound pearls |
| Inbound | get(inbound_id) |
Get specific inbound |
| Inbound | set_active(inbound_id, is_active) |
Activate/deactivate |
| Inbound | get_calls(inbound_id, ...) |
Get calls with filters |
| Inbound | get_ongoing_calls(inbound_id) |
Get active calls |
| Inbound | get_analytics(inbound_id, ...) |
Get analytics data |
| Outbound | get_all() |
List all outbound pearls |
| Outbound | get(outbound_id) |
Get specific outbound |
| Outbound | set_active(outbound_id, is_active) |
Activate/deactivate |
| Outbound | get_calls(outbound_id, ...) |
Get calls with filters |
| Outbound | get_analytics(outbound_id, ...) |
Get analytics data |
| Outbound | make_call(outbound_id, to, call_data) |
Initiate a call |
| Outbound | get_call_request(request_id) |
Get call request status |
| Outbound | get_call_requests(outbound_id, ...) |
List call requests |
| Outbound | add_lead(outbound_id, ...) |
Add lead (uses PUT) |
| Outbound | update_lead(outbound_id, lead_id, ...) |
Update lead |
| Outbound | get_leads(outbound_id, ...) |
List leads with filters |
| Outbound | get_lead_by_id(outbound_id, lead_id) |
Get lead by ID |
| Outbound | get_lead_by_external_id(outbound_id, ext_id) |
Get lead by external ID |
| Outbound | get_lead_by_phone_number(outbound_id, phone) |
Get lead by phone |
| Outbound | delete_leads(outbound_id, lead_ids) |
Delete leads by ID |
| Outbound | delete_leads_by_external_id(outbound_id, ext_ids) |
Delete by external ID |
| Pearl | reset_customer_memory(pearl_id, phone) |
Reset memory (URL param) |
V2 Endpoints (26 total)
| Class | Method | Description |
|---|---|---|
| Account | get_account() |
Get account information |
| Account | get_users() |
Get list of users [NEW] |
| Account | get_phone_numbers() |
Get active phone numbers [NEW] |
| Account | get_voices() |
Get available voices [NEW] |
| Call | get_call(call_id) |
Get call details |
| Call | delete_calls(call_ids) |
Delete multiple calls |
| Pearl | get_all() |
List all pearls |
| Pearl | get(pearl_id) |
Get specific pearl |
| Pearl | create(name, pearl, ...) |
Create new pearl [NEW] |
| Pearl | update(pearl_id, ...) |
Update pearl [NEW] |
| Pearl | set_active(pearl_id, is_active) |
Activate/deactivate |
| Pearl | get_calls(pearl_id, ...) |
Get calls with filters |
| Pearl | get_ongoing_calls(pearl_id) |
Get active calls |
| Pearl | get_analytics(pearl_id, ...) |
Get analytics data |
| Pearl | get_settings(pearl_id) |
Get pearl settings [NEW] |
| Pearl | update_outbound_settings(pearl_id, settings) |
Update outbound [NEW] |
| Pearl | update_inbound_settings(pearl_id, settings) |
Update inbound [NEW] |
| Pearl | reset_memory(pearl_id, phone) |
Reset memory (body) |
| Outbound | add_lead(pearl_id, ...) |
Add lead (uses POST) |
| Outbound | update_lead(pearl_id, lead_id, ...) |
Update lead |
| Outbound | get_leads(pearl_id, ...) |
List leads with filters |
| Outbound | get_lead_by_id(pearl_id, lead_id) |
Get lead by ID |
| Outbound | get_lead_by_external_id(pearl_id, ext_id) |
Get lead by external ID |
| Outbound | get_lead_by_phone_number(pearl_id, phone) |
Get lead by phone |
| Outbound | delete_leads(pearl_id, lead_ids) |
Delete leads by ID |
| Outbound | delete_leads_by_external_id(pearl_id, ext_ids) |
Delete by external ID |
Method Availability Matrix
| Class | Method | V1 | V2 | Notes |
|---|---|---|---|---|
| Account | get_account() |
Y | Y | Shared |
| Account | get_users() |
- | Y | V2 only |
| Account | get_phone_numbers() |
- | Y | V2 only |
| Account | get_voices() |
- | Y | V2 only |
| Call | get_call(call_id) |
Y | Y | Shared |
| Call | delete_calls(call_ids) |
Y | Y | Shared |
| Inbound | All methods | Y | - | V1 only |
| Outbound | get_all() |
Y | - | V1 only |
| Outbound | get(id) |
Y | - | V1 only |
| Outbound | set_active(...) |
Y | - | V1 only |
| Outbound | get_calls(...) |
Y | - | V1 only |
| Outbound | get_analytics(...) |
Y | - | V1 only |
| Outbound | make_call(...) |
Y | - | V1 only |
| Outbound | get_call_request(...) |
Y | - | V1 only |
| Outbound | get_call_requests(...) |
Y | - | V1 only |
| Outbound | Lead methods | Y | Y | Shared (different ID) |
| Pearl | get_all() |
- | Y | V2 only |
| Pearl | get(pearl_id) |
- | Y | V2 only |
| Pearl | create(...) |
- | Y | V2 only |
| Pearl | update(...) |
- | Y | V2 only |
| Pearl | set_active(...) |
- | Y | V2 only |
| Pearl | get_calls(...) |
- | Y | V2 only |
| Pearl | get_ongoing_calls(...) |
- | Y | V2 only |
| Pearl | get_analytics(...) |
- | Y | V2 only |
| Pearl | get_settings(...) |
- | Y | V2 only |
| Pearl | update_outbound_settings(...) |
- | Y | V2 only |
| Pearl | update_inbound_settings(...) |
- | Y | V2 only |
| Pearl | reset_customer_memory(...) |
Y | Y | Different implementation |
Status Codes
Lead Status
1- New10- NeedRetry100- Success110- NotSuccessful130- Completed150- Unreachable220- Blacklisted500- Error
Call Status
3- InProgress4- Completed5- Busy6- Failed7- NoAnswer8- Canceled
Activity Status
1- Running2- Paused3- Suspended10- TemporaryMaintenance
Migration Guide
From V1 to V2
Before (V1):
pearl.api_version = "v1"
# Get outbounds
outbounds = pearl.Outbound.get_all()
# Add lead
pearl.Outbound.add_lead(outbound_id, phone_number="+123...")
# Get analytics
analytics = pearl.Outbound.get_analytics(outbound_id, from_date, to_date)
After (V2):
pearl.api_version = "v2"
# Get pearls (replaces outbounds/inbounds)
pearls = pearl.Pearl.get_all()
# Add lead (same method, different ID)
pearl.Outbound.add_lead(pearl_id, phone_number="+123...")
# Get analytics (use Pearl class)
analytics = pearl.Pearl.get_analytics(pearl_id, from_date, to_date)
Key Changes
- Replace
outbound_id/inbound_idwithpearl_id - Use
Pearlclass for analytics, calls, and pearl management - Keep using
Outboundfor lead operations (just change the ID) Inboundclass is V1-only, usePearlin V2
Error Handling
The wrapper provides clear error messages when using methods in the wrong version:
pearl.api_version = "v2"
pearl.Inbound.get_all()
# ValueError: Inbound.get_all() is only available in API v1.
# In v2, use Pearl.get_all() instead.
Changelog
Version 2.0.0 (February 2026)
API Versioning System
- Added
pearl.api_versionglobal variable (default: 'v2') - Added
_get_api_url()helper for dynamic URL generation - Unified API: Same class names work for both V1 and V2
New V2 Account Endpoints
Account.get_users()- Get list of usersAccount.get_phone_numbers()- Get active phone numbersAccount.get_voices()- Get available voices by language
New V2 Pearl Endpoints
Pearl.create()- Create a new Pearl with full configurationPearl.update()- Update Pearl settingsPearl.get_settings()- Get Pearl configurationPearl.update_outbound_settings()- Update outbound settingsPearl.update_inbound_settings()- Update inbound settings
V1 Fixes (from OpenAPI spec)
Outbound.get_calls()- Addedstatuses(array),search_inputparametersOutbound.get_leads()- Changedstatustostatuses(array), addedsearch_inputInbound.get_calls()- Addedstatuses(array),search_inputparameters
Version-Specific Behavior
Outbound.add_lead(): V1 uses PUT, V2 uses POSTPearl.reset_customer_memory(): V1 uses URL param, V2 uses request body- Methods raise
ValueErrorif called with wrong API version
License
BSD 3-Clause License - see LICENSE file for details.
Contact
- Support: support@nlpearl.ai
- Documentation: This README
- API Key: Contact support@nlpearl.ai
Version: 2.0.0
Python: 3.6+
API Versions: V1 (26 endpoints) and V2 (26 endpoints) supported
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nlpearl-2.1.1.tar.gz.
File metadata
- Download URL: nlpearl-2.1.1.tar.gz
- Upload date:
- Size: 18.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5a84de1c99c35cada51d2cd67941dbb36926a88a71d3e3dac762df87d6164b7
|
|
| MD5 |
bb6c8f4a6fc101986062ef787c23e6a2
|
|
| BLAKE2b-256 |
22dbf0a0328598ca880f20bbb1aae6477e32e385f885922facdd034fdb55f09d
|
File details
Details for the file nlpearl-2.1.1-py3-none-any.whl.
File metadata
- Download URL: nlpearl-2.1.1-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82d2b8e3ee870bef81f328703ea0799fe66458e3767dae8bff657b1334044c29
|
|
| MD5 |
c0559b38f373a354009df5abbcbea265
|
|
| BLAKE2b-256 |
7e3096b365cc0fd77949990a5f15357471dbcd7e0041b03a39d78fcf7b6029d7
|