---
schema_version: "1"
id: 62c2e302c335525fdc99be3f256054e1734e1c4beb93381308ac15a3c8fbca94
title: Invoke a Function From Apex
collection: developer
version: current
locale: en-us
portal_url: https://docs.salesforce.com/developer/current/en-us/salesforce-functions/functions/guide/quick-start/invoke-from-apex.md
canonical_url: https://developer.salesforce.com/docs/platform/functions/guide/invoke-from-apex.html
source_site: developer.salesforce.com
content_type: documentation
content_hash: 55e1b02a303c37a5d5167f309ae3d535bacc22b60c0d39ea9530ba016d768e4b
products:
  - Salesforce Functions
---
# Invoke a Function From Apex

When your project is deployed, invoke your function from Apex.

## Create an Apex Class

Make sure the current directory is your project root directory and use the following command to create an Apex class:

```sh
sf apex generate class --name FunctionApex --output-dir force-app/main/default/classes
```

**tip:** In VS Code from the Command Palette, choose **SFDX: Create Apex class** and enter the filename **FunctionApex**.

This command creates a `FunctionApex.cls` file with template code. Replace the contents of the file with the following Apex code:

```java
public with sharing class FunctionApex {
    public static void test() {
        System.debug('Invoking myfunction');

        functions.Function myFunction = functions.Function.get('MyFunctionProject.myfunction');
        functions.FunctionInvocation invocation = myFunction.invoke('{"name":"MyAccount"}');
        String jsonResponse = invocation.getResponse();

        System.debug('Response from myfunction ' + jsonResponse);
    }
}
```

This class file invokes the function with a sample payload and prints the response.

## Deploy Your Apex Code

Deploy your Apex code to your scratch org using the following command:

```sh
sf project deploy start --target-org MyOrgAlias
```

**tip:** In VS Code, from the Command Palette, choose **SFDX: Push Source to Default Scratch Org**.

### Debug Apex Code Deploy

Deploying your Apex code with `sf project deploy start` can cause the following error:

```sh
PROJECT PATH                   ERRORS

─────────────────────────────────────────────── ──────────────────────────────────────────────

force-app/main/default/classes/FunctionApex.cls Type is not visible: functions.Function (5:9)

force-app/main/default/classes/FunctionApex.cls Type is not visible: functions.Function (6:51)
```

This error appears when the Apex class is running on API version 52.0 or earlier. To fix this issue, navigate to `/force-app/main/default/classes/` and open the `FunctionController.cls-meta.xml` file. Edit the file to update the API version to 53.0 or later:

```java
<?xml version="1.0" encoding="UTF-8" ?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>53.0</apiVersion>
    <status>Active</status>
</ApexClass>
```

## Create a TraceFlag Record

Open the scratch org’s Developer Console to create a TraceFlag record. This record enables Apex debug logs in your scratch org and lets you execute `apex log` commands if needed.

```sh
sf org open --path /_ui/common/apex/debug/ApexCSIPage
```

Now, invoke your Apex code to execute your function:

**Linux/OSX**

```sh
echo "FunctionApex.test();" | sf apex run --file /dev/stdin
```

**Windows**

```sh
echo "FunctionApex.test();" | sf apex run
```

The output looks something like this:

```sh
Compiled successfully.
Executed successfully.

52.0 APEX_CODE,FINEST;APEX_PROFILING,INFO;CALLOUT,INFO;DB,INFO;NBA,INFO;SYSTEM,DEBUG;VALIDATION,INFO;VISUALFORCE,INFO;WAVE,INFO;WORKFLOW,INFO
Execute Anonymous: FunctionApex.test();

...

18:20:51.102 (286350229)|METHOD_ENTRY|[6]||functions.Function.invoke(String)
18:20:51.102 (741953038)|FUNCTION_INVOCATION_REQUEST|[31]|Function.invoke[Name=MyFunctionProject-myfunction, Invocation ID=00D2F000000Hc8RUAS-4cjx9jRDHsaVPP-qbx-uK--36ad2970, Namespace=, Request ID=4cjx9jRDHsaVPP-qbx-uK-, Payload length=20]
18:20:53.911 (2911368332)|FUNCTION_INVOCATION_RESPONSE|[31]|Function.invoke[Name=MyFunctionProject-myfunction, Invocation ID=00D2F000000Hc8RUAS-4cjx9jRDHsaVPP-qbx-uK--36ad2970, Namespace=, Request ID=4cjx9jRDHsaVPP-qbx-uK-, Response length=1446]
18:20:53.911 (2911428761)|HEAP_ALLOCATE|[31]|Bytes:20
18:20:53.911 (2911456738)|METHOD_EXIT|[6]||functions.Function.invoke(String)
18:20:53.911 (2911464878)|VARIABLE_SCOPE_BEGIN|[6]|invocation|functions.FunctionInvocation|true|false
18:20:53.911 (2911538666)|VARIABLE_ASSIGNMENT|[6]|invocation|{"invocationId":"00D2F000000Hc8RUAS-4 (30 more) ...","response":"{\"done\":true,\"totalS (1426 more) ...","status":"0x536e4e3b"}|0x2e2b5af9
18:20:53.911 (2911551634)|STATEMENT_EXECUTE|[7]
18:20:53.911 (2911570107)|METHOD_ENTRY|[7]||functions.FunctionInvocationImpl.getResponse()
18:20:53.911 (2911605213)|METHOD_EXIT|[7]||functions.FunctionInvocationImpl.getResponse()
18:20:53.911 (2911613656)|VARIABLE_SCOPE_BEGIN|[7]|jsonResponse|String|false|false
18:20:53.911 (2911633134)|VARIABLE_ASSIGNMENT|[7]|jsonResponse|"{\"done\":true,\"totalS (1426 more) ..."
18:20:53.911 (2911640236)|STATEMENT_EXECUTE|[9]
18:20:53.911 (2911644250)|HEAP_ALLOCATE|[9]|Bytes:25
18:20:53.911 (2911664344)|HEAP_ALLOCATE|[9]|Bytes:1471
18:20:53.911 (2911700189)|USER_DEBUG|[9]|DEBUG|Response from myfunction {"done":true,"totalSize":1,"records":[{"type":"Account","fields":{"id":"0012F00000r3LfTQAU","isdeleted":false,"masterrecordid":null,"name":"MyAccount-1624670453815","type":null,"parentid":null,"billingstreet":null,"billingcity":null,"billingstate":null,"billingpostalcode":null,"billingcountry":null,"billinglatitude":null,"billinglongitude":null,"billinggeocodeaccuracy":null,"billingaddress":null,"shippingstreet":null,"shippingcity":null,"shippingstate":null,"shippingpostalcode":null,"shippingcountry":null,"shippinglatitude":null,"shippinglongitude":null,"shippinggeocodeaccuracy":null,"shippingaddress":null,"phone":null,"fax":null,"accountnumber":null,"website":null,"photourl":"/services/images/photo/0012F00000r3LfTQAU","sic":null,"industry":null,"annualrevenue":null,"numberofemployees":null,"ownership":null,"tickersymbol":null,"description":null,"rating":null,"site":null,"ownerid":"0052F000008hjwOQAQ","createddate":"2021-06-26T01:20:54.000+0000","createdbyid":"0052F000008hjwOQAQ","lastmodifieddate":"2021-06-26T01:20:54.000+0000","lastmodifiedbyid":"0052F000008hjwOQAQ","systemmodstamp":"2021-06-26T01:20:54.000+0000","lastactivitydate":null,"lastvieweddate":"2021-06-26T01:20:54.000+0000","lastreferenceddate":"2021-06-26T01:20:54.000+0000","jigsaw":null,"jigsawcompanyid":null,"cleanstatus":"Pending","accountsource":null,"dunsnumber":null,"tradestyle":null,"naicscode":null,"naicsdesc":null,"yearstarted":null,"sicdesc":null}}]}
18:20:53.911 (2911734250)|METHOD_EXIT|[1]|01p2F00000Ap61w|FunctionApex.test()
18:20:53.911 (2911742250)|SYSTEM_MODE_EXIT|false
18:20:53.911 (2911805149)|CUMULATIVE_LIMIT_USAGE
18:20:53.911 (2911805149)|LIMIT_USAGE_FOR_NS|(default)|
  Number of SOQL queries: 0 out of 100
  Number of query rows: 0 out of 50000
  Number of SOSL queries: 0 out of 20
  Number of DML statements: 0 out of 150
  Number of Publish Immediate DML: 0 out of 150
  Number of DML rows: 0 out of 10000
  Maximum CPU time: 0 out of 10000
  Maximum heap size: 0 out of 6000000
  Number of callouts: 0 out of 100
  Number of Email Invocations: 0 out of 10
  Number of future calls: 0 out of 50
  Number of queueable jobs added to the queue: 0 out of 50
  Number of Mobile Apex push calls: 0 out of 10

18:20:53.911 (2911805149)|CUMULATIVE_LIMIT_USAGE_END

18:20:53.911 (2911862726)|CODE_UNIT_FINISHED|execute_anonymous_apex
18:20:53.911 (2911873632)|EXECUTION_FINISHED
```

See [Function Logging](https://developer.salesforce.com/docs/platform/functions/dev-guide/function-logging.md) to learn how to view logs while the function is running.
