Skip to content
Back to main site

Azure Functions

Store function apps and function definitions, with their bindings and code files, and read them back.

Plan: Free32 of 32 operations implemented across its API1Known difference

Function definitions and files are stored and read back, but don't run: a request to the HTTP-triggered function's route answers HTTP 501 DataPlaneNotEmulated.

Example checked on Vera 1.2.2, 8 November 2026. Each coverage note names its own evidence and date.

Start Vera as in Get started. Then open Bash in a terminal of its own (on macOS, whose terminal starts zsh, type bash first), go to an empty scratch directory and run this; it needs curl and Python 3. It fetches the emulator's own certificate, so every request checks TLS, and defines arm, which this page's commands use. The bearer token vera-local is a dummy local credential, not your license key.

Terminal window
export VERA_CA_CERT="$PWD/vera-ca.pem"
curl --fail --silent --show-error --noproxy '*' --insecure \
https://localhost:8543/_vera/ca.pem --output "$VERA_CA_CERT"
curl --fail --silent --show-error --noproxy '*' \
--cacert "$VERA_CA_CERT" https://localhost:8543/_vera/health; echo
export AZ_BASE='https://localhost:8543'
export SUB='00000000-0000-0000-0000-000000000001'
export TENANT='00000000-0000-0000-0000-0000000000a1'
export TOKEN='vera-local'
62 more lines: show the full setup
# arm METHOD /path API_VERSION [body.json]
# Prints the response body once any operation it started has finished, or,
# if that response had no body, the finished operation's response, such as
# a RunCommand result. A finished operation can hold a failed result: read it.
arm() (
set -eu
method=$1; path=$2; version=$3
work=$(mktemp -d)
trap 'rm -rf "$work"' EXIT
case "$path" in /*) ;; *) printf 'Expected a relative /path\n' >&2; exit 1;; esac
case "$AZ_BASE" in https://localhost:8543|https://127.0.0.1:8543) ;; *) printf 'This recipe requires the local emulator\n' >&2; exit 1;; esac
args=(--fail-with-body --silent --show-error --noproxy '*' --max-time 20
--cacert "$VERA_CA_CERT" -H "Authorization: Bearer $TOKEN"
-H 'Content-Type: application/json')
body=()
if [ "$#" -ge 4 ]; then body=(--data-binary "@$4"); fi
code=$(curl "${args[@]}" -X "$method" ${body[@]+"${body[@]}"} -D "$work/headers" \
-o "$work/body" -w '%{http_code}' "$AZ_BASE$path?api-version=$version") || {
cat "$work/body" >&2; exit 1;
}
poll_url=$(python3 - "$work/headers" "$AZ_BASE" <<'PY'
import sys,urllib.parse
headers={}
for line in open(sys.argv[1]):
if ':' in line:
key,value=line.split(':',1); headers[key.lower()]=value.strip()
url=headers.get('azure-asyncoperation') or headers.get('operation-location') or headers.get('location') or ''
if url:
url=urllib.parse.urljoin(sys.argv[2],url); p=urllib.parse.urlsplit(url)
if p.scheme!='https' or p.hostname not in ('localhost','127.0.0.1') or p.port!=8543:
raise SystemExit('Refusing a non-local operation URL')
print(url)
PY
) || exit 1
if [ -n "$poll_url" ] && [ "$method" != GET ] && [ "$method" != HEAD ]; then
done_ok=false
for attempt in $(seq 1 30); do
code=$(curl "${args[@]}" -D "$work/poll-headers" -o "$work/poll-body" -w '%{http_code}' "$poll_url") || {
cat "$work/poll-body" >&2; exit 1;
}
state=$(python3 - "$work/poll-body" "$code" <<'PY'
import sys,json
raw=open(sys.argv[1]).read(); code=int(sys.argv[2]); value=json.loads(raw) if raw.strip() else {}
status=str(value.get('status') or value.get('properties',{}).get('provisioningState') or '').lower()
if status in ('failed','canceled','cancelled') or value.get('error'):
print(raw,file=sys.stderr);raise SystemExit('Operation failed')
if status in ('succeeded','completed') or (not status and code in (200,204)):
print('done')
else: print('pending')
PY
) || exit 1
if [ "$state" = done ]; then done_ok=true; break; fi
sleep 1
done
if [ "$done_ok" != true ]; then printf 'Operation polling timed out\n' >&2; exit 1; fi
if [ -s "$work/poll-body" ] && ! grep -q '[^[:space:]]' "$work/body" 2>/dev/null; then
cp "$work/poll-body" "$work/body"
fi
fi
cat "$work/body"
printf '\n'
)

The health check answers {"cloud": "azure", "generation_status": "generated", "status": "ok"}. Requests go only to the emulator at https://localhost:8543: the helper refuses any other address, including the Azure-looking URLs some responses hold. When you've finished, close the terminal and delete the scratch directory; that removes only these local files, not what you created in the emulator.

The examples use the Microsoft.Web API at 2026-07-15, the version tested with Vera 1.2.2, and 2025-04-01 for the resource group. A function app is a web app with kind functionapp,linux, so its plan and the app itself are created, read and deleted with App Service’s operations, which its API coverage lists. This page’s coverage holds the operations on functions and the function host.

Create a resource group, a Linux B1 plan and a function app on it, and read the app back:

Terminal window
RG="docs-azure-functions"
RGID="/subscriptions/$SUB/resourceGroups/$RG"
cat > resource-group.json <<'JSON'
{"location":"eastus"}
JSON
arm PUT "$RGID" 2025-04-01 resource-group.json
cat > appserviceplans-createorupdate.json <<JSON
{
"location": "eastus",
"sku": {
"name": "B1",
"tier": "Basic",
"capacity": 1
},
"kind": "linux",
"properties": {
"reserved": true
}
}
JSON
arm PUT "$RGID/providers/Microsoft.Web/serverfarms/docs-plan" 2026-07-15 appserviceplans-createorupdate.json
cat > webapps-createorupdate.json <<JSON
{
"location": "eastus",
"kind": "functionapp,linux",
"properties": {
"serverFarmId": "$RGID/providers/Microsoft.Web/serverfarms/docs-plan",
"httpsOnly": true,
"siteConfig": {
"linuxFxVersion": "NODE|20-lts"
}
}
}
JSON
arm PUT "$RGID/providers/Microsoft.Web/sites/docs-function-app" 2026-07-15 webapps-createorupdate.json
arm GET "$RGID/providers/Microsoft.Web/sites/docs-function-app" 2026-07-15

Add a function named hello, with an HTTP trigger, an HTTP output binding and an index.js file, then read it back and list the app’s functions:

Terminal window
cat > webapps-createfunction.json <<JSON
{
"properties": {
"config": {
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get"
]
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
},
"files": {
"index.js": "module.exports = async function(context, req) { context.res = {body: \"vera-function-marker\"}; };"
}
}
}
JSON
arm PUT "$RGID/providers/Microsoft.Web/sites/docs-function-app/functions/hello" 2026-07-15 webapps-createfunction.json
arm GET "$RGID/providers/Microsoft.Web/sites/docs-function-app/functions/hello" 2026-07-15
arm GET "$RGID/providers/Microsoft.Web/sites/docs-function-app/functions" 2026-07-15

Creating the function answers 201. Reading it back answers 200 with the bindings and file as sent. Selected fields:

Output (selected fields)
{
"properties": {
"config": {
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["get"]
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
},
"files": {
"index.js": "module.exports = async function(context, req) { context.res = {body: \"vera-function-marker\"}; };"
}
}
}

The function also has an invoke_url_template, for the /api/hello route on the app’s local hostname. The function doesn’t run there: see Limitations.

To clean up, delete the function, then the app, then the plan:

Terminal window
arm DELETE "$RGID/providers/Microsoft.Web/sites/docs-function-app/functions/hello" 2026-07-15
arm DELETE "$RGID/providers/Microsoft.Web/sites/docs-function-app" 2026-07-15
arm DELETE "$RGID/providers/Microsoft.Web/serverfarms/docs-plan" 2026-07-15

Deleting the function answers 204, the app 200 and the plan 204. The resource group docs-azure-functions stays, since deleting a resource group fails in Vera 1.2.2; a fresh emulator starts without it.

  • Function apps: a Linux function app on a B1 plan, created, read and deleted with App Service’s operations.
  • Function definitions: create, read, list and delete a function. Its HTTP trigger and output bindings and its index.js file are stored and read back unchanged.

The main limits are below. A few more apply to every service, and the API coverage notes cover smaller differences.

  • Functions don’t run. Management operations work as shown, but the emulator doesn’t invoke the function. In Vera 1.2.0-rc.3, while the function existed, GET /api/hello, sent to the emulator with the app’s local hostname, <app>.azurewebsites.localhost:8543, answered HTTP 501 DataPlaneNotEmulated, saying the resource is managed through Resource Manager. That’s the route the function’s invoke_url_template names. No function response, trigger delivery, binding execution or execution log was established.
  • Not run as examples: deploying code, function keys and host keys, deployment slots and trigger sync. The API coverage marks these from a review of Vera 1.2.0’s source, with their limits in the notes. The Microsoft.Web deployment operations are on App Service’s coverage, and they record a deployment without fetching or running its code: see App Service’s limitations.

Every operation of the API on this page, from its pinned public definition, and whether Vera 1.2.0 implements it. Only the API surfaces in this release are listed, and each operation once. Implementation availability was reviewed against the Vera 1.2.0 source on 6 November 2026. Source inspection identifies a local implementation and its known limits; it doesn't mean every operation or API version was tested with a request. Each note names its evidence: a Local observation without a build or date is from Vera 1.2.0 preview, on 5 November 2026, and one from a later build, such as Vera 1.2.0-rc.3 or Vera 1.2.2, names that build and its date. No response was compared with Azure's. What the statuses mean

OperationStatusNotes
WebApps_CreateFunctionImplementedLocal observation: Vera 1.2.0-rc.3, 6 November 2026 — a function with an HTTP trigger binding, an HTTP output binding and an index.js file was created and read back with both. Invoking it with GET /api/hello on the app's .azurewebsites.localhost hostname answered HTTP 501 DataPlaneNotEmulated, so this stores the definition only. Earlier, in Vera 1.2.0 preview, the create answered HTTP 201 and the same invocation answered HTTP 404.
WebApps_CreateInstanceFunctionSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_CreateOrUpdateFunctionSecretImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_CreateOrUpdateFunctionSecretSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_CreateOrUpdateHostSecretImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_CreateOrUpdateHostSecretSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_DeleteFunctionImplementedLocal observation: Deleting the function answered HTTP 204.
WebApps_DeleteFunctionSecretImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_DeleteFunctionSecretSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_DeleteHostSecretImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_DeleteHostSecretSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_DeleteInstanceFunctionSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_GetFunctionKnown differenceLocal observation: Vera 1.2.0-rc.3, 6 November 2026 — returned the stored bindings and index.js. A GET of /api/hello sent to the emulator with the app's .azurewebsites.localhost hostname answered HTTP 501 DataPlaneNotEmulated, so the HTTP trigger didn't run through it. Earlier, in Vera 1.2.0 preview, the read also returned an invoke_url_template for that route, and the same request answered HTTP 404 ResourceNotFound, "No modeled operation matches this request".
WebApps_GetFunctionsAdminTokenImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_GetFunctionsAdminTokenSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_GetInstanceFunctionSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListFunctionKeysImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListFunctionKeysSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListFunctionSecretsImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListFunctionSecretsSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListFunctionsImplementedLocal observation: Answered HTTP 200, listing the function with its stored bindings and index.js.
WebApps_ListHostKeysImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListHostKeysSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListInstanceFunctionsSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListSyncFunctionTriggersImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListSyncFunctionTriggersSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListSyncStatusImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_ListSyncStatusSlotImplementedSource inspection: Local app, slot, function and deployment records; serving application code isn't established.
WebApps_SyncFunctionTriggersImplementedSource inspection: Runs as a local action; an external engine running it isn't established. Local app, slot, function and deployment records; serving application code isn't established.
WebApps_SyncFunctionTriggersSlotImplementedSource inspection: Runs as a local action; an external engine running it isn't established. Local app, slot, function and deployment records; serving application code isn't established.
WebApps_SyncFunctionsImplementedSource inspection: Runs as a local action; an external engine running it isn't established. Local app, slot, function and deployment records; serving application code isn't established.
WebApps_SyncFunctionsSlotImplementedSource inspection: Runs as a local action; an external engine running it isn't established. Local app, slot, function and deployment records; serving application code isn't established.