5 minutes to a live widget
Quickstart
Create an account
Open the console
sk_jcil_... key (shown once) and a public pk_jcil_... ID used for embedding.Customize the widget
Paste the embed
<iframe
src="https://jcil.ai/embed/pk_jcil_your_key"
width="400"
height="600"
frameborder="0"
style="border:0;border-radius:12px;"
></iframe>Test it
Two keys, different jobs
Authentication
Every JCIL Cloud integration uses two keys:
- Private secret —
sk_jcil_.... Shown once at creation. Use for server-to-server API calls viaAuthorization: BearerorX-API-Key. Never expose this in client code. - Public ID —
pk_jcil_.... Safe to put in HTML. Used for the widget iframe URL and the embed.js data attribute. Protected by the domain allow-list you configure in the console.
For direct API calls (OpenAI-compatible endpoint):
curl https://jcil.ai/api/v1/chat/completions \
-H "Authorization: Bearer sk_jcil_..." \
-H "Content-Type: application/json" \
-d '{
"model": "jcil-deep",
"messages": [{"role": "user", "content": "What does Scripture say about forgiveness?"}]
}'Or with the OpenAI SDK:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk_jcil_...",
baseURL: "https://jcil.ai/api/v1",
});
const res = await client.chat.completions.create({
model: "jcil-deep",
messages: [{ role: "user", content: "Hello" }],
});Three JCIL tiers
Models
Fast
jcil-fast~$0.01 / typical message
Fast, low-cost. Good for FAQ bots, high-volume deployments, quick answers.
Standard — recommended default
jcil-standard~$0.03 / typical message
The balanced choice. Sharp reasoning, faithful output, cost-effective.
Deep
jcil-deep~$0.10 / typical message
Deepest reasoning. Use when the question is complex (theology, counseling, technical support).
In the console you pick which models a key can use and which is the default. Per-request override via the model field — but only allowed models work.
One line of HTML
Widget embed (iframe)
The simplest integration. Drop anywhere HTML works — WordPress, Squarespace, Wix, Webflow, raw HTML.
<iframe
src="https://jcil.ai/embed/pk_jcil_your_key"
width="400"
height="600"
frameborder="0"
style="border:0;border-radius:12px;box-shadow:0 8px 40px rgba(0,0,0,0.2);"
></iframe>For a responsive fill-the-container embed:
<div style="position:relative;padding-top:75%;max-width:480px;">
<iframe
src="https://jcil.ai/embed/pk_jcil_your_key"
style="position:absolute;inset:0;width:100%;height:100%;border:0;border-radius:12px;"
></iframe>
</div>Chat-in-the-corner widget
Floating bubble (script)
For a chat button in the bottom-right corner that opens in a modal — the pattern used by Intercom, Drift, and Zendesk — drop this script anywhere before the closing </body>:
<script
src="https://jcil.ai/embed.js"
data-key="pk_jcil_your_key"
data-position="bottom-right"
defer
></script>Options (all data-* attributes):
data-key— your pk_jcil_... public ID (required)data-position—bottom-right(default),bottom-leftdata-label— bubble label, defaults to "Chat"data-accent— override the button color (defaults to widget's accent)
The script creates a single floating button. Click opens a modal with the full widget. ESC or click-outside closes it. Fully keyboard-accessible.
Your persona, our guardrails
Custom identity
The custom_prompt field (2,000 chars max) shapes your assistant's tone, focus, and persona. It's wrapped insideJCIL's base biblical identity block — so you can customize identity, but never override Scripture-aligned values.
Example for a church:
You are St. Paul Baptist Church's AI assistant.
Tone: warm, pastoral, hospitable.
Format: answers under 120 words when possible, offer next steps.
Sign-off: "— Pastor Mike's AI helper"
If someone asks about:
• Service times: link to /services
• Visiting: offer to schedule with our hospitality team
• Prayer: acknowledge warmly and offer the prayer request form
• Doctrine: keep answers simple, point to Pastor Mike for depth
Never discuss politics unless scripturally relevant.Example for a Christian university:
You are the admissions assistant for Providence Christian University.
Tone: professional, encouraging, student-focused.
Audience: prospective students, parents, current students.
Format: direct answers with specific links to admissions, financial aid,
or the registrar when relevant.
Key pages you should reference:
• /admissions for application details
• /financial-aid for FAFSA + scholarships
• /academics for degree programs
• /student-life for housing, chapel, activities
Do not speculate on policies — if unsure, direct to
admissions@provchristian.edu.Values you cannot override with your custom prompt:
- Faithful to Scripture and the Gospel of Jesus Christ
- Pro-life in every phrasing
- Refusal to produce sexually explicit or blasphemous content
- Refusal to affirm teachings that directly contradict the Bible
- Points users in crisis to real human support (counseling, pastoral care)
Your website, your answers
Knowledge sources
Provide up to 10 URLs. We fetch each page, strip nav/footer/scripts, cache the main content for 1 hour, and inject it into every chat request. Budget: 60KB of text total across all sources (~15K tokens).
Great candidates:
- About / Who We Are
- Statement of Faith / Beliefs / Doctrine
- Service times / Events calendar
- Staff directory / Contact page
- Admissions / Program pages (universities)
- FAQ pages
- Ministry descriptions
- Give / Donate page
When it's time for real RAG:if your knowledge base grows past 100 pages, reach out — we're rolling out pgvector-backed embeddings for Enterprise customers.
OpenAI-compatible
API reference
Base URL: https://jcil.ai/api/v1
POST /chat/completions
OpenAI chat completions format. Supports streaming via stream: true.
{
"model": "jcil-deep", // or "jcil-standard", "jcil-fast"
"messages": [
{ "role": "system", "content": "..." }, // optional — merged with JCIL base
{ "role": "user", "content": "What time is Sunday service?" }
],
"stream": false // set true for SSE streaming
}Response (non-streaming)
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1776400000,
"model": "jcil-deep",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "..." },
"finish_reason": "stop"
}]
}Response (streaming)
Server-Sent Events (SSE). Each chunk is a data: {...} line with an incremental delta. Terminated by data: [DONE].
GET /chat/completions
Returns the available model IDs. Lets OpenAI SDK clients probe compatibility.
Protect your credits, protect the visitor
Rate limits
- Per widget visitor — 10 messages/min, 100/hour per IP. Prevents abuse from burning your credits.
- Per API key (Developer) — 60 requests/min.
- Per API key (Business) — 300 requests/min. Email support@jcil.ai to upgrade.
- Per organization (Enterprise) — custom. 1500+/min available.
Rate limit responses return HTTP 429 with a Retry-Afterheader. If Upstash Redis is unavailable, we fail open — you won't be blocked by infra hiccups.
When something goes wrong
Error codes
invalid_requestMalformed JSON or missing required fields.
invalid_api_keyThe sk_jcil_... key is wrong or revoked.
insufficient_creditsYour org's credit balance won't cover the next request. Add credits.
origin_not_allowedWidget loaded on a domain not in the key's allow-list.
rate_limit_exceededToo many requests. Retry after the window.
api_errorOur problem. Retry with exponential backoff.
upstream_unavailableUpstream temporarily degraded. Our rotation handles most of these.
Need something we haven't covered?
Email support@jcil.ai. Pilots get direct-to-founder support during the first 3 months.