The custom fields your customers keep asking for

Ship the feature your customers want without pulling your team off the product. Kopra handles the infrastructure - you stay focused on what makes you different.

terminal
npm install @kopra-dev/sdk

import { KopraSDK } from '@kopra-dev/sdk';

const kopra = new KopraSDK({
  currentTenant: 'northstar-staffing',
  getToken: async (req) => {
    const res = await fetch('/api/kopra-token', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(req),
    });
    return res.json();
  },
});

await kopra.loadCustomFields('fields', {
  fieldGroupKey: 'customer',
  entityId: 'contact-42',
});

You already know the options. None of them are great.

Add columns per customer, build an EAV table, or write a field editor from scratch. Every approach has real costs.

“After a year with 20 clients, a users table can have 47 columns, and migrations become risky.”

On adding columns per customer

“Querying becomes a nightmare of self-joins, performance tanks as the attribute table grows.”

On the EAV pattern

“Resource-intensive, requiring developers to devote weeks or months to design, test, and deploy.”

On building field editors

Kopra handles the storage, the UI, the multi-tenancy, and the API. You ship custom fields without building custom field infrastructure.

Three steps to custom fields

From sign-up to your customers adding their own fields.

1

Sign up and create a field group

Define what your customers can customize. "Customer Profile", "Project Settings", "Invoice Details" — whatever your domain needs.

2

Drop in the SDK

npm install, a few lines of code, and your app has custom fields. No database migrations, no backend changes.

3

Your customers customize

They add their own fields, fill in values, organize their data. No engineering tickets required.

Try it

This is a live Kopra instance with demo data. Edit field values, add new tenant fields - everything works.

Integration

TypeScript SDK for the frontend, REST API for the backend. Use whichever fits your stack.

integration.ts
import { KopraSDK } from '@kopra-dev/sdk';

const kopra = new KopraSDK({
  currentTenant: tenantId,
  getToken: async (req) => {
    const res = await fetch('/api/kopra-token', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(req),
    });
    return res.json();
  },
});

// Render the field editor
await kopra.loadCustomFields('fields', {
  fieldGroupKey: 'customer-profile',
  entityId: contactId,
});

// Or use the REST API directly
const response = await fetch(
  `https://api.kopra.dev/api/field-groups`,
  { headers: { 'X-API-Key': apiKey } }
);

AI-agent ready

Kopra ships an MCP server. AI agents can read field schemas, create fields, and write values - no custom integration code needed.

mcp-config.json
{
  "mcpServers": {
    "kopra": {
      "command": "npx",
      "args": ["-y", "@kopra-dev/mcp"],
      "env": {
        "KOPRA_API_KEY": "kp_..."
      }
    }
  }
}

Add this to your MCP client configuration. Works with Claude Desktop, Cursor, and any MCP-compatible tool.

What you get

Everything you need to add custom fields to your product, nothing you don't.

Multi-tenant isolation
Each tenant sees only their own fields and values. Data is isolated at every layer.
TypeScript SDK
Full type safety. Autocomplete in your editor. npm install and go.
Embeddable field editor
Iframe or SDK integration. Drop a field editor into any page of your app.
Self-service configuration
Your customers create and manage their own fields. No tickets, no deployments.
REST API
26 endpoints. Full CRUD for field groups, fields, and values. API key authentication.
Webhooks
Get notified on every change. HMAC-SHA256 signed payloads. Automatic retries with backoff.
Audit logging
Every create, update, and delete is logged. Who changed what, and when.
Theming
Match your app's design. Custom CSS, colors, and fonts for the embedded editor.
MCP server
AI agents can read and write custom fields through the Model Context Protocol.
API documentation
Scalar API docs built in. Interactive API explorer at /api/docs.

Common questions before integrating

Where does the data live?

Custom field definitions and values are stored in Kopra's database, isolated per tenant. Your core data (users, orders, projects) stays in your database. You link them by passing your entity ID (e.g. "contact-42") to Kopra. Think of it as a sidecar - your schema stays clean, custom fields live next door.

Why not just add a JSON column?

A JSON column gives you storage. Kopra gives you storage, a type-safe field editor, per-tenant field definitions, tenant self-service configuration, validation, webhooks, audit logging, and a REST API. The JSON column is day one. The other 90% is the next three months.

Is this a hosted service or self-hosted?

Kopra is a hosted SaaS. You integrate via the SDK or REST API. No infrastructure to manage, no database to maintain, no upgrades to apply. Your data is isolated per account and exportable via API at any time.

Pricing

Free to start. Pay as you scale. No per-seat pricing.

Start building

Add custom fields to your product today. Free to start, scales with you.

Questions? hello@kopra.dev