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

Open documentation ↗