---
# System prepended metadata

title: AiiDA REST API enhancement list based on AiiDAlab testing
tags: [' restapi', aiida, ' aiidalab']

---

---
tags: aiida, restapi, aiidalab
---

# AiiDA REST API enhancement list based on AiiDAlab testing

Currently, only general endpoints (nodes, processes, etc.) are available. The user needs to write a query function (with a filter) to get node data. Based on the test using AiiDAlab, it would be helpful if there is a client library to get the common data.

There is also a discussion on the client library. https://github.com/aiidateam/aiida-restapi/issues/59


## Read node data

In AiiDA, there are utils functions in `orm`. It would be helpful to have similar functions in the client library.

- load_node --> api_load_node
- load_code --> api_load_code
- load_computer --> api_load_computer


### Read incoming and outgoing nodes

Get outputs of a ProcessNode using AiiDA is easy.
```
process.outputs
```

Using REST API, we need to query the `outgoing`:
```python
query function($process_pk: Int) {
            node(id: $process_pk) {
                outgoing {
                    rows {
                        node {
                            uuid
                            attributes
                        }
                        link {
                            label
                        }
                    }
                }
            }
        }
```

Note, the `CALL` is also included. We need to exclude this.

It would be helpful to have similar functions in the client library.

- process.inputs --> api_load_node_inputs
- process.outputs --> api_load_node_outputs
- process.called --> api_load_node_called




### Read other attributes
Some attributes are available in the AiiDA node, but not straightforward in the API, e.g. 
```python
# in AiiDA
node.is_finished
```
Use API, one can check
```python
"exit_status" in node["attributes"]
```

It would be helpful to have the documentation to show this in the client library.

### Add general query for advanced user
Support pass any query to the request.

```python=
def api_get_node(query: dict) -> dict[str, t.Any]:
    """"""
    
    results = request("graphql", {"query": query})
    return results["data"]["nodes"]

```

For example, I want to query all `QeAppWorkChain` processes.
```python=
query = {
  nodes(filters: "process_type ILIKE '%QeAppWorkChain%'") {
    count 
    rows{
      uuid
    	id
      ctime
    }
  } 
}
api_get_node(query)
```


### PUT method
Currently, no `PUT` method available to processes. We need `PUT` method to update the `extra` parameters of a `ProcessNode`.
```python
process.base.extras.set("builder_parameters", parameters)
```
