Cisco Firewall APIs — FMC + ASA
FMC REST API (manages FTD)
Authentication
Generate auth token (valid 30 minutes, refresh up to 3 times)
FMC_TOKEN=$(curl -sk -X POST \
-H "Content-Type: application/json" \
-u "${FMC_USER}:${FMC_PASS}" \
"https://${FMC_HOST}/api/fmc_platform/v1/auth/generatetoken" \
-D - 2>/dev/null | awk '/X-auth-access-token/{print $2}' | tr -d '\r')
DOMAIN_UUID=$(curl -sk -X POST \
-H "Content-Type: application/json" \
-u "${FMC_USER}:${FMC_PASS}" \
"https://${FMC_HOST}/api/fmc_platform/v1/auth/generatetoken" \
-D - 2>/dev/null | awk '/DOMAIN_UUID/{print $2}' | tr -d '\r')
echo "Token: ${FMC_TOKEN:0:12}... Domain: ${DOMAIN_UUID:0:12}..."
FMC uses self-signed certs in most deployments — -k skips verification. The token comes back in the response header, not the body.
|
Device Inventory
List all managed devices
curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/devices/devicerecords" \
| jq '[.items[] | {name, type, model: .model, sw: .sw_version, healthStatus}]'
Access Policies
List all access control policies
curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/policy/accesspolicies" \
| jq '[.items[] | {name, id: .id[:12]}]'
Get rules from a specific policy
POLICY_ID="<policy-id>"
curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/policy/accesspolicies/${POLICY_ID}/accessrules?expanded=true&limit=100" \
| jq '[.items[] | {name, action, enabled, sourceNetworks: .sourceNetworks.literals, destinationNetworks: .destinationNetworks.literals}]'
Count rules per policy — audit scope sizing
curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/policy/accesspolicies" \
| jq -r '.items[] | .id' | while read pid; do
name=$(curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/policy/accesspolicies/${pid}" \
| jq -r '.name')
count=$(curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/policy/accesspolicies/${pid}/accessrules" \
| jq '.paging.count')
printf "%-40s %s rules\n" "$name" "$count"
done
Objects
List network objects
curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/object/networks?limit=200" \
| jq '[.items[] | {name, value, type}]'
List network groups
curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/object/networkgroups?expanded=true&limit=100" \
| jq '[.items[] | {name, objects: [.objects[]?.name], literals: [.literals[]?.value]}]'
NAT Policies
List NAT policies and rule counts
curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/policy/ftdnatpolicies" \
| jq '[.items[] | {name, id: .id[:12]}]'
Deployment
Check pending changes
curl -sk -H "X-auth-access-token: ${FMC_TOKEN}" \
"https://${FMC_HOST}/api/fmc_config/v1/domain/${DOMAIN_UUID}/deployment/deployabledevices" \
| jq '[.items[] | {name, canBeDeployed, upToDate: .upToDate}]'
ASA REST API (direct to device)
Authentication
Enable ASA REST API (if not already)
! On the ASA CLI: rest-api image disk0:/asa-restapi-*.lfbff rest-api agent
Test connectivity
curl -sk -u "${ASA_USER}:${ASA_PASS}" \
"https://${ASA_HOST}/api/monitoring/serialnumber" \
| jq '.serialNumber'
Configuration Export
Get running config via CLI API
curl -sk -X POST -u "${ASA_USER}:${ASA_PASS}" \
-H "Content-Type: application/json" \
-d '{"commands": ["show running-config"]}' \
"https://${ASA_HOST}/api/cli" \
| jq -r '.response[]'
Get specific config section
curl -sk -X POST -u "${ASA_USER}:${ASA_PASS}" \
-H "Content-Type: application/json" \
-d '{"commands": ["show running-config access-list"]}' \
"https://${ASA_HOST}/api/cli" \
| jq -r '.response[]'
VPN Sessions
List active AnyConnect sessions
curl -sk -X POST -u "${ASA_USER}:${ASA_PASS}" \
-H "Content-Type: application/json" \
-d '{"commands": ["show vpn-sessiondb anyconnect"]}' \
"https://${ASA_HOST}/api/cli" \
| jq -r '.response[]'
Count active sessions
curl -sk -X POST -u "${ASA_USER}:${ASA_PASS}" \
-H "Content-Type: application/json" \
-d '{"commands": ["show vpn-sessiondb summary"]}' \
"https://${ASA_HOST}/api/cli" \
| jq -r '.response[]'
Interfaces & Routing
List interfaces
curl -sk -u "${ASA_USER}:${ASA_PASS}" \
"https://${ASA_HOST}/api/interfaces/physical" \
| jq '[.items[] | {name: .hardwareID, nameif: .name, ip: .ipAddress, secLevel: .securityLevel}]'
Routing table
curl -sk -X POST -u "${ASA_USER}:${ASA_PASS}" \
-H "Content-Type: application/json" \
-d '{"commands": ["show route"]}' \
"https://${ASA_HOST}/api/cli" \
| jq -r '.response[]'
netapi Equivalents (planned)
# Future netapi commands (not yet implemented)
netapi cisco fmc devices # List managed FTD devices
netapi cisco fmc policies # Access control policies
netapi cisco fmc rules <policy> # Rules in a policy
netapi cisco fmc objects # Network/service objects
netapi cisco fmc deploy # Trigger deployment
netapi cisco asa vpn sessions # Active RA-VPN sessions
netapi cisco asa acl # Access list dump
netapi cisco asa config <section> # Config section export
Until netapi modules exist, use curl + jq patterns above. All copy-paste-runnable.