List hygiene
Include country codes. Deduplicate on import. Use POST /api/contacts/{id}/whatsapp-check or bulk check before campaigns. Opt-in should reflect consent for outreach in your region.
API reference
Directory, Excel (.xlsx) import, CSV export, WhatsApp registration checks, tags, and contact groups for campaign audiences.
Creating or importing a contact with a connected session can store WhatsApp registration status. Groups live under /api/contact-groups and can be selected as campaign audiences.
Include country codes. Deduplicate on import. Use POST /api/contacts/{id}/whatsapp-check or bulk check before campaigns. Opt-in should reflect consent for outreach in your region.
/api/contactsPaginated list of contacts.
URL: https://api.actiwapi.com/api/contacts
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
page — Page numbersearch — Search by name or phonecurl -X GET "https://api.actiwapi.com/api/contacts" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contacts", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contacts", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
const data = await res.json();
console.log(data);import requests
response = requests.get(
"https://api.actiwapi.com/api/contacts",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contacts")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Get.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contacts");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->get("https://api.actiwapi.com/api/contacts");
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contacts";
var response = await client.GetAsync(url);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapGet("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.actiwapi.com/api/contacts");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.actiwapi.com/api/contacts", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contacts"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{
"success": true,
"data": [{ "id": "uuid", "phone": "919876543210", "name": "John Smith", "optIn": true }],
"pagination": { "page": 1, "total": 142 }
}/api/contactsAdd a single contact.
URL: https://api.actiwapi.com/api/contacts
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
{
"phone": "919876543210",
"name": "John Smith",
"email": "john@example.com",
"optIn": true
}curl -X POST "https://api.actiwapi.com/api/contacts" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"
-d '{ "phone": "919876543210", "name": "John Smith", "email": "john@example.com", "optIn": true}'async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contacts", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify({
"phone": "919876543210",
"name": "John Smith",
"email": "john@example.com",
"optIn": true
}),
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contacts", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify({
"phone": "919876543210",
"name": "John Smith",
"email": "john@example.com",
"optIn": true
}),
});
const data = await res.json();
console.log(data);import requests
response = requests.post(
"https://api.actiwapi.com/api/contacts",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
json={
"phone": "919876543210",
"name": "John Smith",
"email": "john@example.com",
"optIn": true
},
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contacts")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
request.body = "{ \"phone\": \"919876543210\", \"name\": \"John Smith\", \"email\": \"john@example.com\", \"optIn\": true}"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contacts");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_POSTFIELDS => '{ "phone": "919876543210", "name": "John Smith", "email": "john@example.com", "optIn": true}',
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->post("https://api.actiwapi.com/api/contacts", json_decode('{ "phone": "919876543210", "name": "John Smith", "email": "john@example.com", "optIn": true}', true));
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contacts";
var content = new StringContent("""
{ "phone": "919876543210", "name": "John Smith", "email": "john@example.com", "optIn": true}
""", Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapPost("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var content = new StringContent("""
{ "phone": "919876543210", "name": "John Smith", "email": "john@example.com", "optIn": true}
""", Encoding.UTF8, "application/json");
var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.actiwapi.com/api/contacts")
{
Content = content,
};
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{ "phone": "919876543210", "name": "John Smith", "email": "john@example.com", "optIn": true}`)
req, err := http.NewRequest("POST", "https://api.actiwapi.com/api/contacts", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contacts"))
.method("POST", HttpRequest.BodyPublishers.ofString("{ \"phone\": \"919876543210\", \"name\": \"John Smith\", \"email\": \"john@example.com\", \"optIn\": true}"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": { "id": "uuid", "phone": "919876543210" } }/api/contacts/importBulk import contacts from an Excel .xlsx file. Format the Phone column as Text so large numbers are preserved.
URL: https://api.actiwapi.com/api/contacts/import
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | If JSON |
Form field: file (.xlsx with phone, name columns)curl -X POST "https://api.actiwapi.com/api/contacts/import" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: Bearer {accessToken}"
-d 'Form field: file (.xlsx with phone, name columns)'async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contacts/import", {
method: "POST",
headers: {
"Content-Type": "multipart/form-data",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify(Form field: file (.xlsx with phone, name columns)),
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contacts/import", {
method: "POST",
headers: {
"Content-Type": "multipart/form-data",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify(Form field: file (.xlsx with phone, name columns)),
});
const data = await res.json();
console.log(data);import requests
response = requests.post(
"https://api.actiwapi.com/api/contacts/import",
headers={
"Content-Type": "multipart/form-data",
"Authorization": "Bearer {accessToken}",
},
json=Form field: file (.xlsx with phone, name columns),
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contacts/import")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "multipart/form-data"
request["Authorization"] = "Bearer {accessToken}"
request.body = "Form field: file (.xlsx with phone, name columns)"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contacts/import");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"Authorization: Bearer {accessToken}"
],
CURLOPT_POSTFIELDS => 'Form field: file (.xlsx with phone, name columns)',
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'multipart/form-data',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->post("https://api.actiwapi.com/api/contacts/import", json_decode('Form field: file (.xlsx with phone, name columns)', true));
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contacts/import";
var content = new StringContent("""
Form field: file (.xlsx with phone, name columns)
""", Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapPost("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var content = new StringContent("""
Form field: file (.xlsx with phone, name columns)
""", Encoding.UTF8, "application/json");
var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.actiwapi.com/api/contacts/import")
{
Content = content,
};
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`Form field: file (.xlsx with phone, name columns)`)
req, err := http.NewRequest("POST", "https://api.actiwapi.com/api/contacts/import", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "multipart/form-data")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contacts/import"))
.method("POST", HttpRequest.BodyPublishers.ofString("Form field: file (.xlsx with phone, name columns)"))
.header("Content-Type", "multipart/form-data")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": { "created": 48, "updated": 2, "skipped": 0 } }/api/contacts/exportDownload all contacts as CSV.
URL: https://api.actiwapi.com/api/contacts/export
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
curl -X GET "https://api.actiwapi.com/api/contacts/export" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contacts/export", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contacts/export", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
const data = await res.json();
console.log(data);import requests
response = requests.get(
"https://api.actiwapi.com/api/contacts/export",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contacts/export")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Get.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contacts/export");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->get("https://api.actiwapi.com/api/contacts/export");
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contacts/export";
var response = await client.GetAsync(url);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapGet("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.actiwapi.com/api/contacts/export");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.actiwapi.com/api/contacts/export", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contacts/export"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());(CSV file download)/api/contacts/{id}/whatsapp-checkRe-check WhatsApp registration for one saved contact.
URL: https://api.actiwapi.com/api/contacts/{id}/whatsapp-check
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
id — Contact UUIDcurl -X POST "https://api.actiwapi.com/api/contacts/{id}/whatsapp-check" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contacts/{id}/whatsapp-check", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contacts/{id}/whatsapp-check", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
const data = await res.json();
console.log(data);import requests
response = requests.post(
"https://api.actiwapi.com/api/contacts/{id}/whatsapp-check",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contacts/{id}/whatsapp-check")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contacts/{id}/whatsapp-check");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->get("https://api.actiwapi.com/api/contacts/{id}/whatsapp-check");
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contacts/{id}/whatsapp-check";
var response = await client.GetAsync(url);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapGet("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.actiwapi.com/api/contacts/{id}/whatsapp-check");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("POST", "https://api.actiwapi.com/api/contacts/{id}/whatsapp-check", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contacts/{id}/whatsapp-check"))
.method("POST", HttpRequest.BodyPublishers.noBody())
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": { "id": "uuid", "whatsappRegistered": true } }/api/contacts/whatsapp-check/bulkRe-check many saved contacts.
URL: https://api.actiwapi.com/api/contacts/whatsapp-check/bulk
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
{ "contactIds": ["uuid-1", "uuid-2"] }curl -X POST "https://api.actiwapi.com/api/contacts/whatsapp-check/bulk" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"
-d '{ "contactIds": ["uuid-1", "uuid-2"] }'async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contacts/whatsapp-check/bulk", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify({ "contactIds": ["uuid-1", "uuid-2"] }),
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contacts/whatsapp-check/bulk", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify({ "contactIds": ["uuid-1", "uuid-2"] }),
});
const data = await res.json();
console.log(data);import requests
response = requests.post(
"https://api.actiwapi.com/api/contacts/whatsapp-check/bulk",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
json={ "contactIds": ["uuid-1", "uuid-2"] },
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contacts/whatsapp-check/bulk")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
request.body = "{ \"contactIds\": [\"uuid-1\", \"uuid-2\"] }"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contacts/whatsapp-check/bulk");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_POSTFIELDS => '{ "contactIds": ["uuid-1", "uuid-2"] }',
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->post("https://api.actiwapi.com/api/contacts/whatsapp-check/bulk", json_decode('{ "contactIds": ["uuid-1", "uuid-2"] }', true));
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contacts/whatsapp-check/bulk";
var content = new StringContent("""
{ "contactIds": ["uuid-1", "uuid-2"] }
""", Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapPost("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var content = new StringContent("""
{ "contactIds": ["uuid-1", "uuid-2"] }
""", Encoding.UTF8, "application/json");
var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.actiwapi.com/api/contacts/whatsapp-check/bulk")
{
Content = content,
};
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{ "contactIds": ["uuid-1", "uuid-2"] }`)
req, err := http.NewRequest("POST", "https://api.actiwapi.com/api/contacts/whatsapp-check/bulk", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contacts/whatsapp-check/bulk"))
.method("POST", HttpRequest.BodyPublishers.ofString("{ \"contactIds\": [\"uuid-1\", \"uuid-2\"] }"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": { "checked": 2 } }/api/contacts/tagsDistinct tags used on contacts.
URL: https://api.actiwapi.com/api/contacts/tags
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
curl -X GET "https://api.actiwapi.com/api/contacts/tags" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contacts/tags", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contacts/tags", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
const data = await res.json();
console.log(data);import requests
response = requests.get(
"https://api.actiwapi.com/api/contacts/tags",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contacts/tags")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Get.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contacts/tags");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->get("https://api.actiwapi.com/api/contacts/tags");
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contacts/tags";
var response = await client.GetAsync(url);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapGet("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.actiwapi.com/api/contacts/tags");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.actiwapi.com/api/contacts/tags", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contacts/tags"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": ["vip", "lead"] }/api/contact-groupsGroups you can use as campaign audiences.
URL: https://api.actiwapi.com/api/contact-groups
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
curl -X GET "https://api.actiwapi.com/api/contact-groups" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contact-groups", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contact-groups", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
});
const data = await res.json();
console.log(data);import requests
response = requests.get(
"https://api.actiwapi.com/api/contact-groups",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contact-groups")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Get.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contact-groups");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->get("https://api.actiwapi.com/api/contact-groups");
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contact-groups";
var response = await client.GetAsync(url);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapGet("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.actiwapi.com/api/contact-groups");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.actiwapi.com/api/contact-groups", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contact-groups"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": [{ "id": "uuid", "name": "Newsletter" }] }/api/contact-groupsCreate an empty group, then add members.
URL: https://api.actiwapi.com/api/contact-groups
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
{ "name": "Newsletter", "description": "Monthly updates" }curl -X POST "https://api.actiwapi.com/api/contact-groups" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"
-d '{ "name": "Newsletter", "description": "Monthly updates" }'async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contact-groups", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify({ "name": "Newsletter", "description": "Monthly updates" }),
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contact-groups", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify({ "name": "Newsletter", "description": "Monthly updates" }),
});
const data = await res.json();
console.log(data);import requests
response = requests.post(
"https://api.actiwapi.com/api/contact-groups",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
json={ "name": "Newsletter", "description": "Monthly updates" },
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contact-groups")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
request.body = "{ \"name\": \"Newsletter\", \"description\": \"Monthly updates\" }"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contact-groups");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_POSTFIELDS => '{ "name": "Newsletter", "description": "Monthly updates" }',
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->post("https://api.actiwapi.com/api/contact-groups", json_decode('{ "name": "Newsletter", "description": "Monthly updates" }', true));
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contact-groups";
var content = new StringContent("""
{ "name": "Newsletter", "description": "Monthly updates" }
""", Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapPost("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var content = new StringContent("""
{ "name": "Newsletter", "description": "Monthly updates" }
""", Encoding.UTF8, "application/json");
var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.actiwapi.com/api/contact-groups")
{
Content = content,
};
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{ "name": "Newsletter", "description": "Monthly updates" }`)
req, err := http.NewRequest("POST", "https://api.actiwapi.com/api/contact-groups", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contact-groups"))
.method("POST", HttpRequest.BodyPublishers.ofString("{ \"name\": \"Newsletter\", \"description\": \"Monthly updates\" }"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": { "id": "uuid", "name": "Newsletter" } }/api/contact-groups/{id}/contactsAttach existing contacts to a group.
URL: https://api.actiwapi.com/api/contact-groups/{id}/contacts
Auth: JWT Bearer
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer {accessToken} | Yes |
| Content-Type | application/json | Yes* |
id — Group UUID{ "contactIds": ["uuid-1", "uuid-2"] }curl -X POST "https://api.actiwapi.com/api/contact-groups/{id}/contacts" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {accessToken}"
-d '{ "contactIds": ["uuid-1", "uuid-2"] }'async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/contact-groups/{id}/contacts", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify({ "contactIds": ["uuid-1", "uuid-2"] }),
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/contact-groups/{id}/contacts", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}"
},
body: JSON.stringify({ "contactIds": ["uuid-1", "uuid-2"] }),
});
const data = await res.json();
console.log(data);import requests
response = requests.post(
"https://api.actiwapi.com/api/contact-groups/{id}/contacts",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {accessToken}",
},
json={ "contactIds": ["uuid-1", "uuid-2"] },
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/contact-groups/{id}/contacts")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Post.new(uri)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {accessToken}"
request.body = "{ \"contactIds\": [\"uuid-1\", \"uuid-2\"] }"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/contact-groups/{id}/contacts");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {accessToken}"
],
CURLOPT_POSTFIELDS => '{ "contactIds": ["uuid-1", "uuid-2"] }',
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {accessToken}',
];
$response = Http::withHeaders($headers)->post("https://api.actiwapi.com/api/contact-groups/{id}/contacts", json_decode('{ "contactIds": ["uuid-1", "uuid-2"] }', true));
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
var url = "https://api.actiwapi.com/api/contact-groups/{id}/contacts";
var content = new StringContent("""
{ "contactIds": ["uuid-1", "uuid-2"] }
""", Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer {accessToken}");
});
var app = builder.Build();
app.MapPost("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var content = new StringContent("""
{ "contactIds": ["uuid-1", "uuid-2"] }
""", Encoding.UTF8, "application/json");
var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.actiwapi.com/api/contact-groups/{id}/contacts")
{
Content = content,
};
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{ "contactIds": ["uuid-1", "uuid-2"] }`)
req, err := http.NewRequest("POST", "https://api.actiwapi.com/api/contact-groups/{id}/contacts", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer {accessToken}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/contact-groups/{id}/contacts"))
.method("POST", HttpRequest.BodyPublishers.ofString("{ \"contactIds\": [\"uuid-1\", \"uuid-2\"] }"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {accessToken}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": { "added": 2 } }/api/external/contactsList contacts via API key.
URL: https://api.actiwapi.com/api/external/contacts
Auth: API Key
| Header | Value | Required |
|---|---|---|
| X-API-Key | {apiKey} | Yes |
| Content-Type | application/json | Yes* |
curl -X GET "https://api.actiwapi.com/api/external/contacts" \
-H "Content-Type: application/json" \
-H "X-API-Key: {apiKey}"async function callActiwapi() {
const res = await fetch("https://api.actiwapi.com/api/external/contacts", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-API-Key": "{apiKey}"
},
});
if (!res.ok) {
throw new Error(await res.text());
}
const data = await res.json();
console.log(data);
}
callActiwapi();import fetch from "node-fetch";
const res = await fetch("https://api.actiwapi.com/api/external/contacts", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-API-Key": "{apiKey}"
},
});
const data = await res.json();
console.log(data);import requests
response = requests.get(
"https://api.actiwapi.com/api/external/contacts",
headers={
"Content-Type": "application/json",
"X-API-Key": "{apiKey}",
},
)
print(response.json())require "net/http"
require "uri"
uri = URI("https://api.actiwapi.com/api/external/contacts")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
request = Net::HTTP::Get.new(uri)
request["Content-Type"] = "application/json"
request["X-API-Key"] = "{apiKey}"
response = http.request(request)
puts response.body$ch = curl_init("https://api.actiwapi.com/api/external/contacts");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: {apiKey}"
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;<?php
use Illuminate\Support\Facades\Http;
$headers = [
'Content-Type' => 'application/json',
'X-API-Key' => '{apiKey}',
];
$response = Http::withHeaders($headers)->get("https://api.actiwapi.com/api/external/contacts");
$response->throw();
$data = $response->json();
dump($data);using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("X-API-Key", "{apiKey}");
var url = "https://api.actiwapi.com/api/external/contacts";
var response = await client.GetAsync(url);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);// .NET 8 — IHttpClientFactory style
using System.Net.Http.Json;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Actiwapi", client =>
{
client.DefaultRequestHeaders.TryAddWithoutValidation("X-API-Key", "{apiKey}");
});
var app = builder.Build();
app.MapGet("/proxy", async (IHttpClientFactory factory) =>
{
var client = factory.CreateClient("Actiwapi");
var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.actiwapi.com/api/external/contacts");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return Results.Content(await response.Content.ReadAsStringAsync(), "application/json");
});
app.Run();package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.actiwapi.com/api/external/contacts", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", "{apiKey}")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, _ := io.ReadAll(res.Body)
fmt.Println(string(data))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.actiwapi.com/api/external/contacts"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.header("Content-Type", "application/json")
.header("X-API-Key", "{apiKey}")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());{ "success": true, "data": [{ "id": "uuid", "phone": "919876543210" }] }Failed requests return a JSON envelope with success: false and a human-readable message.
{
"success": false,
"message": "Validation failed",
"errors": {
"phone": "Valid phone number is required"
}
}| HTTP | Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR | Request body or query failed validation. |
| 401 | UNAUTHORIZED | Missing or invalid JWT / API key. |
| 403 | FORBIDDEN | Authenticated but lacking permission or entitlement. |
| 403 | SUBSCRIPTION_INACTIVE | Action not allowed on the current plan (including Free after trial). Upgrade or wait for entitlements. |
| 403 | LIMIT_EXCEEDED | Plan limit reached (sessions, messages, API requests, etc.). |
| 404 | NOT_FOUND | Resource does not exist or is not in your account. |
| 409 | CONFLICT | Duplicate resource or invalid state transition. |
| 429 | RATE_LIMITED | Too many requests; retry after backoff. |
| 500 | INTERNAL_ERROR | Unexpected server error. |
| 502 | WHATSAPP_UNAVAILABLE | WhatsApp session disconnected or provider error. |