> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended**:
> ```bash
> npx @scalekit-inc/cli setup
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for 40+ agents.
> Features: full-stack-auth, agent-auth, mcp-auth, modular-sso, modular-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Admin portal

Implement Scalekit's self-serve admin portal to let customers configure SSO and SCIM via a shareable link or embedded iframe
The admin portal provides a self-serve interface for customers to configure single sign-on (SSO) and directory sync (SCIM) connections. Scalekit hosts the portal and provides two integration methods: generate a shareable link through the dashboard or programmatically embed the portal in your application using an iframe.

For the broader customer onboarding workflow, see [Onboard enterprise customers](/sso/guides/onboard-enterprise-customers/).

For self-serve management by signed-in users (members, profiles, domains, SSO, SCIM, session policy), redirect to Hosted UI widgets at `/ui/`. See [Hosted UI widgets](/authenticate/manage-users-orgs/hosted-widgets/) for when to use each option. Use the Admin portal for shareable magic links or iframe embeds aimed at enterprise IT admins.

## Generate shareable portal link

Generate a shareable link through the Scalekit dashboard to give customers access to the admin portal. This method requires no code and is ideal for quick setup.

### Create the portal link

1. Log in to the [Scalekit dashboard](https://app.scalekit.com)
2. Navigate to **Dashboard > Organizations**
3. Select the target organization
4. Click **Generate link** to create a shareable admin portal link

The generated link follows this format:

```http title="Portal link example" wrap showLineNumbers=false
https://your-app.scalekit.dev/magicLink/2cbe56de-eec4-41d2-abed-90a5b82286c4_p
```

### Link properties

| Property | Details |
| -------- | ------- |
| **Expiration** | Links expire after 7 days |
| **Revocation** | Revoke links anytime from the dashboard |
| **Sharing** | Share via email, Slack, or any preferred channel |
| **Security** | Anyone with the link can view and update the organization's connection settings |

> caution: Security consideration
>
> Treat portal links as sensitive credentials. Anyone with the link can view and modify the organization's SSO and SCIM configuration.

## Embed the admin portal

Embed the admin portal directly in your application using an iframe. This allows customers to configure SSO and SCIM without leaving your app, creating a seamless experience within your settings or admin interface.

The portal link must be generated programmatically on each page load for security. Each generated link is single-use and expires after 1 minute, though once loaded, the session remains active for up to 6 hours.

### Node.js

```bash showLineNumbers=false frame="none"
npm install @scalekit-sdk/node
```

   ### Python

```sh showLineNumbers=false frame="none"
pip install scalekit-sdk-python
```

  ### Go

```sh showLineNumbers=false frame="none"
go get -u github.com/scalekit-inc/scalekit-sdk-go
```

   ### Java

```groovy showLineNumbers=false frame="none"
/* Gradle users - add the following to your dependencies in build file */
implementation "com.scalekit:scalekit-sdk-java:2.1.3"
```

```xml showLineNumbers=false frame="none"
<!-- Maven users - add the following to your `pom.xml` -->
<dependency>
    <groupId>com.scalekit</groupId>
    <artifactId>scalekit-sdk-java</artifactId>
    <version>2.1.3</version>
</dependency>
```

### Generate portal link

Use the Scalekit SDK to generate a unique, embeddable admin portal link for an organization. Call this API endpoint each time you render the page containing the iframe.

  ### Node.js

```javascript title="Express.js" collapse={1-6} {8-10}
import { Scalekit } from '@scalekit-sdk/node';

const scalekit = new Scalekit(
  process.env.SCALEKIT_ENVIRONMENT_URL,
  process.env.SCALEKIT_CLIENT_ID,
  process.env.SCALEKIT_CLIENT_SECRET,
);

async function generatePortalLink(organizationId) {
  const link = await scalekit.organization.generatePortalLink(organizationId);
  return link.location; // Use as iframe src
}
```

  ### Python

```python title="Flask" collapse={1-6} {8-10}
from scalekit import Scalekit
import os

scalekit_client = Scalekit(
    environment_url=os.environ.get("SCALEKIT_ENVIRONMENT_URL"),
    client_id=os.environ.get("SCALEKIT_CLIENT_ID"),
    client_secret=os.environ.get("SCALEKIT_CLIENT_SECRET")
)

def generate_portal_link(organization_id):
    link = scalekit_client.organization.generate_portal_link(organization_id)
    return link.location  # Use as iframe src
```

  ### Go

```go title="Gin" collapse={1-10} {12-18}
import (
    "context"
    "os"

    "github.com/scalekit/sdk-go"
)

scalekitClient := scalekit.New(
    os.Getenv("SCALEKIT_ENVIRONMENT_URL"),
    os.Getenv("SCALEKIT_CLIENT_ID"),
    os.Getenv("SCALEKIT_CLIENT_SECRET"),
)

func generatePortalLink(organizationID string) (string, error) {
    ctx := context.Background()
    link, err := scalekitClient.Organization().GeneratePortalLink(ctx, organizationID)
    if err != nil {
        return "", err
    }
    return link.Location, nil  // Use as iframe src
}
```

  ### Java

```java title="Spring Boot" collapse={1-8} {10-16}
import com.scalekit.client.Scalekit;
import com.scalekit.client.models.Link;
import com.scalekit.client.models.Feature;
import java.util.Arrays;

Scalekit scalekitClient = new Scalekit(
    System.getenv("SCALEKIT_ENVIRONMENT_URL"),
    System.getenv("SCALEKIT_CLIENT_ID"),
    System.getenv("SCALEKIT_CLIENT_SECRET")
);

public String generatePortalLink(String organizationId) {
    Link portalLink = scalekitClient.organizations()
        .generatePortalLink(organizationId, Arrays.asList(Feature.sso, Feature.dir_sync, Feature.domain_verification));
    return portalLink.getLocation();  // Use as iframe src
}
```

The API returns a JSON object with the portal link. Use the `location` property as the iframe `src`:

```json title="API response" {3} showLineNumbers=false
{
  "id": "8930509d-68cf-4e2c-8c6d-94d2b5e2db43",
  "location": "https://random-subdomain.scalekit.dev/magicLink/8930509d-68cf-4e2c-8c6d-94d2b5e2db43",
  "expireTime": "2024-10-03T13:35:50.563013Z"
}
```

```html title="Embed portal in iframe" {2} wrap showLineNumbers=false
<iframe
  src="https://random-subdomain.scalekit.dev/magicLink/8930509d-68cf-4e2c-8c6d-94d2b5e2db43"
  width="100%" height="600" frameborder="0" allow="clipboard-write">
</iframe>
```

Embed the portal in your application's settings or admin section where customers manage authentication configuration.

### Configuration and session

| Setting | Requirement |
| ------- | ----------- |
| **Redirect URI** | Add your application domain at **Dashboard > Developers > API Configuration** |
| **iframe attributes** | Include `allow="clipboard-write"` for copy-paste functionality |
| **Dimensions** | Minimum recommended height: 600px |
| **Link expiration** | Generated links expire after 1 minute if not loaded |
| **Session duration** | Portal session remains active for up to 6 hours once loaded |
| **Single-use** | Each generated link can only be used once to initialize a session |

> tip: Generate fresh links
>
> Generate a new portal link on each page load rather than caching the URL. This ensures security and prevents expired link errors.

## Customize the admin portal

Match the admin portal to your brand identity. Configure branding at **Dashboard > Settings > Branding**:

| Option | Description |
| ------ | ----------- |
| **Logo** | Upload your company logo (displayed in the portal header) |
| **Accent color** | Set the primary color to match your brand palette |
| **Favicon** | Provide a custom favicon for browser tabs |

> note: Branding scope
>
> Branding changes apply globally to all portal instances (both shareable links and embedded iframes) in your environment.

For additional customization options including custom domains, see the [Custom domain guide](/guides/custom-domain/).


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
