---
title: call
summary: null
url: https://www.fastly.com/documentation/reference/vcl/statements/call
---

```
call(ID subroutine_name);
```

**Available in:** all subroutines

Invokes a user-defined [subroutine](https://www.fastly.com/documentation/reference/vcl/subroutines) that does not have a return type.

> **HINT:** Custom subroutines that return a value are supported but are not invoked using the `call` statement. [Learn more](https://www.fastly.com/documentation/reference/vcl/subroutines/#calling-a-subroutine).

You can define custom subroutines in the same way as built-in subroutines, and invoke them using `call` statement. Control passes to the custom subroutine and returns to the calling point when the subroutine ends, unless the subroutine includes a statement that would terminate the current lifecycle state.

```vcl
sub compression_check {
  if (req.http.Accept-Encoding ~ "gzip|br") {
    set req.http.Compression-Accepted-By-Client = "yes";
  }
}
sub vcl_recv {
  call compression_check;
}
```

Custom subroutines defined and invoked in this way do not accept parameters and do not return a value, but may apply side effects to a request, such as modifying request state. All custom subroutines have access to the same request-level state that the calling subroutine does (so, for example, a custom subroutine called from `vcl_fetch` would be able to set `beresp.ttl`), but do not have access to local variables defined in the parent subroutine. Likewise, local variables defined in a custom subroutine are not accessible outside it.

Custom subroutines may include the terminating statements `restart`, `return` or `error`. In the case of `return` without an argument, control passes back to the line after the `call` statement (which is also the default behavior if the custom subroutine does not contain any terminating statements). However, in the case of a `return` with an argument, a `restart` or an `error` from inside a custom subroutine, the parent subroutine will be terminated as well, with the specified exit state.

A custom subroutine may call another custom subroutine. It is not possible to `call` a built-in VCL subroutine.
