Getting started
Which path?
| Goal | Path |
|---|---|
| Ship Restaurant / Clinic / Real Estate / Booking / CRM on Marketplace | Metadata — no backend |
| Connect Focus ERP, Yaaz, ABM, on-prem POS / CRM | SDK → /qefro |
Marketplace App (default)
qefro app init → validate → package → publish → install → Qefro Runtime
External integration
npm install @qefro-ai/backend → POST /qefro → SDK Connection
See Runtime vs SDK.
Marketplace App (default)
qefro app init restaurant-pro --name "Restaurant Pro"
qefro app validate restaurant-pro
qefro app package restaurant-pro
qefro app install restaurant-pro
Tutorial: Managed Marketplace App · Build your first app.
Reference: qefro-marketplace-apps
apps/restaurant-pro-runtime (app id restaurant-pro-runtime). Commerce
example: apps/shopify-runtime (app id shopify-runtime).
HTTP identity and email OTP: HTTP tools.
External SDK (ERP / POS / CRM)
Prerequisites
- Node.js ≥ 18
- Org Portal access to Business Tools → SDK Connections
Install the SDK
npm install @qefro-ai/backend
Current documented package version: 1.7.0 (SDK_VERSION in the SDK).
Other languages:
| Language | Package |
|---|---|
| Python | qefro-backend |
| Rust | qefro-backend-sdk |
Minimal external app
import { Qefro } from '@qefro-ai/backend';
const app = new Qefro({
signingSecret: process.env.QEFRO_SIGNING_SECRET || 'dev-secret',
endpointPath: '/qefro',
});
app.tool(
'pingEcho',
{
description: 'Echo a message',
auth: 'none',
input_schema: {
type: 'object',
properties: { message: { type: 'string' } },
},
},
async (ctx) => ({ ok: true, message: ctx.parameters.message ?? 'pong' }),
);
const port = Number(process.env.PORT || 8090);
await app.listen({ port });
console.log(`Listening on http://0.0.0.0:${port}/qefro`);
Run:
export QEFRO_SIGNING_SECRET=dev-secret
node index.js
Connect (external)
- Expose HTTPS to
…/qefro(or tunnel for local: ngrok /host.docker.internal). - Org Portal → Business Tools → SDK Connections → Add Connection
- Name
- Webhook URL (must end at
/qefroor your configured path) - Signing Secret (same as
QEFRO_SIGNING_SECRET, or leave empty to let the platform generate one) - Enabled
- Test Connection
- Select a workspace → Sync Tools
API: POST /api/v1/org/sdk-connections with { name, webhook_url, enabled?, signing_secret? }.