curl --request POST \
--url https://api.fastcac.com/v1/businesses/monitors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"number": "RC 7654321",
"external_id": "merchant-4471"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({number: 'RC 7654321', external_id: 'merchant-4471'})
};
fetch('https://api.fastcac.com/v1/businesses/monitors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.fastcac.com/v1/businesses/monitors"
payload = {
"number": "RC 7654321",
"external_id": "merchant-4471"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fastcac.com/v1/businesses/monitors"
payload := strings.NewReader("{\n \"number\": \"RC 7654321\",\n \"external_id\": \"merchant-4471\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fastcac.com/v1/businesses/monitors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'number' => 'RC 7654321',
'external_id' => 'merchant-4471'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"object": "business_monitor",
"id": "mon_5Rfxqm9UQ4xlFxXoJeFCaT",
"number": "7654321",
"type": "RC",
"type_label": "Company",
"name": "ADA FOODS LIMITED",
"status": "ACTIVE",
"active": true,
"external_id": "merchant-4471",
"state": "active",
"paid_through": "2026-11-27T15:16:04Z",
"last_checked_at": null,
"last_changed_at": null,
"amount_charged": "100.00",
"created_at": "2026-10-28T15:16:04Z"
}{
"error": {
"type": "invalid_request_error",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "authentication_error",
"code": "api_key_missing",
"message": "Send your API key as `Authorization: Bearer <key>`.",
"param": null,
"request_id": "req_8r9FEwNmLuxQORZX5Qhvkd0q"
}
}{
"error": {
"type": "payment_error",
"code": "insufficient_balance",
"message": "Your balance is ₦0.00; monitoring a business costs ₦100.00 for 30 days. Fund your wallet by bank transfer to your funding account, then try again.",
"param": null,
"request_id": "req_GV3JxZlBlquNBBSjEqFGHnag",
"details": {
"amount_due": "100.00",
"balance": "0.00",
"currency": "NGN",
"funding_account": {
"account_number": "0000000000",
"bank_name": "TEST BANK",
"account_name": "FastCAC - TEST MODE"
}
}
}
}{
"error": {
"type": "permission_error",
"code": "live_mode_unavailable",
"message": "Live registrations are paused right now. Use a test key (fc_test_…) meanwhile.",
"param": null,
"request_id": "req_Td9lI1vsT5ARzv0XD7RGS1tD"
}
}{
"error": {
"type": "not_found_error",
"code": "cac_record_missing",
"message": "CAC has no business with that number. You weren't charged.",
"param": "number",
"request_id": "req_Y68cfGTTJjBHCCRQaS2tDHhh"
}
}{
"error": {
"type": "invalid_request_error",
"code": "monitor_exists",
"message": "You already monitor RC 7654321.",
"param": "number",
"request_id": "req_pih9euyk6J6Ge0u2TkjaNeO8",
"details": {
"monitor": "mon_5Rfxqm9UQ4xlFxXoJeFCaT"
}
}
}{
"error": {
"type": "invalid_request_error",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}Monitor a business
Watches a business on CAC’s register. It’s read once a day, and a change in its status or name sends
business.status_changed or business.name_changed to your webhook endpoints. Charged from your wallet for
30 days at a time (see amount_charged); each renewal is charged when paid_through passes, and a renewal your
wallet can’t cover pauses the monitor (monitor.paused) until it can. Test monitors are never read from CAC:
change one with the test helper.
curl --request POST \
--url https://api.fastcac.com/v1/businesses/monitors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"number": "RC 7654321",
"external_id": "merchant-4471"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({number: 'RC 7654321', external_id: 'merchant-4471'})
};
fetch('https://api.fastcac.com/v1/businesses/monitors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.fastcac.com/v1/businesses/monitors"
payload = {
"number": "RC 7654321",
"external_id": "merchant-4471"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fastcac.com/v1/businesses/monitors"
payload := strings.NewReader("{\n \"number\": \"RC 7654321\",\n \"external_id\": \"merchant-4471\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fastcac.com/v1/businesses/monitors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'number' => 'RC 7654321',
'external_id' => 'merchant-4471'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"object": "business_monitor",
"id": "mon_5Rfxqm9UQ4xlFxXoJeFCaT",
"number": "7654321",
"type": "RC",
"type_label": "Company",
"name": "ADA FOODS LIMITED",
"status": "ACTIVE",
"active": true,
"external_id": "merchant-4471",
"state": "active",
"paid_through": "2026-11-27T15:16:04Z",
"last_checked_at": null,
"last_changed_at": null,
"amount_charged": "100.00",
"created_at": "2026-10-28T15:16:04Z"
}{
"error": {
"type": "invalid_request_error",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "authentication_error",
"code": "api_key_missing",
"message": "Send your API key as `Authorization: Bearer <key>`.",
"param": null,
"request_id": "req_8r9FEwNmLuxQORZX5Qhvkd0q"
}
}{
"error": {
"type": "payment_error",
"code": "insufficient_balance",
"message": "Your balance is ₦0.00; monitoring a business costs ₦100.00 for 30 days. Fund your wallet by bank transfer to your funding account, then try again.",
"param": null,
"request_id": "req_GV3JxZlBlquNBBSjEqFGHnag",
"details": {
"amount_due": "100.00",
"balance": "0.00",
"currency": "NGN",
"funding_account": {
"account_number": "0000000000",
"bank_name": "TEST BANK",
"account_name": "FastCAC - TEST MODE"
}
}
}
}{
"error": {
"type": "permission_error",
"code": "live_mode_unavailable",
"message": "Live registrations are paused right now. Use a test key (fc_test_…) meanwhile.",
"param": null,
"request_id": "req_Td9lI1vsT5ARzv0XD7RGS1tD"
}
}{
"error": {
"type": "not_found_error",
"code": "cac_record_missing",
"message": "CAC has no business with that number. You weren't charged.",
"param": "number",
"request_id": "req_Y68cfGTTJjBHCCRQaS2tDHhh"
}
}{
"error": {
"type": "invalid_request_error",
"code": "monitor_exists",
"message": "You already monitor RC 7654321.",
"param": "number",
"request_id": "req_pih9euyk6J6Ge0u2TkjaNeO8",
"details": {
"monitor": "mon_5Rfxqm9UQ4xlFxXoJeFCaT"
}
}
}{
"error": {
"type": "invalid_request_error",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}Authorizations
Your secret API key: fc_test_… in test mode, fc_live_… in live mode.
Query Parameters
Test keys only: cac_record_missing (404) or insufficient_balance (402). Ignored with a live key.
Body
The registration number, with or without its prefix: "8911267" or "RC 8911267".
The register. Needed only when the number is in more than one (type_required).
BN, RC, IT, LP, LLP Your own reference, sent back in every event.
255Response
Successful Response
mon_…
BN, RC, IT, LP, LLP The registered name at the last check.
CAC's status at the last check: ACTIVE, INACTIVE, STRUCK OFF and so on.
True when status is ACTIVE.
paused: a 30-day renewal couldn't be charged; it resumes once your wallet can pay. deleted: you stopped it.
active, paused, deleted When the current 30 days end; it renews then.
The last time CAC's register was read for it.
The last time its name or status changed.
"business_monitor"On create only: what the first 30 days cost.