orqAgent
Everything you need to create, configure, and integrate AI agents into your product — without writing infrastructure code.
Introduction
orqAgent is a no-code platform that lets you build custom AI agents powered by models like Claude, GPT-4, and Gemini. Each agent has its own personality, knowledge base, guardrails, and REST API endpoint — ready to embed in any product in minutes.
Custom agents
Configure model, tone, system prompt, and persona
Knowledge base
Upload PDFs and text files — the agent cites them automatically
REST API
Call any agent from your app with a single HTTP request
Quick Start
From sign-up to your first API call in under 5 minutes.
Create your account
Create your first agent
Test it in the Playground
Generate an API key
Make your first API call
curl -X POST https://your-domain.com/api/agents/{agent_id}/run \
-H "Content-Type: application/json" \
-H "X-API-Key: orq_your_api_key" \
-d '{"user_input": "Hello!"}'Creating an Agent
An agent is the core building block. It bundles a model, a personality, and optional capabilities (knowledge base, guardrails, rate limits) into a single deployable unit.
Basic settings
| Field | Type | Description |
|---|---|---|
| Namerequired | string | Display name — used in the dashboard and analytics. |
| Description | string | Short description of what the agent does. |
| Modelrequired | enum | LLM to use: Claude Haiku / Sonnet / Opus, GPT-4, Gemini 2.0 Flash. |
| Temperature | float | Creativity level — 0 is deterministic, 1 is most creative. Default 0.7. |
| Max tokens | integer | Maximum tokens in a single response. Default 1024. |
| System promptrequired | text | Core instructions the model always follows. This is the heart of your agent. |
Persona fields
Persona fields let you shape how the agent behaves without cluttering the system prompt.
| Field | Type | Description |
|---|---|---|
| Role | string | The agent's job title, e.g. "Customer Support Specialist". |
| Tone | enum | Professional · Friendly · Concise · Technical · Creative |
| Language | string | Language the agent responds in (e.g. "French", "Spanish"). |
| Constraints | text | Hard rules — e.g. "Never discuss competitors. Always end with a CTA." |
| Welcome message | text | First message shown in the Playground and in embedded widgets. |
Advanced options
| Field | Type | Description |
|---|---|---|
| Response format | enum | text · markdown · json · bullet_points — controls output structure. |
| JSON schema | text | When format is JSON, paste a JSON Schema to enforce the response shape. |
| Rate limit/min | integer | Maximum calls per minute from a single session. |
| Rate limit/day | integer | Maximum calls per day across all sessions. |
| Max tokens/response | integer | Overrides the global max_tokens for this agent's API responses. |
Playground
The Playground is a fully-featured chat interface wired directly to your agent — same model, same system prompt, same knowledge base as the live API. Use it to iterate on prompts before going to production.
Knowledge Base
Upload documents and your agent automatically retrieves the most relevant chunks for each user question. This is done via retrieval-augmented generation (RAG) — no manual prompt engineering required.
Supported formats
How it works
API Keys
API keys let your backend or external tools call any of your agents over HTTP without going through the dashboard UI.
Creating a key
1. Go to API Keys in the sidebar.
2. Click Create key and enter a descriptive name (e.g. "Production backend").
3. Copy the key immediately — it starts with orq_ and is shown only once.
Key properties
| Field | Type | Description |
|---|---|---|
| Prefix | string | First 10 characters — shown in the dashboard to identify a key. |
| call_count | integer | Total number of API calls made with this key. |
| last_used_at | datetime | Timestamp of the most recent call. |
| expires_at | datetime | Optional expiry date. Expired keys are automatically rejected. |
| is_active | boolean | Disable a key temporarily without revoking it. |
REST API Reference
Every agent exposes a simple HTTP endpoint. Authenticate with your API key in theX-API-Key header.
/api/agents/{agent_id}/runRequires API keySend a message to an agent and receive a response. The conversation history is automatically maintained when you reuse the same session_id.
Authentication
X-API-Key: orq_your_api_key_hereRequest body
| Field | Type | Description |
|---|---|---|
| user_inputrequired | string | The user's message. 1–10 000 characters. |
| session_id | string | Conversation session identifier (max 128 chars). Pass the same value across turns to maintain history. Omit for one-shot calls. |
Response body
| Field | Type | Description |
|---|---|---|
| id | uuid | Unique run identifier. |
| agent_response | string | The agent's reply text. |
| session_id | string | Echo of the session_id used for this run. |
| prompt_tokens | integer | Tokens consumed by the input (system prompt + history + user message). |
| completion_tokens | integer | Tokens in the agent's response. |
| cost | string | Estimated USD cost for this run (6 decimal places). |
| latency_ms | integer | Wall-clock latency of the LLM call in milliseconds. |
| status | string | "success" | "error" | "timeout" | "rate_limited" |
| used_knowledge_base | boolean | True if document chunks were injected into this run. |
| chunks_injected | integer | Number of KB chunks included in the context. |
Example — cURL
curl -X POST https://your-domain.com/api/agents/YOUR_AGENT_ID/run \
-H "Content-Type: application/json" \
-H "X-API-Key: orq_your_api_key" \
-d '{
"user_input": "What is your return policy?",
"session_id": "user-abc-session-1"
}'Example — JavaScript (fetch)
const response = await fetch(
`https://your-domain.com/api/agents/${AGENT_ID}/run`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.ORQ_API_KEY,
},
body: JSON.stringify({
user_input: userMessage,
session_id: sessionId, // keep across turns for memory
}),
}
);
const data = await response.json();
console.log(data.agent_response);Example — Python
import httpx, os
BASE_URL = "https://your-domain.com"
AGENT_ID = "your-agent-id"
API_KEY = os.environ["ORQ_API_KEY"]
def chat(user_input: str, session_id: str) -> str:
r = httpx.post(
f"{BASE_URL}/api/agents/{AGENT_ID}/run",
headers={"X-API-Key": API_KEY},
json={"user_input": user_input, "session_id": session_id},
timeout=30,
)
r.raise_for_status()
return r.json()["agent_response"]
reply = chat("Summarise your pricing plans.", "session-42")
print(reply)Public agent endpoint (no auth)
If you've toggled Public on an agent, it can be called without an API key. Usage is still billed to your account.
/api/public/agents/{agent_id}/chatNo auth required# No API key needed — works from any browser or server
curl -X POST https://your-domain.com/api/public/agents/YOUR_AGENT_ID/chat \
-H "Content-Type: application/json" \
-d '{"user_input": "Hello!"}'Error codes
| Field | Type | Description |
|---|---|---|
| 400 | Bad Request | Input blocked by guardrail, or invalid request body. |
| 401 | Unauthorized | Missing or invalid API key. |
| 403 | Forbidden | Agent is private, disabled, or not owned by this key's user. |
| 404 | Not Found | Agent ID does not exist. |
| 429 | Too Many Requests | Rate limit exceeded (per-minute or per-day). |
| 502 | Bad Gateway | LLM provider returned an error — retry with exponential backoff. |
Guardrails
Guardrails are automatic input filters that block toxic, harmful, or off-topic messages before they reach the LLM — protecting your quota and your users.
What gets blocked
When a guardrail fires
The API returns HTTP 400 with a clear error message. The run is still logged with blocked_by_guardrail: true so you can track block rates in the Analytics tab.
{
"error": "Input blocked by content guardrail",
"code": "GUARDRAIL_BLOCKED"
}Integrations
Integrations connect an agent to a messaging channel or a knowledge source. Every integration is configured per agent from its detail page, and all credentials (tokens, passwords, OAuth secrets) are stored AES-256-GCM encrypted — they are never returned to the browser once saved.
Available integrations
| Integration | Type | How it connects |
|---|---|---|
| Slack | Channel | OAuth install — the bot replies to mentions and channel messages. |
| Telegram | Channel | Paste a BotFather token — the webhook is registered automatically. |
| Channel | Meta Cloud API — enter phone number ID + access token. | |
| Email Inbox | Channel | IMAP polling + SMTP replies, with a human approval queue. |
| Notion | Knowledge | OAuth — syncs page/database content into the knowledge base. |
| Google Docs | Knowledge | OAuth — imports selected documents into the knowledge base. |
Connecting a channel
1. Open your agent and go to the Integrations tab.
2. Pick a channel and follow its flow — OAuth for Slack/Notion/Google, or paste a token for Telegram/WhatsApp.
3. Once connected, incoming messages run through the same model, system prompt, and knowledge base as the API.
/api/integrations/… on the API host — the dashboard wires these up for you, so you normally don’t paste URLs by hand (Telegram’s webhook, for example, is set automatically on connect).Email Inbox
The Email Inbox lets an agent watch a mailbox: it reads incoming mail over IMAP, drafts a reply with the agent, and (optionally) sends it back over SMTP. It is configured per agent under the Email Inbox tab — no environment variables required, all credentials are stored encrypted.
SMTP_* environment variables. The global SMTP_* settings are only used by the unrelated Scheduled agents email output.How it works
Built-in safety filters
So the agent doesn’t reply to the wrong things, several guards are always on:
from,subject, orbody fields to force process or ignore on specific messages.Configuration fields
| Field | Type | Description |
|---|---|---|
| imap_host / imap_portrequired | string / int | Incoming (read) server. Port 993 = implicit SSL (the only encrypted mode supported). |
| imap_user / imap_passwordrequired | string | Mailbox login. For Gmail/Outlook use an app password, not the account password. |
| smtp_host / smtp_portrequired | string / int | Outgoing (send) server. Port 587 with STARTTLS (port 465 / implicit SSL is not supported). |
| smtp_user / smtp_passwordrequired | string | Send login — usually the same as IMAP. |
| from_name | string | Display name on replies, e.g. "Support orqAgent". Max 128 chars. |
| check_interval_minutes | integer | Polling cadence, 1–60. The per-minute worker only polls once this has elapsed. Default 5. |
| auto_reply | boolean | Send without review. OFF (default) = drafts go to the approval queue. |
| reply_requires_approval | boolean | Keep a human in the loop. Leave ON while testing. Default ON. |
| filter_rules | array | Optional rules: { field: from|subject|body, contains, action: process|ignore }. |
Provider settings
| Provider | IMAP host | SMTP host | Ports |
|---|---|---|---|
| Gmail / Google Workspace | imap.gmail.com | smtp.gmail.com | 993 / 587 |
| Outlook / Microsoft 365 | outlook.office365.com | smtp.office365.com | 993 / 587 |
| Generic | your provider's IMAP | your provider's SMTP | 993 / 587 |
Setting it up
Fill in IMAP & SMTP
Test the IMAP connection
Save with approval ON
Send a test email & poll
no-reply@), then click « Relever maintenant » (or wait for the next interval). The message appears under En attente with a suggested reply.Review & send
Troubleshooting
| Field | Type | Description |
|---|---|---|
| AUTHENTICATIONFAILED | IMAP error | Using the account password instead of an app password, or 2-Step Verification not enabled. |
| Host not allowed | SSRF guard | You pointed it at localhost / an internal host. Use a public provider. |
| Connects but no emails | Empty queue | The message is read / older than 24 h, the sender looks like no-reply, or the interval hasn't elapsed (use « Relever maintenant »). |
| Drafts created but Send fails | SMTP | Check the SMTP host/port (587 + STARTTLS) and that the SMTP credentials are filled in. |
Plans & Limits
- 3 agents
- 500 runs / month
- All models available
- Knowledge base (up to 5 docs)
- API key access
- Community support
- Unlimited agents
- 10 000 runs / month
- All models available
- Knowledge base (unlimited docs)
- Priority support
- Advanced analytics
HTTP 429 with code QUOTA_EXCEEDED. Upgrade to Pro from the Pricing page.