Find an API

Search public APIs with auth details & Postman guides

← All APIs

Axis VAPIX / ACAP API

developer.axis.com · Security

Security Basic Auth Free & Open Physical Security Cameras Video Surveillance

Axis Communications device API — VAPIX for direct camera configuration, live streams, PTZ control, event subscriptions, and analytics. ACAP SDK for building apps that run on-camera. Used by Milestone, Genetec, and VMS integrators worldwide.

Authentication

Basic Auth HTTP Digest or Basic authentication using the camera's admin credentials. HTTPS strongly recommended.

Sample Requests

GET Get camera info

Get firmware version from an Axis camera.

http://YOUR_AXIS_CAMERA_IP/axis-cgi/param.cgi?action=list&group=Properties.Firmware

Hover any highlighted part to learn what it does

Headers — extra info sent with the request
Authorization Digest admin:PASSWORD
curl -X GET "http://YOUR_AXIS_CAMERA_IP/axis-cgi/param.cgi?action=list&group=Properties.Firmware" \
  -H "Authorization: Basic YOUR_BASE64_CREDENTIALS"
import requests
headers = {
    "Authorization": "Basic YOUR_BASE64_CREDENTIALS"
}
response = requests.get(
    "http://YOUR_AXIS_CAMERA_IP/axis-cgi/param.cgi?action=list&group=Properties.Firmware",
    headers=headers,
)
print(response.json())
const url = 'http://YOUR_AXIS_CAMERA_IP/axis-cgi/param.cgi?action=list&group=Properties.Firmware';

const response = await fetch(url, {
  headers: {
    'Authorization': 'Basic YOUR_BASE64_CREDENTIALS'
  },
}); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	targetURL := "http://YOUR_AXIS_CAMERA_IP/axis-cgi/param.cgi?action=list&group=Properties.Firmware"
	req, _ := http.NewRequest("GET", targetURL, nil)
	req.Header.Set("Authorization", "Basic YOUR_BASE64_CREDENTIALS")

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("http://YOUR_AXIS_CAMERA_IP/axis-cgi/param.cgi?action=list&group=Properties.Firmware")

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Basic YOUR_BASE64_CREDENTIALS"

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "http://YOUR_AXIS_CAMERA_IP/axis-cgi/param.cgi?action=list&group=Properties.Firmware";
$opts = ["http" => [
    "method" => "GET",
    "header" => implode("\r\n", [
        "Authorization: Basic YOUR_BASE64_CREDENTIALS"
    ]),
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET Live MJPEG stream

Access the live MJPEG video stream directly from the camera.

http://YOUR_AXIS_CAMERA_IP/axis-cgi/mjpg/video.mjpg

Hover any highlighted part to learn what it does

curl -X GET "http://YOUR_AXIS_CAMERA_IP/axis-cgi/mjpg/video.mjpg" \
  -H "Authorization: Basic YOUR_BASE64_CREDENTIALS"
import requests
headers = {
    "Authorization": "Basic YOUR_BASE64_CREDENTIALS"
}
response = requests.get(
    "http://YOUR_AXIS_CAMERA_IP/axis-cgi/mjpg/video.mjpg",
    headers=headers,
)
print(response.json())
const url = 'http://YOUR_AXIS_CAMERA_IP/axis-cgi/mjpg/video.mjpg';

const response = await fetch(url, {
  headers: {
    'Authorization': 'Basic YOUR_BASE64_CREDENTIALS'
  },
}); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	targetURL := "http://YOUR_AXIS_CAMERA_IP/axis-cgi/mjpg/video.mjpg"
	req, _ := http.NewRequest("GET", targetURL, nil)
	req.Header.Set("Authorization", "Basic YOUR_BASE64_CREDENTIALS")

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("http://YOUR_AXIS_CAMERA_IP/axis-cgi/mjpg/video.mjpg")

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Basic YOUR_BASE64_CREDENTIALS"

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "http://YOUR_AXIS_CAMERA_IP/axis-cgi/mjpg/video.mjpg";
$opts = ["http" => [
    "method" => "GET",
    "header" => implode("\r\n", [
        "Authorization: Basic YOUR_BASE64_CREDENTIALS"
    ]),
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET PTZ control

Move a PTZ camera 10° right and 5° up.

http://YOUR_AXIS_CAMERA_IP/axis-cgi/com/ptz.cgi?pan=10&tilt=5&zoom=0

Hover any highlighted part to learn what it does

curl -X GET "http://YOUR_AXIS_CAMERA_IP/axis-cgi/com/ptz.cgi?pan=10&tilt=5&zoom=0" \
  -H "Authorization: Basic YOUR_BASE64_CREDENTIALS"
import requests
headers = {
    "Authorization": "Basic YOUR_BASE64_CREDENTIALS"
}
response = requests.get(
    "http://YOUR_AXIS_CAMERA_IP/axis-cgi/com/ptz.cgi?pan=10&tilt=5&zoom=0",
    headers=headers,
)
print(response.json())
const url = 'http://YOUR_AXIS_CAMERA_IP/axis-cgi/com/ptz.cgi?pan=10&tilt=5&zoom=0';

const response = await fetch(url, {
  headers: {
    'Authorization': 'Basic YOUR_BASE64_CREDENTIALS'
  },
}); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	targetURL := "http://YOUR_AXIS_CAMERA_IP/axis-cgi/com/ptz.cgi?pan=10&tilt=5&zoom=0"
	req, _ := http.NewRequest("GET", targetURL, nil)
	req.Header.Set("Authorization", "Basic YOUR_BASE64_CREDENTIALS")

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("http://YOUR_AXIS_CAMERA_IP/axis-cgi/com/ptz.cgi?pan=10&tilt=5&zoom=0")

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Basic YOUR_BASE64_CREDENTIALS"

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "http://YOUR_AXIS_CAMERA_IP/axis-cgi/com/ptz.cgi?pan=10&tilt=5&zoom=0";
$opts = ["http" => [
    "method" => "GET",
    "header" => implode("\r\n", [
        "Authorization: Basic YOUR_BASE64_CREDENTIALS"
    ]),
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));

Postman Setup Guide

Get Postman ↗
  1. VAPIX runs directly on each Axis camera — no cloud account needed
  2. Replace YOUR_CAMERA_IP with the camera's IP address on your network
  3. Use HTTP Digest auth with admin credentials
  4. Full VAPIX documentation at developer.axis.com/vapix/
  5. For cloud/enterprise: use AXIS Camera Application Platform (ACAP) or AXIS Body Worn API

What can you build with Axis VAPIX / ACAP API?

Axis VAPIX / ACAP API is a Security API. Developers commonly use security APIs for:

  • adding multi-factor authentication to your app
  • validating identity documents and biometrics
  • monitoring for data breaches and leaked credentials
  • running background checks and fraud screening
  • scanning code and infrastructure for vulnerabilities

Basic authentication. Send your username and password (Base64-encoded) in the Authorization header. Always use HTTPS — Basic auth over plain HTTP exposes your credentials. Axis VAPIX / ACAP API is free to use, making it a low-risk choice to experiment with.

New to APIs? Read our beginner's guide · Learn about API keys · What is REST?

Open documentation ↗