MENU navbar-image

Introduction

Comprehensive API documentation for WhatsApp Marketing SaaS platform. Manage campaigns, contacts, bot flows, and WhatsApp integrations.

Welcome to WhatsApp Marketing SaaS API

This API provides a powerful set of tools for integrating WhatsApp marketing capabilities into your applications. With our API, you can:

Getting Started

Follow these steps to quickly integrate with our API:

Step 1: Create an Account

Before you can use the API, you need to:

  1. Register for an account at our website
  2. Verify your email address
  3. Set up your tenant subdomain
  4. Generate your API credentials from the dashboard

Step 2: Authentication

This API uses Bearer token authentication. You can obtain your token by making a POST request to the login endpoint:

curl -X POST https://prontus.cloud/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "your-email@example.com", "password": "your-password"}'

The response will include your access token:

{
  "access_token": "YOUR_ACCESS_TOKEN",
  "token_type": "Bearer",
  "expires_in": 3600
}

Include this token in all subsequent requests:

Authorization: Bearer YOUR_ACCESS_TOKEN

Step 3: Tenant Context

All API endpoints that handle tenant-specific data require a subdomain in the URL path:

https://prontus.cloud/api/v1/{your-subdomain}/contacts

Replace {your-subdomain} with your actual tenant subdomain.

Step 4: Making API Requests

Once authenticated, you can start making API calls. Here's an example of listing all contacts:

curl -X GET https://prontus.cloud/api/v1/your-subdomain/contacts \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json"

API Features

Important Notes

Authenticating requests

Authentication Process

The WhatsApp Marketing SaaS API uses JWT (JSON Web Tokens) for authentication. Follow these steps to authenticate your requests:

1. Obtain an Access Token

Make a POST request to the login endpoint with your credentials:

curl -X POST https://prontus.cloud/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "your-email@example.com", "password": "your-password"}'

2. Store the Token

The response will include your access token:

{
  "status": "success",
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
  "token_type": "Bearer",
  "expires_in": 3600
}

This token is valid for 1 hour (3600 seconds) by default.

3. Use the Token

Include the token in the Authorization header with all API requests:

Authorization: Bearer {YOUR_ACCESS_TOKEN}

Replace {YOUR_ACCESS_TOKEN} with the actual token you received.

Token Expiration & Refresh

When your token expires, you'll receive a 401 Unauthorized response. You can either:

  1. Generate a new token with the login endpoint
  2. Use the refresh token endpoint (if refresh tokens are enabled):
curl -X POST https://prontus.cloud/api/auth/refresh \
  -H "Authorization: Bearer {YOUR_EXPIRED_TOKEN}"

Security Best Practices

All authenticated endpoints in this documentation are marked with a requires authentication badge.

Contact Management

APIs for managing contacts within the tenant context

Create Contact

requires authentication

Create a new contact or lead in the system.

Example request:
curl --request POST \
    "https://prontus.cloud/api/v1/architecto/contacts" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"firstname\": \"John\",
    \"lastname\": \"Doe\",
    \"company\": \"Acme Corp\",
    \"type\": \"lead\",
    \"email\": \"john@example.com (must be unique)\",
    \"phone\": \"+911234567890 (must be unique)\",
    \"status_id\": 1,
    \"source_id\": 1,
    \"description\": \"Potential client from website\"
}"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/contacts"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "firstname": "John",
    "lastname": "Doe",
    "company": "Acme Corp",
    "type": "lead",
    "email": "john@example.com (must be unique)",
    "phone": "+911234567890 (must be unique)",
    "status_id": 1,
    "source_id": 1,
    "description": "Potential client from website"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/contacts';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'firstname' => 'John',
            'lastname' => 'Doe',
            'company' => 'Acme Corp',
            'type' => 'lead',
            'email' => 'john@example.com (must be unique)',
            'phone' => '+911234567890 (must be unique)',
            'status_id' => 1,
            'source_id' => 1,
            'description' => 'Potential client from website',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/contacts'
payload = {
    "firstname": "John",
    "lastname": "Doe",
    "company": "Acme Corp",
    "type": "lead",
    "email": "john@example.com (must be unique)",
    "phone": "+911234567890 (must be unique)",
    "status_id": 1,
    "source_id": 1,
    "description": "Potential client from website"
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, success):


{
    "status": "success",
    "message": "Contact created successfully",
    "data": {
        "id": 1,
        "firstname": "John",
        "lastname": "Doe",
        "email": "john@example.com",
        "created_at": "2024-02-08 10:00:00"
    }
}
 

Example response (422, validation error):


{
    "status": "error",
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email field must be a valid email address."
        ],
        "phone": [
            "The phone field is required."
        ]
    }
}
 

Request      

POST api/v1/{subdomain}/contacts

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Body Parameters

firstname   string   

The first name of the contact. Example: John

lastname   string   

The last name of the contact. Example: Doe

company   string  optional  

The company name. Example: Acme Corp

type   string   

The contact type (lead/customer). Example: lead

email   string  optional  

The contact's email address. Example: john@example.com (must be unique)

phone   string   

The contact's phone number. Example: +911234567890 (must be unique)

status_id   integer   

The status ID. Example: 1

source_id   integer   

The source ID. Example: 1

description   string  optional  

Any additional notes. Example: Potential client from website

List Contacts

requires authentication

Get a paginated list of contacts. You can filter by type and other parameters.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/contacts?type=lead&source_id=1&status_id=1&page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/contacts"
);

const params = {
    "type": "lead",
    "source_id": "1",
    "status_id": "1",
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/contacts';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'type' => 'lead',
            'source_id' => '1',
            'status_id' => '1',
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/contacts'
params = {
  'type': 'lead',
  'source_id': '1',
  'status_id': '1',
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": [
        {
            "id": 1,
            "firstname": "John",
            "lastname": "Doe",
            "company": "Demo Company",
            "type": "lead",
            "email": "john@example.com",
            "phone": "+1234567890",
            "created_at": "2024-02-08 10:00:00",
            "updated_at": "2024-02-08 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "total": 100,
        "per_page": 15
    }
}
 

Example response (401, unauthenticated):


{
    "status": "error",
    "message": "Invalid API token"
}
 

Request      

GET api/v1/{subdomain}/contacts

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Query Parameters

type   string  optional  

Filter by contact type (lead/customer). Example: lead

source_id   integer  optional  

Filter by source ID. Example: 1

status_id   integer  optional  

Filter by status ID. Example: 1

page   integer  optional  

The page number. Example: 1

per_page   integer  optional  

Number of items per page. Example: 15

Get Contact Details

requires authentication

Get detailed information about a specific contact.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/contacts/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/contacts/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/contacts/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/contacts/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": {
        "id": 1,
        "firstname": "John",
        "lastname": "Doe",
        "company": "Demo Company",
        "type": "lead",
        "email": "john@example.com",
        "phone": "+1234567890",
        "created_at": "2024-02-08 10:00:00",
        "updated_at": "2024-02-08 10:00:00"
    }
}
 

Example response (404, not found):


{
    "status": "error",
    "message": "Contact not found"
}
 

Request      

GET api/v1/{subdomain}/contacts/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the contact. Example: 1

Update Contact

requires authentication

Update an existing contact's information.

Example request:
curl --request PUT \
    "https://prontus.cloud/api/v1/architecto/contacts/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"firstname\": \"John\",
    \"lastname\": \"Doe\",
    \"company\": \"Acme Corp\",
    \"type\": \"lead\",
    \"email\": \"john@example.com (must be unique)\",
    \"phone\": \"+911234567890 (must be unique)\",
    \"status_id\": 1,
    \"source_id\": 1,
    \"description\": \"Potential client from website\"
}"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/contacts/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "firstname": "John",
    "lastname": "Doe",
    "company": "Acme Corp",
    "type": "lead",
    "email": "john@example.com (must be unique)",
    "phone": "+911234567890 (must be unique)",
    "status_id": 1,
    "source_id": 1,
    "description": "Potential client from website"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/contacts/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'firstname' => 'John',
            'lastname' => 'Doe',
            'company' => 'Acme Corp',
            'type' => 'lead',
            'email' => 'john@example.com (must be unique)',
            'phone' => '+911234567890 (must be unique)',
            'status_id' => 1,
            'source_id' => 1,
            'description' => 'Potential client from website',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/contacts/1'
payload = {
    "firstname": "John",
    "lastname": "Doe",
    "company": "Acme Corp",
    "type": "lead",
    "email": "john@example.com (must be unique)",
    "phone": "+911234567890 (must be unique)",
    "status_id": 1,
    "source_id": 1,
    "description": "Potential client from website"
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, success):


{
    "status": "success",
    "message": "Contact updated successfully",
    "data": {
        "id": 1,
        "firstname": "John",
        "lastname": "Doe",
        "email": "john@example.com",
        "updated_at": "2024-02-08 11:00:00"
    }
}
 

Request      

PUT api/v1/{subdomain}/contacts/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the contact. Example: 1

Body Parameters

firstname   string   

The first name of the contact. Example: John

lastname   string   

The last name of the contact. Example: Doe

company   string  optional  

The company name. Example: Acme Corp

type   string   

The contact type (lead/customer). Example: lead

email   string  optional  

The contact's email address. Example: john@example.com (must be unique)

phone   string   

The contact's phone number. Example: +911234567890 (must be unique)

status_id   integer   

The status ID. Example: 1

source_id   integer   

The source ID. Example: 1

description   string  optional  

Any additional notes. Example: Potential client from website

Delete Contact

requires authentication

Remove a contact from the system.

Example request:
curl --request DELETE \
    "https://prontus.cloud/api/v1/architecto/contacts/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/contacts/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/contacts/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/contacts/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "message": "Contact deleted successfully"
}
 

Example response (404):


{
    "status": "error",
    "message": "Contact not found"
}
 

Request      

DELETE api/v1/{subdomain}/contacts/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the contact. Example: 1

Status Management

APIs for managing contact statuses within the tenant context

Create Status

requires authentication

Create a new status in the system.

Example request:
curl --request POST \
    "https://prontus.cloud/api/v1/architecto/statuses" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Pending\",
    \"color\": \"#FF0000\",
    \"isdefault\": false
}"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/statuses"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Pending",
    "color": "#FF0000",
    "isdefault": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/statuses';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Pending',
            'color' => '#FF0000',
            'isdefault' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/statuses'
payload = {
    "name": "Pending",
    "color": "#FF0000",
    "isdefault": false
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, success):


{
    "status": "success",
    "message": "Status created successfully",
    "data": {
        "id": 1,
        "name": "Pending",
        "color": "#FF0000",
        "isdefault": false,
        "created_at": "2024-02-08 10:00:00"
    }
}
 

Example response (422, validation error):


{
    "status": "error",
    "message": "Validation failed",
    "errors": {
        "name": [
            "The name field is required."
        ]
    }
}
 

Request      

POST api/v1/{subdomain}/statuses

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Body Parameters

name   string   

The name of the status. Example: Pending

color   string  optional  

The color code for the status. Example: #FF0000

isdefault   boolean  optional  

Whether this is the default status. Example: false

List Statuses

requires authentication

Get a list of statuses with optional pagination.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/statuses?page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/statuses"
);

const params = {
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/statuses';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/statuses'
params = {
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": [
        {
            "id": 1,
            "name": "Active",
            "color": "#00FF00",
            "isdefault": true,
            "created_at": "2024-02-08 10:00:00",
            "updated_at": "2024-02-08 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "total": 10,
        "per_page": 15
    }
}
 

Example response (401, unauthenticated):


{
    "status": "error",
    "message": "Invalid API token"
}
 

Request      

GET api/v1/{subdomain}/statuses

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Query Parameters

page   integer  optional  

The page number. Example: 1

per_page   integer  optional  

Number of items per page. Example: 15

Get Status Details

requires authentication

Get detailed information about a specific status.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/statuses/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/statuses/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/statuses/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/statuses/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": {
        "id": 1,
        "name": "Active",
        "color": "#00FF00",
        "isdefault": true,
        "created_at": "2024-02-08 10:00:00",
        "updated_at": "2024-02-08 10:00:00"
    }
}
 

Example response (404, not found):


{
    "status": "error",
    "message": "Status not found"
}
 

Request      

GET api/v1/{subdomain}/statuses/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the status. Example: 1

Update Status

requires authentication

Update an existing status's information.

Example request:
curl --request PUT \
    "https://prontus.cloud/api/v1/architecto/statuses/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"In Progress\",
    \"color\": \"#0000FF\",
    \"isdefault\": true
}"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/statuses/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "In Progress",
    "color": "#0000FF",
    "isdefault": true
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/statuses/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'In Progress',
            'color' => '#0000FF',
            'isdefault' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/statuses/1'
payload = {
    "name": "In Progress",
    "color": "#0000FF",
    "isdefault": true
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, success):


{
    "status": "success",
    "message": "Status updated successfully",
    "data": {
        "id": 1,
        "name": "In Progress",
        "color": "#0000FF",
        "updated_at": "2024-02-08 11:00:00"
    }
}
 

Request      

PUT api/v1/{subdomain}/statuses/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the status. Example: 1

Body Parameters

name   string  optional  

The name of the status. Example: In Progress

color   string  optional  

The color code for the status. Example: #0000FF

isdefault   boolean  optional  

Whether this is the default status. Example: true

Delete Status

requires authentication

Remove a status from the system.

Example request:
curl --request DELETE \
    "https://prontus.cloud/api/v1/architecto/statuses/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/statuses/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/statuses/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/statuses/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (400):


{
    "status": "error",
    "message": "Cannot delete the default status"
}
 

Example response (404, success):


{
  "status": "success",
  "message": "Status deleted successfully"
}
* @response {
  "status": "error",
  "message": "Status not found"
}
 

Request      

DELETE api/v1/{subdomain}/statuses/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the status. Example: 1

Source Management

APIs for managing contact sources within the tenant context

Create Source

requires authentication

Create a new source in the system.

Example request:
curl --request POST \
    "https://prontus.cloud/api/v1/architecto/sources" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Referral\"
}"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/sources"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Referral"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/sources';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Referral',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/sources'
payload = {
    "name": "Referral"
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, success):


{
    "status": "success",
    "message": "Source created successfully",
    "data": {
        "id": 1,
        "name": "Referral",
        "created_at": "2024-02-08 10:00:00"
    }
}
 

Example response (422, validation error):


{
    "status": "error",
    "message": "Validation failed",
    "errors": {
        "name": [
            "The name field is required."
        ]
    }
}
 

Request      

POST api/v1/{subdomain}/sources

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Body Parameters

name   string   

The name of the source. Example: Referral

List Sources

requires authentication

Get a list of sources with optional pagination.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/sources?page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/sources"
);

const params = {
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/sources';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/sources'
params = {
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": [
        {
            "id": 1,
            "name": "Website",
            "created_at": "2024-02-08 10:00:00",
            "updated_at": "2024-02-08 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "total": 10,
        "per_page": 15
    }
}
 

Example response (401, unauthenticated):


{
    "status": "error",
    "message": "Invalid API token"
}
 

Request      

GET api/v1/{subdomain}/sources

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Query Parameters

page   integer  optional  

The page number. Example: 1

per_page   integer  optional  

Number of items per page. Example: 15

Get Source Details

requires authentication

Get detailed information about a specific source.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/sources/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/sources/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/sources/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/sources/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": {
        "id": 1,
        "name": "Website",
        "created_at": "2024-02-08 10:00:00",
        "updated_at": "2024-02-08 10:00:00"
    }
}
 

Example response (404, not found):


{
    "status": "error",
    "message": "Source not found"
}
 

Request      

GET api/v1/{subdomain}/sources/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the source. Example: 1

Update Source

requires authentication

Update an existing source's information.

Example request:
curl --request PUT \
    "https://prontus.cloud/api/v1/architecto/sources/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Referral Program\"
}"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/sources/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Referral Program"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/sources/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Referral Program',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/sources/1'
payload = {
    "name": "Referral Program"
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, success):


{
    "status": "success",
    "message": "Source updated successfully",
    "data": {
        "id": 1,
        "name": "Referral Program",
        "updated_at": "2024-02-08 11:00:00"
    }
}
 

Request      

PUT api/v1/{subdomain}/sources/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the source. Example: 1

Body Parameters

name   string   

The name of the source. Example: Referral Program

Delete Source

requires authentication

Remove a source from the system.

Example request:
curl --request DELETE \
    "https://prontus.cloud/api/v1/architecto/sources/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/sources/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/sources/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/sources/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "message": "Source deleted successfully"
}
 

Example response (404):


{
    "status": "error",
    "message": "Source not found"
}
 

Request      

DELETE api/v1/{subdomain}/sources/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the source. Example: 1

Group Management

APIs for managing contact groups within the tenant context

List Groups

requires authentication

Get a list of Groups with optional pagination.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/groups?page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/groups"
);

const params = {
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/groups';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/groups'
params = {
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": [
        {
            "id": 19,
            "tenant_id": 13,
            "name": "group2",
            "created_at": "2025-07-14T06:53:01.000000Z",
            "updated_at": "2025-07-14T06:53:01.000000Z"
        }
    ]
}
 

Example response (401, unauthenticated):


{
    "status": "error",
    "message": "Invalid API token"
}
 

Request      

GET api/v1/{subdomain}/groups

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Query Parameters

page   integer  optional  

The page number. Example: 1

per_page   integer  optional  

Number of items per page. Example: 15

Get Groups Details

requires authentication

Get detailed information about a specific Groups.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/groups/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/groups/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/groups/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/groups/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": {
        "id": 19,
        "tenant_id": 13,
        "name": "group2",
        "created_at": "2025-07-14T06:53:01.000000Z",
        "updated_at": "2025-07-14T06:53:01.000000Z"
    }
}
 

Example response (404, not found):


{
    "status": "error",
    "message": "Groups not found"
}
 

Request      

GET api/v1/{subdomain}/groups/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the Groups. Example: 1

Template Management

APIs for managing WhatsApp templates within the tenant context

List Templates

requires authentication

Get a list of Templates with optional pagination.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/templates?page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/templates"
);

const params = {
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/templates';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/templates'
params = {
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": [
        {
            "id": 1,
            "tenant_id": 2,
            "template_id": 510070465356446,
            "template_name": "welcome_to_prontuscloud",
            "language": "en",
            "status": "APPROVED",
            "category": "MARKETING",
            "header_data_format": "IMAGE",
            "header_data_text": null,
            "header_params_count": 0,
            "body_data": "Welcome to ProntusCloud - WhatsApp Marketing, Bot & Chat Module for Perfex CRM Support! 😊\n\nYou can explore and interact with our module in multiple ways:\n\n1️⃣ *Buy Module*: If you want to purchase the module 🛒.\n\n3️⃣ *Explore All Features*: To read detailed documentation and explore all features, on our online documentation 📚.",
            "body_params_count": 0,
            "footer_data": null,
            "footer_params_count": 0,
            "buttons_data": "[{\"type\":\"URL\",\"text\":\"Buy Module\",\"url\":\"https:\\/\\/codecanyon.net\\/item\\/whatsbot-whatsapp-marketing-bot-chat-module-for-perfex-crm\\/53052338\"},{\"type\":\"URL\",\"text\":\"Watch youtube Demo\",\"url\":\"https:\\/\\/youtu.be\\/tihN9GyXuzI\"},{\"type\":\"QUICK_REPLY\",\"text\":\"more\"}]",
            "created_at": "2025-07-12T10:44:50.000000Z",
            "updated_at": "2025-07-12T10:44:50.000000Z"
        }
    ]
}
 

Example response (401, unauthenticated):


{
    "status": "error",
    "message": "Invalid API token"
}
 

Request      

GET api/v1/{subdomain}/templates

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Query Parameters

page   integer  optional  

The page number. Example: 1

per_page   integer  optional  

Number of items per page. Example: 15

Get Templates Details

requires authentication

Get detailed information about a specific Templates.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/templates/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/templates/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/templates/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/templates/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": {
        "id": 1,
        "tenant_id": 2,
        "template_id": 510070465356446,
        "template_name": "welcome_to_whatsbot",
        "language": "en",
        "status": "APPROVED",
        "category": "MARKETING",
        "header_data_format": "IMAGE",
        "header_data_text": null,
        "header_params_count": 0,
        "body_data": "Welcome to WhatsBot - WhatsApp Marketing, Bot & Chat Module for Perfex CRM Support! 😊\n\nYou can explore and interact with our module in multiple ways:\n\n1️⃣ *Buy Module*: If you want to purchase the module 🛒.\n\n3️⃣ *Explore All Features*: To read detailed documentation and explore all features, on our online documentation 📚.",
        "body_params_count": 0,
        "footer_data": null,
        "footer_params_count": 0,
        "buttons_data": "[{\"type\":\"URL\",\"text\":\"Buy Module\",\"url\":\"https:\\/\\/codecanyon.net\\/item\\/whatsbot-whatsapp-marketing-bot-chat-module-for-perfex-crm\\/53052338\"},{\"type\":\"URL\",\"text\":\"Watch youtube Demo\",\"url\":\"https:\\/\\/youtu.be\\/tihN9GyXuzI\"},{\"type\":\"QUICK_REPLY\",\"text\":\"more\"}]",
        "created_at": "2025-07-12T10:44:50.000000Z",
        "updated_at": "2025-07-12T10:44:50.000000Z"
    }
}
 

Example response (404, not found):


{
    "status": "error",
    "message": "Template not found"
}
 

Request      

GET api/v1/{subdomain}/templates/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the Templates. Example: 1

Template Bot Management

APIs for managing WhatsApp template bots within the tenant context

List TemplateBot

requires authentication

Get a list of TemplateBot with optional pagination.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/templatebots?page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/templatebots"
);

const params = {
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/templatebots';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/templatebots'
params = {
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": [
        {
            "id": 1,
            "tenant_id": 2,
            "name": "tbot1",
            "rel_type": "lead",
            "template_id": 510070465356446,
            "header_params": "[]",
            "body_params": "[]",
            "footer_params": "[]",
            "filename": "tenant/2/template-bot/CTzitrN1GbYUu6qbbaMElkOlv3qTaZTXPVyNXDAM.png",
            "trigger": "heloo",
            "reply_type": 1,
            "is_bot_active": 1,
            "created_at": "2025-07-12T11:16:01.000000Z",
            "updated_at": "2025-07-12T11:16:01.000000Z",
            "sending_count": 0
        }
    ],
    "meta": {
        "current_page": 1,
        "total": 10,
        "per_page": 15
    }
}
 

Example response (401, unauthenticated):


{
    "status": "error",
    "message": "Invalid API token"
}
 

Request      

GET api/v1/{subdomain}/templatebots

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Query Parameters

page   integer  optional  

The page number. Example: 1

per_page   integer  optional  

Number of items per page. Example: 15

Get TemplateBot Details

requires authentication

Get detailed information about a specific TemplateBot.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/templatebots/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/templatebots/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/templatebots/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/templatebots/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": {
        "id": 1,
        "tenant_id": 2,
        "name": "tbot1",
        "rel_type": "lead",
        "template_id": 510070465356446,
        "header_params": "[]",
        "body_params": "[]",
        "footer_params": "[]",
        "filename": "tenant/2/template-bot/CTzitrN1GbYUu6qbbaMElkOlv3qTaZTXPVyNXDAM.png",
        "trigger": "heloo",
        "reply_type": 1,
        "is_bot_active": 1,
        "created_at": "2025-07-12T11:16:01.000000Z",
        "updated_at": "2025-07-12T11:16:01.000000Z",
        "sending_count": 0
    }
}
 

Example response (404, not found):


{
    "status": "error",
    "message": "Template bot not found"
}
 

Request      

GET api/v1/{subdomain}/templatebots/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the TemplateBot. Example: 1

Message Bot Management

APIs for managing WhatsApp message bots within the tenant context

List Messagebots

requires authentication

Get a list of Messagebots

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/messagebots?page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/messagebots"
);

const params = {
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/messagebots';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/messagebots'
params = {
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": [
        {
            "id": 3,
            "tenant_id": 2,
            "name": "mbot3",
            "rel_type": "lead",
            "reply_text": "hello from reply text",
            "reply_type": 1,
            "trigger": "mbot3",
            "bot_header": null,
            "bot_footer": null,
            "button1": null,
            "button1_id": null,
            "button2": null,
            "button2_id": null,
            "button3": null,
            "button3_id": null,
            "button_name": null,
            "button_url": null,
            "addedfrom": 1,
            "is_bot_active": true,
            "sending_count": 0,
            "filename": null,
            "created_at": "2025-07-12T12:18:33.000000Z",
            "updated_at": "2025-07-12T12:18:33.000000Z"
        }
    ],
    "meta": {
        "current_page": 1,
        "total": 10,
        "per_page": 15
    }
}
 

Example response (401, unauthenticated):


{
    "status": "error",
    "message": "Invalid API token"
}
 

Request      

GET api/v1/{subdomain}/messagebots

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

Query Parameters

page   integer  optional  

The page number. Example: 1

per_page   integer  optional  

Number of items per page. Example: 15

Get Messagebots Details

requires authentication

Get detailed information about a specific Messagebots.

Example request:
curl --request GET \
    --get "https://prontus.cloud/api/v1/architecto/messagebots/1" \
    --header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://prontus.cloud/api/v1/architecto/messagebots/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://prontus.cloud/api/v1/architecto/messagebots/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_ACCESS_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://prontus.cloud/api/v1/architecto/messagebots/1'
headers = {
  'Authorization': 'Bearer {YOUR_ACCESS_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, success):


{
    "status": "success",
    "data": {
        "id": 1,
        "tenant_id": 2,
        "name": "messagebot 1",
        "rel_type": "lead",
        "reply_text": "hello from message bot testing",
        "reply_type": 1,
        "trigger": "hello",
        "bot_header": null,
        "bot_footer": null,
        "button1": null,
        "button1_id": null,
        "button2": null,
        "button2_id": null,
        "button3": null,
        "button3_id": null,
        "button_name": null,
        "button_url": null,
        "addedfrom": 2,
        "is_bot_active": true,
        "sending_count": 0,
        "filename": null,
        "created_at": "2025-07-12T11:44:58.000000Z",
        "updated_at": "2025-07-12T11:44:58.000000Z"
    }
}
 

Example response (404, not found):


{
    "status": "error",
    "message": "Message bot not found"
}
 

Request      

GET api/v1/{subdomain}/messagebots/{id}

Headers

Authorization      

Example: Bearer {YOUR_ACCESS_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

subdomain   string   

Example: architecto

id   integer   

The ID of the status. Example: 1