Skip to content

API Portal

Traefik Enterprise includes an API Portal which groups all of the API specifications from your services into a web UI, if they support the OpenAPI format (formerly known as Swagger).

It works by looking for a JSON file on the service endpoint, which should match the file name defined in the configuration, and making it available on the API Portal web app. It does this for all services that expose an API specification file.

API Portal page

Configuration

In order to enable the API Portal, a path property must be defined in the static configuration.

API Portal Options

path

Required, Default=""

The path option must be a string representing the name of the specification file to look for on the service endpoint. For example, if spec.json is defined as path, the API Portal will try to get this file under the service URL. Thus, the path <service-url>/spec.json must point to the specification file.

apiportal:
  path: spec.json
[apiportal]
  path = "spec.json"

It's also possible to define the API spec path on the dynamic configuration, declared on the service definition attached to your router. Doing so overrides the path specified on the static configuration.

http:
  services:
    myapi-svc:
        apiportal:
          path: /foo/spec.json
[http.services.myapi-svc]
  [http.services.myapi-svc.loadbalancer]
    [http.services.myapi-svc.loadbalancer.apiportal]
      path = "/foo/spec.json"

Enabling the API Portal

Where is the API Portal served?

Just like the Dashboard, the API Portal is served by Ingress proxies.

An internal service called apiportal@internal serves the API Portal, which means that it's possible to use all of Traefik's routing capabilities to build the most suitable configuration.

Example

This example shows how to enable the API Portal on port 8888 of the domain apiportal.domain.org.

To do so, create a router through the dynamic configuration that routes all requests coming through the internal entrypoint to the apiportal@internal service. In our case, the entrypoint internal is listening to the address :8888.

First, the applied static configuration should contain the following elements:

# [...]
entrypoints:
  # [...]
  internal:
    address: ":8888"

apiportal:
  path: spec.json
# [...]
[entryPoints]
  # [...]
  [entryPoints.internal]
    address = ":8888"

[apiportal]
  path = "spec.json"

Using the teectl apply command:

teectl apply --file=static.yaml
teectl apply --file=static.toml

Then, apply the following dynamic configuration:

labels:
  - "traefik.http.routers.apiportal.rule=Host(`apiportal.domain.org`)"
  - "traefik.http.routers.apiportal.service=apiportal@internal"
  - "traefik.http.routers.apiportal.entryPoints=internal"
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: apiportal
spec:
  entryPoints:
    - internal
  routes:
    - match: Host(`apiportal.domain.org`)
      kind: Rule
      services:
        - name: apiportal@internal
          kind: TraefikService
- "traefik.http.routers.apiportal.rule=Host(`apiportal.domain.org`)"
- "traefik.http.routers.apiportal.service=apiportal@internal"
- "traefik.http.routers.apiportal.entryPoints=internal"
"labels": {
    "traefik.http.routers.apiportal.rule": "Host(`apiportal.domain.org`)",
    "traefik.http.routers.apiportal.service": "apiportal@internal",
    "traefik.http.routers.apiportal.entryPoints": "internal"
}
labels:
  - "traefik.http.routers.apiportal.rule=Host(`apiportal.domain.org`)"
  - "traefik.http.routers.apiportal.service=apiportal@internal"
  - "traefik.http.routers.apiportal.entryPoints=internal"
http:
  routers:
    apiportal:
      rule: Host(`apiportal.domain.org`)
      service: apiportal@internal
      entryPoints:
        - internal
[http.routers.apiportal]
  rule = "Host(`apiportal.domain.org`)"
  service = "apiportal@internal"
  entryPoints = ["internal"]

Using the teectl apply command:

teectl apply --file=dynamic.yaml
teectl apply --file=dynamic.toml

At this point, the API Portal is ready to expose specifications from any service on your network, and the web app is available at apiportal.domain.org. There are some examples of valid JSON files on the OpenAPI specification repository.