# FCALL

> Invoke a function.

## Arguments

<ParamField body="function" type="string" required>
  The function name.
</ParamField>

<ParamField body="keys" type="string[]">
  The keys that the function accesses. 
  <Warning>
    The function can only read/write from the keys that are provided in the `keys` argument.
  </Warning>
</ParamField>

<ParamField body="args" type="string[]">
  The arguments for the function.
</ParamField>

## Response

<ResponseField type="unknown" required>
  The return value of the function.
</ResponseField>

<RequestExample>
```ts Basic
const code = `
#!lua name=mylib
redis.register_function('helloworld', 
  function()
    return 'Hello World!'
  end
)
`;

await redis.functions.load({ code, replace: true });

const res = await redis.functions.call("helloworld");
console.log(res); // "Hello World!"
```

```ts Advanced
const code = `
#!lua name=mylib

redis.register_function('my_hset',
  function (keys, args)
    local hash = keys[1]
    local time = redis.call('TIME')[1]
    return redis.call('HSET', hash, '_last_modified_', time, unpack(args))
  end
)
`;

await redis.functions.load({ code, replace: true });

const res = await redis.functions.call(
  "my_hset",
  ["myhash"],
  [
    "myfield",
    "some value",
    "another_field",
    "another value",
  ],
);
```
</RequestExample>
