# How to write APIs for FTL FTL provides three primary types of synchronous APIs: **Verbs**, **Ingress Endpoints**, and **Egress Endpoints**. This guide will walk you through using each type efficiently. ## Verbs Verbs in FTL are implemented using gRPC and are utilized in two main scenarios: 1. **Internal RPC:** For calling functions within the same FTL module. 2. **Exported RPC:** For enabling inter-module communication. ### Defining a Private Verb To define a verb that is only accessible within its own module, use the following annotation: ```go // ftl:verb func GetSomething(ctx context.Context, req MyRequest) (MyResponse, error) { // Implementation here } ``` ### Making a Verb Public If you intend for the verb to be callable by other modules, include the `export` keyword in the annotation: ```go // ftl:verb export func GetSomething(ctx context.Context, req MyRequest) (MyResponse, error) { // Implementation here } ``` ### Calling a Verb When using the command line or in tests, verbs are referenced by `<module name>.<verb name>`. Note that the verb name is case sensitive and may be formatted differently; for example, `GetMyID` should be called as `getMyId`. ## Ingress Endpoints Ingress endpoints are ideal for scenarios where you need external accessibility, such as third-party webhooks. These endpoints allow methods to be called over the web, facilitating easier integration with external services and applications.