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.
Connect
Section titled “Connect”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.
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.parseheaders={}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,jsonraw=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.
Example
Section titled “Example”Create a resource group, a Linux B1 plan and a function app on it, and read the app back:
RG="docs-azure-functions"RGID="/subscriptions/$SUB/resourceGroups/$RG"cat > resource-group.json <<'JSON'{"location":"eastus"}JSONarm PUT "$RGID" 2025-04-01 resource-group.jsoncat > appserviceplans-createorupdate.json <<JSON{ "location": "eastus", "sku": { "name": "B1", "tier": "Basic", "capacity": 1 }, "kind": "linux", "properties": { "reserved": true }}JSONarm PUT "$RGID/providers/Microsoft.Web/serverfarms/docs-plan" 2026-07-15 appserviceplans-createorupdate.jsoncat > 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" } }}JSONarm PUT "$RGID/providers/Microsoft.Web/sites/docs-function-app" 2026-07-15 webapps-createorupdate.jsonarm GET "$RGID/providers/Microsoft.Web/sites/docs-function-app" 2026-07-15Add 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:
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\"}; };" } }}JSONarm PUT "$RGID/providers/Microsoft.Web/sites/docs-function-app/functions/hello" 2026-07-15 webapps-createfunction.jsonarm GET "$RGID/providers/Microsoft.Web/sites/docs-function-app/functions/hello" 2026-07-15arm GET "$RGID/providers/Microsoft.Web/sites/docs-function-app/functions" 2026-07-15Creating the function answers 201. Reading it back answers 200 with the bindings and file as sent. 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:
arm DELETE "$RGID/providers/Microsoft.Web/sites/docs-function-app/functions/hello" 2026-07-15arm DELETE "$RGID/providers/Microsoft.Web/sites/docs-function-app" 2026-07-15arm DELETE "$RGID/providers/Microsoft.Web/serverfarms/docs-plan" 2026-07-15Deleting 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.
Supported features
Section titled “Supported features”- 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.jsfile are stored and read back unchanged.
Limitations
Section titled “Limitations”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 501DataPlaneNotEmulated, saying the resource is managed through Resource Manager. That’s the route the function’sinvoke_url_templatenames. 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.
API coverage
Section titled “API coverage”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
No operation matches .
Try part of a name, such as WebApps_CreateFunction, or .
| Operation | Status | Notes |
|---|---|---|
| Web | Implemented | Local 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 / 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. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Local observation: Deleting the function answered HTTP 204. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Known difference | Local observation: Vera 1.2.0-rc.3, 6 November 2026 — returned the stored bindings and index.js. A GET of / 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". |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Local observation: Answered HTTP 200, listing the function with its stored bindings and index.js. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source inspection: Local app, slot, function and deployment records; serving application code isn't established. |
| Web | Implemented | Source 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. |
| Web | Implemented | Source 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. |
| Web | Implemented | Source 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. |
| Web | Implemented | Source 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. |