JSON Protocol
This page summarizes the main HTTP payload shapes currently used by the web UI.
Read this page when you want exact backend payload shapes. If you want to understand why those payloads look this way, read Architecture / Pipeline first.
Common Types
Node
{
"id": "method:...",
"kind": "method",
"label": "foo",
"fqname": "MyPkg.foo",
"location": {"file": "src/a.jl", "line": 42, "column": 1},
"metadata": {"external": true, "external_group": "external_package"}
}
metadata.external_group is optional for external method nodes:
base_stdlibexternal_package
Other useful optional metadata fields include:
virtualsyntheticoverload_style
Edge
{
"id": "edge:...",
"kind": "call_possible",
"source": "method:...",
"target": "method:...",
"confidence": "possible",
"evidence": {
"kinds": ["call_possible"],
"engine": "da_source",
"file": "src/a.jl",
"line": 55
}
}
evidence contract:
evidence.kindsis required for every edge.evidence.kindsis an array of edge-kind strings.evidence.kindsalways includes the current top-levelkind.- Aggregated edges may include multiple values in
evidence.kinds. evidence.engine = "da_source"refers to the DepAtlasSource engine id.
confidence enum:
exactinferredpossibledynamic
confidence should be interpreted as evidence class, not certainty.
Endpoints
POST /api/v1/tasks
{
"analysis_path": "/abs/path/project",
"refresh_mode": "full"
}
This endpoint creates a new analysis task.
The normal product request flow only needs analysis_path and refresh_mode. JET runs use the dedicated JET-view endpoints below.
POST /api/v1/snapshots/{snapshot_id}/jet-views
Create or reuse a cached pure-JET graph view for a selected method node.
{
"method_node_id": "method:abc123",
"overload_site": {"file": "src/MyPkg.jl", "line": 42}
}
GET /api/v1/snapshots/{snapshot_id}/jet-views/{jet_view_id}
Fetch the status or completed result of a cached JET view.
POST /api/v1/snapshots/{snapshot_id}/inference/query
Run a query-time semantic refinement provider against an existing snapshot. The default provider is source_static, which only reads existing snapshot edge evidence.
{
"target": {
"kind": "call_edge",
"edge_id": "edge:abc123"
},
"providers": ["source_static"],
"cost_policy": "snapshot_only"
}
callsite_location targets use source coordinates and can be sent either with coordinates directly on target or inside target.payload:
{
"target": {
"kind": "callsite_location",
"file": "src/MyPkg.jl",
"line": 42,
"column": 17
},
"providers": ["source_static"],
"cost_policy": "snapshot_only"
}
Supported target kinds are:
call_edgecallsite_locationmethodexpression_range
In the first implementation, source_static answers call_edge and callsite_location. A callsite_location query with file and line returns all snapshot call edges on that line; adding column narrows to the matching callsite when the snapshot contains column evidence. If an older snapshot has only line-level evidence, the provider returns line-level matches with a diagnostic instead of guessing.
The jet provider is interactive-cost and must be requested explicitly. Its first implementation supports method targets only and returns a selected-method pure JET graph as a query artifact. callsite_location is intentionally unsupported for jet until compiler evidence can be attributed back to source callsite coordinates.
{
"target": {
"kind": "method",
"method_node_id": "method:entry"
},
"providers": ["jet"],
"cost_policy": "interactive"
}
{
"request": {
"snapshot_id": "snp_abc123",
"target": {"kind": "call_edge", "payload": {"edge_id": "edge:abc123"}},
"providers": ["source_static"],
"cost_policy": "snapshot_only"
},
"results": [
{
"status": "answered",
"provider": "source_static",
"provider_version": "1",
"cost_class": "snapshot",
"confidence": "possible",
"inferred_arg_types": [],
"method_matches": [
{
"node_id": "method:target",
"fqname": "MyPkg.foo",
"signature": "foo(x::Int)",
"confidence": "possible",
"source": "snapshot_edge"
}
],
"evidence_trace": [
{
"provider": "source_static",
"engine": "da_source",
"edge_id": "edge:abc123",
"dispatch_resolution": "unique"
}
],
"artifacts": {},
"diagnostics": [],
"elapsed_seconds": 0.0,
"cached": false
}
]
}
JET-backed results use the same outer result schema and place provider-specific output under artifacts:
{
"status": "answered",
"provider": "jet",
"provider_version": "2",
"cost_class": "interactive",
"method_matches": [],
"evidence_trace": [],
"artifacts": {
"jet_graph": {"nodes": [], "edges": [], "diagnostics": []},
"metrics": {
"entrypoint_resolved": true,
"root_node_id": "method:entry",
"inferred_edges": 0,
"dynamic_edges": 0
}
},
"diagnostics": [],
"elapsed_seconds": 0.0,
"cached": false
}
GET /api/v1/tasks/{task_id}
This endpoint returns task lifecycle status, normalized config, progress, and any eventual snapshot id.
GET /api/v1/snapshots/{snapshot_id}/summary
This endpoint returns snapshot counts, supported layers, canonical project_modules, and diagnostics.
POST /api/v1/snapshots/{snapshot_id}/graph/query
This endpoint returns filtered nodes, edges, and pagination state for one graph layer.
Response note:
nodesis still the single renderable node list.node_appearanceexplains why each returned node appears in this query result.node_appearance[*].reasonsmay include:edge_endpointscope_matchsearch_match
The request body includes:
layerfilters- optional
page
Common filter fields include:
edge_kindsconfidence_minmodule_prefixshow_overloaded_functionsshow_base_stdlib_callsshow_external_package_calls
nodes is still the single renderable node list. node_appearance is query-context metadata that explains why each returned node is present.
{
"nodes": [{"id": "method:entry", "kind": "method", "label": "entry", "fqname": "Main.entry", "location": {"file": "src/Main.jl", "line": 3, "column": 1}, "metadata": {}}],
"edges": [{"id": "e_call_entry_mid", "kind": "call_inferred", "source": "method:entry", "target": "method:mid", "confidence": "inferred", "evidence": {"kinds": ["call_inferred"], "callee_group": "project", "overload_style": "none"}}],
"node_appearance": {
"method:entry": {"reasons": ["edge_endpoint", "search_match"]},
"method:mid": {"reasons": ["edge_endpoint"]}
},
"page": {"cursor": "1", "limit": 2000, "next_cursor": null, "total_edges": 1}
}
POST /api/v1/snapshots/{snapshot_id}/reachability/query
This endpoint returns a bounded reachability subgraph for one seed node.
Response note:
nodesis still the single renderable node list.node_appearanceexplains why each returned node appears in this reachability result.node_appearance[*].reasonsmay include:edge_endpointreachability_seed
The request body includes:
layernode_id- optional
direction - optional
depth - optional
filters - optional
limits
{
"seed_node_id": "method:entry",
"layer": "method",
"direction": "outgoing",
"depth": 3,
"nodes": [{"id": "method:entry", "kind": "method", "label": "entry", "fqname": "Main.entry", "location": {}, "metadata": {}}],
"edges": [],
"node_appearance": {
"method:entry": {"reasons": ["reachability_seed"]}
},
"reachability": {
"incoming": {"node_depths": {}, "edge_depths": {}},
"outgoing": {"node_depths": {}, "edge_depths": {}}
},
"truncated": false
}
GET /api/v1/snapshots/{snapshot_id}/node?id=<node_id>
This endpoint returns the node plus incoming and outgoing neighborhood information.
GET /api/v1/source?file=<abs-or-rel>&line=<n>&snapshot_id=<optional>
This endpoint returns a source snippet centered around one line.
If snapshot_id is provided, the backend resolves relative paths against that snapshot's project root.
GET /api/v1/fs/list?path=<optional>
This endpoint returns directory entries for the path browser used by the web UI.
Notes
- The web UI currently uses the
/api/v1/...namespace throughout. - Graph export JSON is documented separately in Export JSON.
Related Pages
- Want the backend reasoning behind these payloads? See Architecture / Pipeline.
- Want the Julia-side entrypoints instead of HTTP? See Julia API.