Fern is a platform that transforms your API definitions into production-ready SDKs and beautiful documentation in minutes.
With Fern, you can offer your users:
- π§© Type-safe SDKs in multiple languages, including TypeScript, Python, Java, Go, Ruby, PHP, and C#
 - π Developer documentation featuring an interactive UI and auto-generated API + SDK references
 - β¨ AI Search powered by an assistant trained on your docs, APIs, and SDKs that can instantly answer a developer's questions
 
Fern supports leading API specifications including OpenAPI (REST, Webhooks), AsyncAPI (WebSockets), Protobuf (gRPC), and OpenRPC.
The Fern platform is available via a command line interface (CLI) and requires Node 18+. To install it, run:
npm install -g fern-apiInitialize Fern with your OpenAPI spec:
fern init --openapi ./path/to/openapi.yml
# or
fern init --openapi https://link.buildwithfern.com/plantstore-openapiYour directory should look like the following:
fern/
ββ fern.config.json
ββ generators.yml # generators you're using
ββ openapi/
  ββ openapi.json # your openapi documentFinally, to invoke the generator, run:
fern generateπ Once the command completes, you'll see your SDK in /generated/sdks/typescript.
Fern can also build and host a documentation website with an auto-generated API reference. Write additional pages in markdown and have them versioned with git. Search, SEO, dark mode, and popular components are provided out-of-the-box. Plus, you can customize the colors, font, logo, and domain name.
Check out docs built with Fern:
Get started here.
Generators are process that take your API Definition as input and output artifacts (SDKs,
Postman Collections, Server boilerplate, etc.). To add a generator, run fern add <generator id>.
| Generator ID | Latest Version | Entrypoint | 
|---|---|---|
fernapi/fern-typescript-sdk | 
cli.ts | |
fernapi/fern-python-sdk | 
cli.py | |
fernapi/fern-java-sdk | 
Cli.java | |
fernapi/fern-ruby-sdk | 
cli.ts | |
fernapi/fern-go-sdk | 
main.go | |
fernapi/fern-csharp-sdk | 
cli.ts | |
fernapi/fern-php-sdk | 
cli.ts | |
fernapi/fern-swift-sdk | 
cli.ts | |
fernapi/fern-rust-sdk | 
cli.ts | 
Fern's server-side generators output boilerplate application code (models and networking logic). This is intended for spec-first or API-first developers, who write their API definition (as an OpenAPI spec or Fern definition) and want to generate backend code.
| Generator ID | Latest Version | Entrypoint | 
|---|---|---|
fernapi/fern-typescript-express | 
cli.ts | |
fernapi/fern-fastapi-server | 
cli.py | |
fernapi/fern-java-spring | 
Cli.java | 
Fern's model generators will output schemas or types defined in your OpenAPI spec or Fern Definition.
| Generator ID | Latest Version | Entrypoint | 
|---|---|---|
fernapi/fern-pydantic-model | 
cli.py | |
fernapi/java-model | 
Cli.java | |
fernapi/fern-ruby-model | 
cli.ts | |
fernapi/fern-go-model | 
main.go | 
Fern's spec generators can output an OpenAPI spec or a Postman collection.
Note: The OpenAPI spec generator is primarily intended for Fern Definition users. This prevents lock-in so that one can always export to OpenAPI.
| Generator ID | Latest Version | Entrypoint | 
|---|---|---|
fernapi/fern-openapi | 
cli.ts | |
fernapi/fern-postman | 
cli.ts | 
Here's a quick look at the most popular CLI commands. View the documentation for all CLI commands.
fern init: adds a new starter API to your repository.
fern check: validate your API definition and Fern configuration.
fern generate: run the generators specified in generators.yml in the cloud.
fern generate --local: run the generators specified in generators.yml in docker locally.
fern add <generator>: include a new generator in your generators.yml. For example, fern add fern-python-sdk.
Fern supports developers and teams that want to be API-first or Spec-first.
Define your API, and use Fern to generate models, networking code and boilerplate application code. The generated code adds type safety to your API implementation - if your backend doesn't implement the API correctly, it won't compile.
Frameworks currently supported:
While we are big fans of OpenAPI, we know it isn't the easiest format to read and write. If you're looking for an alternative, give the Fern Definition a try.
Install the Fern CLI and initialize a Fern Project.
npm install -g fern-api
fern initThis will create the following folder structure in your project:
fern/
ββ fern.config.json # root-level configuration
ββ generators.yml # generators you're using
ββ definition/
  ββ api.yml  # API-level configuration
  ββ imdb.yml # endpoints, types, and errorsHere's what the imdb.yml starter file looks like:
types:
  MovieId: string
  Movie:
    properties:
      id: MovieId
      title: string
      rating:
        type: double
        docs: The rating scale is one to five stars
  CreateMovieRequest:
    properties:
      title: string
      rating: double
service:
  auth: false
  base-path: /movies
  endpoints:
    createMovie:
      docs: Add a movie to the database
      method: POST
      path: /create-movie
      request: CreateMovieRequest
      response: MovieId
    getMovie:
      method: GET
      path: /{movieId}
      path-parameters:
        movieId: MovieId
      response: Movie
      errors:
        - MovieDoesNotExistError
errors:
  MovieDoesNotExistError:
    status-code: 404
    type: MovieIdCheckout open source projects that are using Fern Definitions:
Fern is inspired by internal tooling built to enhance the developer experience. We stand on the shoulders of giants. While teams were responsible for building the following tools, we want to give a shout out to Mark Elliot (creator of Conjure at Palantir), Michael Dowling (creator of Smithy at AWS), and Ian McCrystal (creator of Stripe Docs).
Join our Slack! We are here to answer questions and help you get the most out of Fern.
We welcome community contributions. For guidelines, refer to our CONTRIBUTING.md. To contribute to our documentation, refer to our docs repo.