REST API v1

API Documentation

Programmatic access to contacts, lists, campaigns, and webhooks. Build powerful integrations with the Arnis API.

Base URL
https://company.arnis.ai/api/v1

Authentication

All API requests require an API key passed in the X-API-Key header.

Header
X-API-Key: your_api_key_here

Creating an API Key

1Go to Integration > Inbound in the Arnis app
2Click Create Key
3Choose a name, scope, and optional expiration
4Copy the key immediately. It will not be shown again.

API Key Scopes

Control what each key can access.

ScopeDescription
Full AccessRead and write access to all resources
Read OnlyList and view contacts, lists, and campaigns
Contacts OnlyCreate, update, and delete contacts and lists
Campaigns OnlyView and control campaigns

Request Format

How to structure your API requests.

GET

Use query parameters: /contacts?page=1&search=John

POST / PUT

Require a JSON body with Content-Type: application/json

IDs

UUIDs returned when creating resources, also visible in the app

Fields

All fields are optional unless marked (required)

Contacts

Manage your contact database programmatically.

GET /contacts Read Only

Returns a paginated list of contacts.

ParameterTypeDescription
pageintegerPage number (default: 1)
per_pageintegerItems per page (default: 25)
searchstringSearch by name or phone number
Response
{
  "items": [
    {
      "id": "uuid",
      "phone_number": "(555) 123-4567",
      "e164_number": "+15551234567",
      "first_name": "John",
      "last_name": "Doe",
      "email": "[email protected]",
      "timezone": "America/New_York",
      "tags": ["lead", "priority"],
      "opted_out": false,
      "created_at": "2026-01-15T10:30:00Z"
    }
  ],
  "total": 150,
  "page": 1,
  "per_page": 25,
  "pages": 6
}
GET /contacts/{id} Read Only

Returns details for a single contact.

POST /contacts Contacts Only

Creates a new contact.

FieldTypeRequiredDescription
phone_numberstringYesPhone number (auto-converted to E.164)
first_namestringNoContact's first name
last_namestringNoContact's last name
emailstringNoEmail address
timezonestringNoIANA timezone (e.g. America/New_York)
tagsstring[]NoList of tags
list_idsstring[]NoUUIDs of lists to add contact to
Request Body
{
  "phone_number": "(555) 123-4567",
  "first_name": "John",
  "last_name": "Doe",
  "email": "[email protected]",
  "tags": ["lead", "priority"],
  "list_ids": ["uuid-of-list"]
}
PUT /contacts/{id} Contacts Only

Updates an existing contact. Only include fields you want to change.

DELETE /contacts/{id} Contacts Only

Permanently deletes a contact.

POST /contacts/{id}/opt-out Contacts Only

Opts out a contact so they no longer receive messages.

Response
{
  "id": "uuid",
  "opted_out": true,
  "opted_out_at": "2026-03-06T15:00:00Z"
}
POST /contacts/{id}/opt-in Contacts Only

Re-activates an opted-out contact.

POST /contacts/batch Contacts Only

Creates multiple contacts in a single request. Duplicates (by phone number) are skipped.

Request Body
{
  "contacts": [
    { "phone_number": "(555) 100-0001", "first_name": "Alice" },
    { "phone_number": "(555) 100-0002", "first_name": "Bob" },
    { "phone_number": "(555) 100-0003", "first_name": "Carol" }
  ],
  "list_ids": ["uuid-of-list"]
}
Response
{
  "total_submitted": 3,
  "created": 2,
  "duplicates_skipped": 1,
  "errors": 0
}

Lists

Organize contacts into targeted groups.

GET /lists Read Only

Returns all contact lists with pagination.

Response
{
  "items": [
    {
      "id": "uuid",
      "name": "Hot Leads",
      "description": "High priority contacts",
      "contact_count": 42,
      "created_at": "2026-01-10T08:00:00Z"
    }
  ],
  "total": 5
}
POST /lists Contacts Only

Creates a new contact list.

FieldTypeRequiredDescription
namestringYesList name
descriptionstringNoList description
GET /lists/{id} Read Only

Returns details for a single list.

PUT /lists/{id} Contacts Only

Updates a list's name or description.

DELETE /lists/{id} Contacts Only

Deletes a list. Contacts in the list are not deleted.

Campaigns

View and control your outreach campaigns.

GET /campaigns Read Only

Returns all campaigns.

Response
{
  "items": [
    {
      "id": "uuid",
      "name": "Spring Outreach",
      "status": "ACTIVE",
      "created_at": "2026-02-01T09:00:00Z"
    }
  ],
  "total": 3
}
GET /campaigns/{id} Read Only

Returns details for a single campaign.

POST /campaigns/{id}/start Campaigns Only

Starts a campaign. The campaign must be in a startable state.

POST /campaigns/{id}/stop Campaigns Only

Stops a running campaign.

Webhooks

Receive real-time event data pushed to your external systems.

EventDescription
appointment_scheduledFires when a call is scheduled. Includes contact name, phone, and time.
contact_opted_outFires when a contact opts out of receiving messages.
call_completedFires when a call attempt completes (connected, missed, or failed).
campaign_engagement_completedFires when the campaign finishes engaging a contact.

Webhook Setup

1Go to Integration > Outbound
2Click Create Webhook
3Enter a name, your endpoint URL, and select the event type
4Save. Arnis will start sending events to your URL.
5Use the Test button to send a sample payload and verify

Sent as POST requests with JSON body

Includes a signing secret for verification

Failed deliveries are logged in the app

Error Handling

API errors return standard HTTP status codes with a JSON body.

Error Response
{
  "detail": "Contact not found"
}
CodeMeaning
200Success
201Created
400Bad request (invalid data)
401Unauthorized (missing or invalid API key)
403Forbidden (insufficient scope)
404Resource not found
422Validation error (check request body)
429Rate limited
500Server error

Rate Limits

API requests are subject to rate limiting. If you exceed the limit, you will receive a 429 response. Wait and retry after a short delay.

cURL Examples

Quick-start examples you can run in your terminal.

List contacts
curl -H "X-API-Key: your_key_here" \
  https://company.arnis.ai/api/v1/contacts
Create a contact
curl -X POST \
  -H "X-API-Key: your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"phone_number": "(555) 123-4567", "first_name": "John"}' \
  https://company.arnis.ai/api/v1/contacts
Batch create contacts
curl -X POST \
  -H "X-API-Key: your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "contacts": [
      {"phone_number": "(555) 200-0001", "first_name": "Alice"},
      {"phone_number": "(555) 200-0002", "first_name": "Bob"}
    ],
    "list_ids": ["your-list-uuid"]
  }' \
  https://company.arnis.ai/api/v1/contacts/batch
Start a campaign
curl -X POST \
  -H "X-API-Key: your_key_here" \
  https://company.arnis.ai/api/v1/campaigns/your-campaign-uuid/start

Ready to integrate?

Connect Arnis to your existing tools and workflows. Our team is here to help you get set up.