The shared HttpApi we defined inside api-client provides the API definition for the server implementation.
Each group inside HttpApi is implemented using HttpApiBuilder.group:
export const PaddleApiLive = HttpApiBuilder.group(
  MainApi,
  "paddle", // 👈 Group identifier
  (handlers) => /// ...
);Using handlers we define each endpoint implementation with .handle:
export const PaddleApiLive = HttpApiBuilder.group(
  MainApi,
  "paddle",
  (handlers) =>
    handlers
      .handle("webhook", ({ headers }) => /* ... */ )
      .handle("product", ({ path: { slug } }) => /* ... */ )
);The function inside
handleprovides all the headers, path parameters and other information that we defined in the API definition (type-safe).It's also possible to extract the full request by yielding
HttpServerRequest:export const PaddleApiLive = HttpApiBuilder.group( MainApi, "paddle", (handlers) => handlers .handle("webhook", ({ headers }) => Effect.gen(function* () { const request = yield* HttpServerRequest.HttpServerRequest; /// ... }) ) .handle("product", ({ path: { slug } }) => /* ... */ ) );
Each handle requires an Effect returning the response for the endpoint. The response type must be the same as defined with addSuccess.
