The full contract for the native endpoint, POST /chat: every persona, effort levels and media in the answer. For coding tools and anything that speaks OpenAI's format, use the OpenAI-compatible API instead; the keys are the same. 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 here (the OpenAI-compatible endpoint streams); see Architecture 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, 3, 7, 9, 10, 11, 13. 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). |
| 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 you go: [attachment?image=catgirl] And a song: [attachment?music=Anthem] [attachment?gif=celebration]",
"sig": "q3Xh4n...",
"media": {
"images": [{ "url": "https://cdn.nekosapi.com/images/...", "type": "anime" }],
"music": [{ "url": "https://www.israelgpt.site/music/Anthem.mp3", "title": "Anthem" }],
"gifs": [{ "type": "gif", "search": "celebration" }]
},
"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 has [attachment?...] tags, and the key's Media setting is on. images, music, podcast and aiden are URLs ready to show or play; gifs are searches for you to run on KLIPY (below). |
| 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. |
Pictures, GIFs, songs and podcasts come as one tag, [attachment?type=value], which stays in reply to mark where each item goes; the items themselves are in media, in the same order. The types are anime (a picture; never NSFW through the API), gif=, sticker= and meme= a search, music= a song title, podcast, and aiden (one of Aiden's pictures from this site; a .gif or .webp). Every tag arrives complete: the server fills in anything the model left out. Pictures come from nekosapi; please show them with a “Powered by nekosapi” credit, as the web chat does. With the key's Media setting off, there are none of either.
GIFs, stickers and memes are in media.gifs as { type, search }, not as links: KLIPY wants the search made by your app, with your own free KLIPY key (partner.klipy.com), and the first result shown as KLIPY gives it, with its “Powered by KLIPY” credit. The endpoints are gifs, stickers and static-memes; see the examples. Ignore them if you don't want GIFs.
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.