The Vadalog API covers program analysis, bind annotation management, and direct evaluation of Vadalog programs against the workspace-aware engine. All paths are relative to the base URL and require authentication. All responses use the standard envelope.
These are the platform Vadalog endpoints — they are authenticated, workspace-aware, and route to the correct compute target for the authenticated user. For the raw low-level engine API (unauthenticated, direct engine calls), see Engine API.

Analyze a program

Inspect a Vadalog program’s predicate structure without executing it. Handles Vadalog, SQL, Cypher, and Python concept types.
POST /vadalog/analyze
ParameterInRequiredDefaultDescription
programbodyyesVadalog program source (or SQL/Python body depending on conceptType).
conceptTypebodyno"logic"One of logic (Vadalog), sql, cypher, or python.
conceptNamebodyno""Required when conceptType is sql, cypher, or python — used as the head predicate name.

Example

curl -X POST "$BASE_URL/vadalog/analyze" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "program": "@input(\"products\").\n@output(\"expensive\").\nexpensive(P, R) <- products(P, R), R > 100.",
    "conceptType": "logic"
  }'
{
  "status": "success",
  "message": "Analysis complete",
  "data": {
    "inputPredicates": ["products"],
    "headPredicates": ["expensive"]
  }
}

Parse binds

Parse @bind and @qbind annotations from a Vadalog program and separate the rule code from the datasource bindings.
POST /vadalog/parse-binds
ParameterInRequiredDefaultDescription
programbodyyesFull Vadalog source including any bind annotations.
outputPredicatebodyno""Additional predicate name to classify as output when partitioning binds.

Example

curl -X POST "$BASE_URL/vadalog/parse-binds" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "program": "@bind(\"products\",\"csv useHeaders=true\",\"/data\",\"products.csv\").\n@output(\"expensive\").\nexpensive(P, R) <- products(P, R), R > 100.",
    "outputPredicate": "expensive"
  }'
{
  "status": "success",
  "message": "Binds parsed",
  "data": {
    "code": "expensive(P, R) <- products(P, R), R > 100.",
    "binds": {
      "input": [
        {
          "predicate": "products",
          "annotation": "@bind(\"products\",\"csv useHeaders=true\",\"/data\",\"products.csv\")."
        }
      ],
      "output": []
    }
  }
}

Evaluate a program

The primary platform execution endpoint. Evaluate a Vadalog program with optional runtime parameters and compute target. The platform resolves the correct engine (local or remote compute) for the authenticated user.
POST /vadalog/evaluate
ParameterInRequiredDefaultDescription
programbodyyesVadalog program to evaluate.
paramsbodyno{}Runtime parameter values referenced in the program (e.g. { "threshold": 100 }).
computebodynoCompute target override. Resolved against the user’s active compute configuration when omitted.

Example

curl -X POST "$BASE_URL/vadalog/evaluate" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "program": "@input(\"products\").\n@output(\"expensive\").\nexpensive(P, R) <- products(P, R), R > ?threshold.",
    "params": { "threshold": 100 }
  }'
{
  "status": "success",
  "message": "Vadalog program evaluated successfully",
  "data": {
    // Evaluation payload returned by the engine.
    // Structure depends on the program's output predicates.
    "expensive": [["Widget A", 249], ["Widget B", 129]]
  }
}
For concept-level execution (with dependency chaining, result persistence, and progress tracking), use POST /concepts/{project_id}/run/{concept_name} instead. Use /vadalog/evaluate when you want to execute a program directly without a saved concept.

Build a bind

Rewrite an existing @bind or @qbind annotation for a new predicate name. When isOutput is true, the output target (CSV filename or query name) is also updated to match the new predicate.
POST /vadalog/build-bind
ParameterInRequiredDefaultDescription
bindAnnotationbodyyesThe full @bind(...) or @qbind(...) annotation string to rewrite.
predicateNamebodyyesNew predicate name to substitute into the annotation.
isOutputbodynofalseWhen true, also updates the output table or query name derived from predicateName.

Example

curl -X POST "$BASE_URL/vadalog/build-bind" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "bindAnnotation": "@bind(\"old_pred\",\"csv useHeaders=true\",\"/data\",\"old_pred.csv\").",
    "predicateName": "new_pred",
    "isOutput": true
  }'
{
  "status": "success",
  "message": "Bind annotation built",
  "data": {
    "annotation": "@bind(\"new_pred\",\"csv useHeaders=true\",\"/data\",\"new_pred.csv\")."
  }
}

Engine status

Return whether the Vadalog engine is idle or processing an evaluation. Use this to gate new submissions or display engine state in a UI.
GET /vadalog/status
No parameters.
curl "$BASE_URL/vadalog/status" \
  -H "Authorization: Bearer $TOKEN"
{
  "status": "success",
  "message": "Engine is ready",
  "data": {
    "status": "ready",      // "ready" | "busy"
    "timestamp": "2026-06-25T10:42:00.123456"
  }
}

Stop evaluation

Cancel the current evaluation. Issues a stop signal to both the Vadalog engine and any in-flight Python concept subprocess, so a single call covers both concept types.
GET /vadalog/stop
No parameters.
curl "$BASE_URL/vadalog/stop" \
  -H "Authorization: Bearer $TOKEN"
The response body is whatever the engine returns on acknowledgement of the stop request.
The /vadalog/spark-ui/* and /vadalog/actuator/* proxy endpoints exist for operational monitoring of the underlying engine (Spark job tracking, JVM metrics, log tailing). They are outside the scope of external integration and are not documented here.