Ship integrations your customers use
Offer integrations inside your product. Publish a blueprint once and install it for each customer or environment, with credentials kept per connection.
APPII is an integration platform. It turns any provider API into a versioned blueprint you install per environment. Each connection carries its own credentials, and your apps call it by ID, as passthrough or through your own unified routes.
Every new provider costs the same work again: authentication, environments, credentials, response shapes, rate limits. APPII does that work once, in one place, for every integration you ship.
Offer integrations inside your product. Publish a blueprint once and install it for each customer or environment, with credentials kept per connection.
Several providers can answer the same canonical route. Your app calls /unified/contacts and never learns which provider is behind it.
Describe a provider in a file, review it, publish it and install it. Teams repeat the same flow for every client instead of writing a new integration each time.
Every provider has its own paths, authentication and quirks. APPII separates what a provider is, where you run it, and who uses it, so each part is defined once and reused.
Describe a provider API once: folders, endpoints, example requests and the authentication it supports. Draft, publish, version and deprecate. A published version never changes underneath you.
Describe a provider →Install a version into an environment such as Production or Staging. Set the provider address and choose which authentication methods connections may use.
Install a version →Create as many as you need, one per team or app. Each has its own ID, its own authentication method and its own encrypted credentials.
See how credentials are kept →Map provider endpoints to your canonical API with a visual mapper. It is optional. Nothing needs a mapping to install or to call.
Map visually →The studio works like a request collection. Add endpoints, publish a version, install it, and hand your apps a connection ID.
Build it in the studio or import a YAML or JSON file.
Publishing freezes it. Changes go into the next version.
Provider address, allowed authentication, optional mapping profile.
Name one per app. Add credentials to each connection.
Passthrough or unified. APPII adds the credentials for you.
Rate limits, metrics and a trail of every credential change.
Both modes use the same connection ID. Pick per call.
curl -X GET "$APPII_HOST/passthrough/planetary/apod?date=2026-10-01" \ -H "x-appii-connection-id: <connection-id>" \ -H "x-appii-instance-id: <installation-id>"
{
"date": "2026-10-01",
"title": "NASA Science",
"explanation": "What does it take to image hundreds of nebulas? …",
"media_type": "image",
"service_version": "v1"
}
curl -X GET "$APPII_HOST/unified/asteroids?limit=2" \ -H "x-appii-connection-id: <connection-id>" \ -H "x-appii-instance-id: <installation-id>"
[
{
"id": "2000433",
"name": "433 Eros (A898 PA)",
"hazardous": false,
"magnitude": 10.4,
"diameterKm": 49.435619262
},
…
]
| Canonical field | Provider field | Transform |
|---|---|---|
| id | id | As is |
| hazardous | is_potentially_hazardous_asteroid | As is |
| magnitude | absolute_magnitude_h | As is |
| diameterKm | estimated_diameter.kilometers…max | To number |
| source | — | Fixed value |
[{ "id": "2000433", "name": "433 Eros (A898 PA)",
"hazardous": false, "magnitude": 10.4 }]
Reshape any provider response into your own model without writing a line of code. Prefer code? The same mapping opens as JSONata.
Onboard a provider from one YAML or JSON file: folders, endpoints, authentication, sample responses and unified mappings. Credentials never go in the file.
apiVersion: appii/v1 kind: Integration metadata: name: NASA Open APIs category: Science spec: authentication: api_key # or a list: [api_key, bearer] publish: true folders: - name: Near Earth Objects endpoints: - name: Browse asteroids method: GET path: /neo/rest/v1/neo/browse mappings: - name: NASA science routes: - method: GET path: /asteroids endpoint: GET /neo/rest/v1/neo/browse request: params: [{ from: limit, to: size }] response: records: near_earth_objects fields: id: id hazardous: is_potentially_hazardous_asteroid
Organizations are hierarchical. A child organization sees its own integrations and the published ones of its ancestors. Seeing a blueprint never grants edit rights, or access to a parent's installations, credentials or connections.
“Define the provider once. Reuse it in every environment and every app.”
Provider secrets are the most sensitive data the platform holds. The design limits who can read them, for how long, and for which connection.
Credentials are encrypted with AES-256-GCM, with a separate data key per tenant, bound to the connection. No API ever returns a secret.
The portal signs every request with an Ed25519 key. Services and the engine hold public keys only, so a compromised service cannot impersonate a tenant.
The engine reads credentials with a token that lasts under a minute and names one tenant, one installation and one connection.
Every ciphertext carries a key ID. Add a key, run the re-encrypt job, retire the old one. Nobody re-enters a credential.
The engine connects only to public addresses on your allowlist, checked at connect time. Redirects are refused, so a provider address cannot reach your internal network.
Each service has its own database role with data access to its own schema only. Migrations run as separate jobs under a different role.
Standard containers, health probes and metrics. Deploy with the Kubernetes manifests, point it at your database and your identity provider.
Name the providers and what your apps need to do. We will tell you how it maps onto blueprints, installations and connections.