Skip to content
Docs
API reference Go to dashboard
DocsIntegrationsYour own systems

Your own systems

For everything not on the list: the chatbot queries your own system in the conversation - via a custom action or an MCP server.

On this page

Custom action

Plan: Custom actions and your own MCP servers come with Business – up to 3 actions and MCP tools in total and one MCP server. Enterprise allows up to 10 actions and 5 MCP servers.

1
In the dashboard open Integrations and click Custom action.
2
Name the action and describe when the chatbot should use it (e.g. “When someone asks whether a product is in stock”).
3
Enter your system’s URL (https) and the method. GET sends the details in the URL, POST as JSON.
4
Optional: a header with a key (e.g. X-Api-Key) - stored encrypted.
5
Define up to eight details the chatbot should send (e.g. product), each with “Required” (on by default) and a type: text, number, whole number, yes/no, choice (fixed values), date or email. The chatbot asks for missing or invalid details before it calls your system – “three” is not a number, “moon” is not an industry.
6
Optional: response fields (e.g. status, plan.title, items[].name). The chatbot then only uses these fields of your system’s JSON response – internal fields stay out.
7
Faster with an existing API: under “Import from an API description” enter the address of your openapi.json (or paste the JSON). Paldra suggests the actions with all details, types and required fields – you tick the ones the chatbot may use. Path placeholders like /orders/{id} are filled from the conversation.
8
For actions that change something (POST), choose who triggers them: AI replies (right away), Customer confirms (the chatbot asks “Shall I run …?” with yes/no and only runs it after a yes), Draft (in chat a human takes over, in emails sending the draft runs it) or Agent.

What happens: When a question matches the description, the chatbot calls your system and phrases the answer only from what your system returns. Also works with Make and n8n (webhook with response).

i
Good to know: Only public https URLs, no redirects, 8 second timeout. If your system does not answer, the chatbot replies as usual. If your action returns personal data (e.g. an invoice link), keep “Verified customers only” on and in your system only return data for the address in X-Alpheris-Customer-Email – after checking the signature.

Edit and test

Below each action you find Edit (loads it into the form; the key and token secret stay if you leave the fields empty) and Test now: you enter sample values, Paldra really calls your system and shows the status, duration and the start of the response. For POST the page asks first – your system will then really carry out the action. Headers and keys are never shown.

Security & limits

Per action (for MCP per server) under Security & limits:

  • Verified customers only (on by default, also for existing actions): in chat, WhatsApp and Instagram the chatbot asks for the email address and sends a 6-digit code (valid for 10 minutes, at most 5 attempts). Signed-in customers are already verified. In emails only a technically verified sender address (DMARC/DKIM) counts; otherwise the chatbot looks nothing up and a team member takes over the action. Code emails are also limited per address, per requester and per shop. Only then does the action run – even one that only reads. Your system receives the verified address in X-Alpheris-Customer-Email (signed for custom actions).
  • At most per conversation (default 3) and per day (default 200, counted over 24 hours). When a limit is reached, the chatbot honestly tells the customer that it can't look it up right now.
  • Turn off after failures in a row (default 5): if your system answers with an error that many times in a row, Paldra turns the action off. The dashboard then shows a notice with the last error and Turn back on; saving the action turns it back on as well.
  • Channels: chat, email, WhatsApp and Instagram (all by default). In other channels the chatbot does not offer the action.

Approval, value limit and what the customer hears

Below every action that changes data (custom action with POST, MCP tool that does more than read) you find Approval:

  • Value limit: “If field > value, then Draft or Agent”. Below the limit, the level you set for the action applies (e.g. AI replies). You can pick fields of type Number or Whole number. A value that is not a number counts as above. The limit only raises the level, never lowers it. Shopify refunds keep their own amount limit from the Shopify rules.
  • Who may approve: everyone with the “Approve actions” team permission (owners and admins always) or only specific people. API keys and connected apps can never approve.

Approving in chat, WhatsApp and Instagram: if the AI prepared an action in the conversation, Approve in the inbox carries it out. The result is then shown on the action (Done, or Failed with the reason), and the customer gets a short message in the same channel: “Done: … has been carried out.” or “That didn't work: … Our team is looking into it and will get back to you.” When you reject, Paldra sends nothing – tell the customer why yourself.

i
24-hour window: WhatsApp and Instagram only accept free text up to 24 hours after the customer's last message. If it is older, the inbox says so before you approve; the action runs, but no message goes to the customer.

For developers: verifying calls, long-running jobs, API

Every custom action in the dashboard has a For developers button: signing secret, shop ID, callback address and a ready-made brief to copy – for your developer or for Claude Code (“connect this Paldra action to our system”). This is how you connect your own SaaS, e.g. “create a business plan for the customer”.

Verify calls (HMAC)

Every call carries X-Alpheris-Timestamp, X-Alpheris-Request-Id and X-Alpheris-Signature: v1=…; for verified customers also X-Alpheris-Customer-Email (signed in, confirmed by code, or a technically verified email sender). The signature is HMAC-SHA256(secret, "<timestamp>.<request_id>.<customer_email>.<body>") – <body> is the raw JSON for POST and the query string without “?” for GET. Reject calls whose timestamp is more than 5 minutes off.

python
import hmac, hashlib, time

def alpheris_ok(geheimnis: str, kopf: dict, body: bytes) -> bool:
    ts = kopf.get("X-Alpheris-Timestamp", "")
    if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
        return False
    basis = f"{ts}.{kopf.get('X-Alpheris-Request-Id', '')}.{kopf.get('X-Alpheris-Customer-Email', '')}.".encode() + body
    soll = "v1=" + hmac.new(geheimnis.encode(), basis, hashlib.sha256).hexdigest()
    return hmac.compare_digest(soll, kopf.get("X-Alpheris-Signature", ""))
javascript
const crypto = require("crypto");
function alpherisOk(geheimnis, h, rawBody) {
  const ts = h["x-alpheris-timestamp"] || "";
  if (!/^\d+$/.test(ts) || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const basis = `${ts}.${h["x-alpheris-request-id"] || ""}.${h["x-alpheris-customer-email"] || ""}.` + rawBody;
  const soll = "v1=" + crypto.createHmac("sha256", geheimnis).update(basis).digest("hex");
  const ist = h["x-alpheris-signature"] || "";
  return soll.length === ist.length && crypto.timingSafeEqual(Buffer.from(soll), Buffer.from(ist));
}

Sign-in with a token (OAuth, login)

If your system needs a token first, enter the token address, key and secret under “Sign-in with a token” in the form – Paldra fetches the token itself, keeps it until shortly before it expires and fetches a new one once on 401. Two types: OAuth 2 client credentials (e.g. Haufe axera link: the provider’s token address, client ID, client secret) and JSON login (e.g. casavi: POST …/v2/authenticate with your provider’s field names, token field token, header token without prefix; facilioo: login with API key). The secret is stored encrypted and never shown.

Sign-in via OAuth (“Connect with X”)

If your system is accessed through a sign-in page (OAuth 2 authorization code), set it up below the list of your custom actions under “Set up sign-in”: authorization URL, token URL, client ID, client secret, scopes and optionally the revocation URL. Enter the redirect URL shown, https://app.alpheris.com/integrations/oauth/callback, at the provider and tap “Connect with provider”. Paldra uses PKCE (S256), stores the access encrypted, sends it as Authorization: Bearer …, renews it before it expires and once after a 401. The sign-in is kept when you edit the action.

Long-running jobs

If your system needs more than 8 seconds (e.g. to create a document), reply right away with 202 and {"auftrag_id": "…", "hinweis": "Takes about 2 minutes."}. The chatbot tells the customer it is running. When the result is ready, report it signed (same secret, its own timestamp and request id) to https://api.alpheris.com/public/aktionen/rueckmeldung with the header X-Alpheris-Shop. The result appears in the customer’s chat. status: fertig (done), fehler (failed) or laeuft (progress, at most three).

bash
curl -X POST https://api.alpheris.com/public/aktionen/rueckmeldung \
  -H "Content-Type: application/json" \
  -H "X-Alpheris-Shop: 148" -H "X-Alpheris-Timestamp: $TS" -H "X-Alpheris-Request-Id: $ID" \
  -H "X-Alpheris-Signature: v1=$SIG" \
  -d '{"auftrag_id":"bp-77","status":"fertig","text":"Dein Businessplan ist fertig.","link":"https://dein-system.de/p/77"}'

Create actions via API

With an API key your developer (or Claude Code) creates actions directly: GET/POST /v1/aktionen, DELETE /v1/aktionen/{domain}. Same fields and checks as in the dashboard (plus optional grenzen, e.g. {"je_gespraech": 3, "je_tag": 200, "aus_nach": 5, "kanaele": ["chat", "mail"]}); on first creation the signing secret is returned once (geheimnis). Details in the API reference.

bash
curl -X POST "$ALPHERIS_BASE_URL/v1/aktionen" \
  -H "Authorization: Bearer $ALPHERIS_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Businessplan erstellen", "beschreibung": "Wenn ein Kunde einen Businessplan möchte",
       "url": "https://dein-system.de/alpheris/businessplan", "methode": "POST", "stufe": "kunde",
       "parameter": [{"name": "Branche", "typ": "auswahl", "werte": ["Café", "Handwerk"], "pflicht": true},
                     {"name": "Budget", "typ": "zahl"}],
       "antwort_felder": ["status", "plan.titel"]}'

Custom MCP server

1
Provide an MCP server with Streamable HTTP transport (e.g. https://mcp.yourstore.com/mcp).
2
In the dashboard open Integrations and click Custom MCP server.
3
Enter the URL and, if needed, an access token (Bearer).
4
Paldra reads the server’s tools and lists them.

What happens: When a question matches a tool, the chatbot calls it and answers from the result - like Fin with MCP connectors. Up to five servers with Enterprise, one with Business – there you choose per tool with “Use” which one takes one of the 3 slots. Security & limits work as for the custom action (per server, counted per tool); the verified address is sent in the X-Alpheris-Customer-Email header.

i
Good to know: Your server’s tool descriptions decide when the chatbot uses them - describe them clearly.

Connect with sign-in (Notion, Linear, Atlassian)

Notion, Linear and Atlassian (Jira, Confluence) offer their own MCP servers with sign-in. You need no key and no developer app: you sign in with the provider and allow Paldra access.

1
Open Integrations in the dashboard and click Notion in chat, Linear in chat or Atlassian in chat.
2
Tap “Connect …”. A new tab opens the provider’s sign-in page. Sign in and confirm the access.
3
The tab closes, the Integrations page reloads and shows the account, the granted permissions and the tools.
4
Tools that create or change something start as Draft: a person approves them. You can change this per tool. Reading is free.
i
Important: the chatbot sees everything the signed-in account may see – also for your customers. Ideally sign in with a separate account that only sees content customers may learn.

Your own MCP server with sign-in: if your server requires a sign-in (response 401 with WWW-Authenticate), just enter the address and tap “Connect with sign-in”. Paldra reads the server’s sign-in details (OAuth Protected Resource Metadata, Authorization Server Metadata), registers itself as an app (Dynamic Client Registration) and opens the sign-in. If your server offers no automatic app registration, connect it with an access token.

What Paldra stores: the access encrypted, the granted permissions and the expiry. Paldra renews the access itself shortly before it expires. If the provider rejects the renewal, the tile shows “Sign-in expired”, you get an email, and the chatbot only uses the tools again after “Reconnect”. When you disconnect, Paldra revokes the access with the provider where supported.

Redirect URL (for custom actions with sign-in): https://app.alpheris.com/integrations/oauth/callback

Statuspage

1
In the dashboard open Integrations and click Statuspage.
2
Enter your Atlassian status page URL (e.g. https://status.yourstore.com).

What happens: When someone asks about an outage (“Is checkout down?”), the chatbot answers with the open incidents and maintenance on your status page - or that everything is running normally.

Workflows

1
In the dashboard, open Integrations and click Workflows.
2
Choose when the workflow starts: new ticket, new lead, new conversation, handover to a person, ticket closed, conversation closed or new customer message.
3
Optional: up to two conditions, e.g. “Subject contains complaint, broken” or “Source is chat”. Several values separated by commas – one is enough; all rows must match.
4
Choose the target: an address (Make, n8n, Zapier or your own system), a team chat (Slack, Teams, Discord, Google Chat, Mattermost, Rocket.Chat, Webex) or one of your custom actions (POST).

What happens: When the event occurs and the conditions match, Paldra sends it to the target within seconds – each event exactly once. An address receives the same JSON body as webhooks, signed with the workflow’s secret (in the dashboard under “Secret”); a custom action receives {"ereignis", "workflow", "daten"}, signed with its own secret and the header X-Alpheris-Event. Each workflow shows when it last ran and whether it worked.

Signed-in customers

1
In the dashboard open Integrations and click Logged-in customers.
2
Click “Generate key” and keep the key on your server. It is shown only once.
3
On your server, compute for the logged-in customer: HMAC-SHA256 with the key over their email in lowercase, as hex text. PHP: hash_hmac('sha256', strtolower($email), $key). Node: crypto.createHmac('sha256', key).update(email.toLowerCase()).digest('hex'). Python: hmac.new(key.encode(), email.lower().encode(), hashlib.sha256).hexdigest().
4
On pages with logged-in customers, put this before the widget code: window.AlpherisKunde = { email: "…", name: "…", hash: "…" }.

What happens: If the signature matches, the email is marked as verified in the conversation. The chatbot then shares order status and open invoices without asking, as long as the email matches the order or invoice; custom actions and MCP tools run without a code. Without a valid signature nothing changes.

i
Good to know: Never put the key in the browser – anyone who has it could pose as any customer. A new key invalidates the old one within a minute.

Paldra API

1
Create a key in the dashboard under Workspace, API keys.
2
For events: add a URL under Workspace, Webhooks.

What happens: Your system reads and writes conversations, tickets and leads. Details are in the API reference.

Custom action: PUT, PATCH, DELETE, headers, body template, GraphQL

Under “More: headers, body template, GraphQL” in the custom action form (or via /v1/aktionen) you can do more than GET and POST:

  • Methods: GET and DELETE send the details in the URL, POST, PUT and PATCH as JSON. PUT and PATCH start at least at the draft stage; the AI never runs DELETE on its own – only after “customer confirms”, as a draft or by a team member.
  • Additional headers: up to 8, values stored encrypted (e.g. CF-Access-Client-Id and CF-Access-Client-Secret for Cloudflare Access). Not allowed: Host, Content-Length, Content-Type and any X-Alpheris-….
  • Body template: valid JSON with placeholders {{detail}} in quotes, nested as deep as you like. If a placeholder stands alone in the string, the value keeps its type (a number stays a number); if an optional detail is missing, the key is left out.
  • GraphQL: POST with query and a variables template. A query only reads, a mutation is an action with a stage. If the server answers with errors only, the call counts as failed.
json
{
  "customer": { "email": "{{email}}", "name": "{{name}}" },
  "items": [ { "sku": "{{item}}", "quantity": "{{quantity}}" } ],
  "note": "Ordered in chat: {{item}}"
}

The OpenAPI import now also reads YAML (openapi.yaml) and suggests actions for GET, POST, PUT, PATCH and DELETE. Signature, address check, 8-second timeout and “no redirects” apply to all methods alike; the body is limited to 100 KB.

If your system is not on the public internet (inventory, property management, ERP in the company network), read Connect internal systems.

Lookup tables

For knowledge that lives in a table: delivery zones by postcode, opening hours per branch, spare part numbers, maintenance contracts, units and contacts. The AI looks things up in it – read only, never writes.

1
Open Integrations in the dashboard and click Lookup tables.
2
Give the table a name and describe when the AI should look things up in it.
3
Upload a CSV or Excel file (.xlsx, up to 5 MB, 20,000 rows) or enter a public link: Google Sheets via “File → Share → Publish to web → CSV”, OneDrive via a sharing link “Anyone with the link”. No Google or Microsoft sign-in needed. We reload links every day.
4
Choose up to three search columns (e.g. postcode, part number). Case, spaces and hyphens do not matter when searching.
5
If the table contains personal data, tick the box – the customer check is then on and needs an email column.

What happens: When a customer asks something that is in a table, the AI fetches at most five matching rows and phrases the answer only from them. With the customer check, only a securely identified customer gets anything – in chat signed in via signed-in customers, by email via their sender address if its authenticity is verified via DKIM/DMARC – and only rows with their own email address. An address typed into the chat is never enough.

i
Good to know: We detect encoding (UTF-8, UTF-16, Windows-1252) and delimiter (semicolon, comma, tab) ourselves. If a link’s column names change, we keep the previous state and show a notice. The tenant list for property managers stays as it is – it matches emails to the sender; a lookup table is the general form.