The full contract for the one public endpoint. See Personas & Models for the values personaId and selectedModel take, and Errors for every error.
https://www.israelgpt.site/api/v1Sends a message, or a whole conversation, and returns one complete reply as JSON. No streaming: see FAQ for why.
| Header | Value |
|---|---|
| Authorization | Bearer YOUR_API_KEY (required) |
| Content-Type | application/json (required); the body can be up to 256 KB |
| User-Agent | Recommended: your app's name, like MyApp/1.0. The key's request log shows it. |
| Field | Type | Default | Notes |
|---|---|---|---|
| messages | array (required) | — | The conversation, oldest first: { role: "user" | "assistant", content: string, sig?: string }. 1–40 messages, 8,000 characters each and 48,000 in total. The last one must be from the user. |
| personaId | number | 1 | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. See Personas & Models. |
| selectedModel | string | "israelbot-1" | "israelbot-1" | "yahoobot-1". See Personas & Models. |
| effort | string | "low" | "low" | "medium" | "high": the sampling temperature (how creative or random). |
| uncensoredMode | boolean | false | Profanity-heavy replies. The content rules in the Terms of Service apply either way. |
| longMode | boolean | true | false asks for a short reply and caps it at about 500 tokens: handy where space is tight, like Discord. |
| timeZone | string | — | An IANA time zone, like "Asia/Jerusalem", for replies that mention the local time or date. UTC otherwise. |
Any other field is refused with 400 invalid_request, so a typo never goes unnoticed. There are no memories or About Me through the API, and nothing is kept between calls: send the conversation you want the model to see. The lore is added on the server on every call, so you always get the latest.
Every reply comes with a sig. To continue a conversation, send each earlier reply back as an assistant message with its sig, unchanged, right after the user message it answered:
{
"messages": [
{ "role": "user", "content": "Where is Haifa?" },
{ "role": "assistant", "content": "In the north, on the coast...", "sig": "q3Xh...from that reply" },
{ "role": "user", "content": "And Eilat?" }
]
}With a valid sig, the model treats the message as its own reply. Without one (or if the text was changed, or the sig came from another account), it's passed to the model as a quote from your app, not as something it said, and the answer's unverified_replies counts them. That stops anyone putting words in its mouth to talk it out of its rules. A sig belongs to the account, not the key, so it survives making a new key.
{
"id": "8f2c1e4a9b3d7f01-TLV",
"model": "israelbot-1",
"persona": { "id": 1, "name": "Normal" },
"reply": "Shalom! Here's Tel Aviv: [IMAGE] And a song: [music?song=Anthem]",
"sig": "q3Xh4n...",
"media": {
"images": [{ "url": "https://cdn.nekosapi.com/images/..." }],
"music": [{ "url": "https://www.israelgpt.site/music/Anthem.mp3", "title": "Anthem" }],
"podcast": { "url": "https://www.israelgpt.site/podcast/..." }
},
"flags": {},
"usage": { "prompt_tokens": 1412, "completion_tokens": 118 },
"created_at": "2026-09-27T12:00:00.000Z"
}| Field | Notes |
|---|---|
| id | Identifies this exchange. Quote it if you report a problem. |
| model | The model you asked for. |
| persona | The persona that was used. |
| reply | The reply text. See the note on bracket tags below. |
| sig | Send it back with this reply (see above). Absent when the request was blocked. |
| media | Only when the reply used [IMAGE], [music] or [podcast], and the key's Media setting is on. Every URL is ready to show or play. |
| flags | { crisis?: true, blocked?: true }. See Safety below. |
| usage | Tokens in and out, as the model counted them. The request log shows them too. |
| unverified_replies | Only when some assistant messages came without a valid sig: how many. |
| created_at | ISO 8601 time. |
[IMAGE], [music] and [podcast] stay in reply to mark where each item goes; the items themselves are in media. With the key's Media setting off, there are none of either.
The persona also uses tags only the web chat can show: [ACTION:...], [flashcard:...], [QUESTION:...], [create-file:...], [LGBTQ_IMG] and [musor_drop]. They do nothing through the API. Strip them or leave them; the reference bot's clean_reply() in Discord Bot is one way. Time and date tags are filled in for you.
Every message you send is checked, the assistant ones included, and so is the reply. These are normal 200 answers, not errors:
flags.blocked: the request or the reply broke the content rules. reply is a fixed refusal and there's no sig. Why isn't said, on purpose.flags.crisis: the message reads as someone in crisis. reply is support resources instead of the persona. Show it as it is.These use the same checks as the web chat; see Safety & Crisis Resources. Content that breaks the rules is flagged for review and can get the account suspended.
Every answer after the key check, a 429 included, says where you stand against your limits. See Rate Limits.