Authentication

Base URL: https://telepath.lemma.company/api/v1. Authenticate each request with Authorization: Bearer <access_token>. A Telegram bot token is not a Telepath OAuth token.

  1. Read OAuth server metadata and register a client at POST /register with your exact redirect URI.
  2. Use Authorization Code with S256 PKCE: a fresh verifier/challenge for each login, /authorize for consent and /token for the exchange.
  3. Use the canonical resource https://telepath.lemma.company/mcp, even for REST. Request telegram.read for reads and telegram.write for writes. Each endpoint below names its scope; HTTP POST does not itself mean write access.
  4. Store tokens in your integration's credential store and use the refresh-token grant at /token for expiry. Follow your registered client's token authentication method. Never share one account's credential across unrelated users.

The n8n credential handles registration, PKCE and refresh. A custom Make HTTP/OAuth connection must support those requirements; an end-to-end Make login/refresh flow has not been verified here.

Requests and responses

  • GET inputs go in the query string. Chat IDs in paths are decimal integers. JSON POST inputs use numbers for numeric IDs and Content-Type: application/json. POST read actions with no options still need {}.
  • Unknown input fields are rejected. POST query parameters are rejected. JSON body limit: 256 KB. IDs must be safe integers; chat IDs can be negative but not zero, message/note IDs must be positive.
  • Date-time strings use ISO 8601 with Z or an explicit offset. Reminder timezone is an IANA identifier. Domain rules below supplement the request schema.
  • HTTP 200 returns the business object directly, without a universal data wrapper. Preserve unknown response fields, setup/history notices, source/coverage metadata and quota information. A successful read can be empty.
  • Success examples are synthetic, illustrative subsets; optional fields may be omitted or null. Photo batches can contain per-item errors. Reminder status scheduled is not proof of delivery.
  • Most reads return a bounded window, without a complete pagination cursor. Only reminders/list documents offset pagination. The gateway limit is 120 requests per minute per account, shared across credentials; Telegram and plan limits also apply.

Archive, Session and account boundaries

Signing in authorizes access to an account; it does not itself collect Telegram history. Bot API archives collect permitted new messages. Older archive history is imported separately. There is no outgoing webhook for every message in this REST API; scheduled reads are polling and can miss messages during bursts or downtime.

When connected and enabled, Session takes priority for the five chat/message discovery and text-read operations. These results include source: "telegram_session", history_archived: false, effective_limit, coverage and partial. Session can cap reads below the requested limit (currently up to 50); discovery covers recent dialogs rather than a complete directory. A Session error or empty result does not silently switch to the archive.

REST-specific limitation: any operation carrying chat_id checks archive membership before dispatch, except the separate bot inbox. That includes a single-chat read and a chat-filtered search, even if Session is connected. A chat discovered only through Session can therefore return 404 chat_not_found here. Bot inbox IDs are checked against that inbox instead. This reference does not promise Session-based sending.

Bot inbox messages are not channel Direct Messages or personal Business messages. Private Business replies need reply permission and an incoming message within the last 24 hours. Group sends use the bot identity. Channel operations require current ownership, connection and the applicable bot rights. Scope alone does not override these checks or account capabilities.

Expand an operation for every parameter, nested field, request example and response shape. Example calls are not executed by this page. Replace synthetic IDs and URLs with authorized targets before running a write.

Chats & groups

GET/chats/searchFind Telegram chats

Scope: telegram.read · Read-only action

Find a chat by name, username or numeric ID. This is not a global Telegram directory search.

Query parameters

ParameterType / presenceDescription / constraints
querystring
Required
Search text; Notes search also accepts an empty string.
minLength: 1 · maxLength: 1000
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 20 for archive reads.
minimum: 1 · maximum: 100

Example request

curl 'https://telepath.lemma.company/api/v1/chats/search?query=Example&limit=10' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN"

HTTP 200 response

count and chats; search can include query. Chat entries include chat_id, name, type, username and archive coverage fields. Session reads add source, coverage and partial metadata.

{
  "count": 1,
  "chats": [
    {
      "chat_id": 123456789,
      "name": "Example contact",
      "type": "private",
      "username": null,
      "message_count": 1
    }
  ]
}
GET/messages/searchSearch Telegram messages

Scope: telegram.read · Read-only action

Search available message text. Optionally narrow to a chat and a lower date bound.

Query parameters

ParameterType / presenceDescription / constraints
querystring
Required
Search text; Notes search also accepts an empty string.
minLength: 1 · maxLength: 1000
chat_idinteger
Optional
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
sincestring
Optional
ISO 8601 lower date bound, with Z or an explicit UTC offset.
format: date-time
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 30 for archive reads.
minimum: 1 · maximum: 200

Example request

curl 'https://telepath.lemma.company/api/v1/messages/search?query=details&limit=20' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN"

HTTP 200 response

count and messages; single-chat reads include chat, search includes query, and date-filtered reads can include since. Message entries include chat_id, message_id, date, direction, text, text_source, sender and available media/transcript metadata.

{
  "count": 1,
  "messages": [
    {
      "chat_id": 123456789,
      "message_id": 42,
      "chat_name": "Example contact",
      "date": "2026-11-05T08:00:00.000Z",
      "direction": "incoming",
      "text": "Could you send the details?",
      "text_source": "written",
      "message_type": "text"
    }
  ]
}
GET/chats/{chat_id}/messagesRead one chat

Scope: telegram.read · Read-only action

Read a bounded message window in a chat. The REST gateway requires this chat to exist in the account archive before delegating a read.

Path: chat_id — required nonzero safe integer; chat must exist in this account archive.

Query parameters

ParameterType / presenceDescription / constraints
beforestring
Optional
ISO 8601 upper date bound, with Z or an explicit UTC offset.
format: date-time
sincestring
Optional
ISO 8601 upper date bound, with Z or an explicit UTC offset.
format: date-time
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 50 for archive reads.
minimum: 1 · maximum: 200

Example request

curl 'https://telepath.lemma.company/api/v1/chats/123456789/messages?limit=20' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN"

HTTP 200 response

count and messages; single-chat reads include chat, search includes query, and date-filtered reads can include since. Message entries include chat_id, message_id, date, direction, text, text_source, sender and available media/transcript metadata.

{
  "count": 1,
  "messages": [
    {
      "chat_id": 123456789,
      "message_id": 42,
      "chat_name": "Example contact",
      "date": "2026-11-05T08:00:00.000Z",
      "direction": "incoming",
      "text": "Could you send the details?",
      "text_source": "written",
      "message_type": "text"
    }
  ]
}
POST/chats/{chat_id}/messagesSend a message

Scope: telegram.write · Write action

Send to a known private Business or group chat. Business replies require reply permission and an incoming message within the last 24 hours; groups send as the bot. Use channel post operations for channels. Ordinary sends have no idempotency key.

Path: chat_id — required nonzero safe integer; chat must exist in this account archive.

JSON body

ParameterType / presenceDescription / constraints
textstring
Required
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
minLength: 1 · maxLength: 4096
reply_to_message_idinteger
Optional
Optional message to reply to.
minimum: -9007199254740991 · maximum: 9007199254740991
message_thread_idinteger
Optional
Optional message to reply to.
minimum: -9007199254740991 · maximum: 9007199254740991

Example request

curl 'https://telepath.lemma.company/api/v1/chats/123456789/messages' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"text":"Thanks for your message."}'

HTTP 200 response

sent, chat_id, chat_name, message_id, date and text.

{
  "sent": true,
  "chat_id": 123456789,
  "chat_name": "Example contact",
  "message_id": 43,
  "date": "2026-11-05T08:01:00.000Z",
  "text": "Thanks for your message."
}
POST/messages/photosGet multiple archived photos

Scope: telegram.read · Read-only action

Retrieve up to five photos from one archived chat. Returns photo data and expiring links; n8n does not render the ChatGPT photo widget.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
message_idsarray
Required
1–5 positive message IDs from one chat.
minItems: 1 · maxItems: 5

Example request

curl 'https://telepath.lemma.company/api/v1/messages/photos' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"message_ids":[42]}'

HTTP 200 response

count, bytes_per_photo and photos. Each entry has message_id and photo fields, or an error for that item; HTTP 200 does not mean every photo loaded.

{
  "count": 1,
  "bytes_per_photo": 250000,
  "photos": [
    {
      "message_id": 42,
      "data": "<base64 image bytes>",
      "mimeType": "image/jpeg",
      "bytes": 12345,
      "caption": null,
      "url": null
    }
  ]
}
POST/chats/listList Telegram chats

Scope: telegram.read · Read-only action

List archived chats, including connected channels. An empty archive is not proof that Telegram has no messages.

JSON body

ParameterType / presenceDescription / constraints
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 20 for archive reads.
minimum: 1 · maximum: 200

Example request

curl 'https://telepath.lemma.company/api/v1/chats/list' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"limit":10}'

HTTP 200 response

count and chats; search can include query. Chat entries include chat_id, name, type, username and archive coverage fields. Session reads add source, coverage and partial metadata.

{
  "count": 1,
  "chats": [
    {
      "chat_id": 123456789,
      "name": "Example contact",
      "type": "private",
      "username": null,
      "message_count": 1
    }
  ]
}
POST/messages/recentRead recent messages

Scope: telegram.read · Read-only action

Read recent saved messages across chats. New collection starts after Telegram connection; old history needs import.

JSON body

ParameterType / presenceDescription / constraints
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 20 for archive reads.
minimum: 1 · maximum: 200
sincestring
Optional
ISO 8601 lower date bound, with Z or an explicit UTC offset.
format: date-time

Example request

curl 'https://telepath.lemma.company/api/v1/messages/recent' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"limit":20}'

HTTP 200 response

count and messages; single-chat reads include chat, search includes query, and date-filtered reads can include since. Message entries include chat_id, message_id, date, direction, text, text_source, sender and available media/transcript metadata.

{
  "count": 1,
  "messages": [
    {
      "chat_id": 123456789,
      "message_id": 42,
      "chat_name": "Example contact",
      "date": "2026-11-05T08:00:00.000Z",
      "direction": "incoming",
      "text": "Could you send the details?",
      "text_source": "written",
      "message_type": "text"
    }
  ]
}
POST/messages/fileRead an archived file

Scope: telegram.read · Read-only action

Retrieve file metadata, an expiring link and extracted text when supported. Imported files without stored Telegram file IDs may be unavailable. Do not share download links with other users.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
message_idinteger
Required
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991
include_textboolean
Optional
Whether to attempt supported text extraction; this is not transcription.
max_charsinteger
Optional
Maximum extracted characters.
minimum: 1 · maximum: 50000
offset_linesinteger
Optional
Starting line offset for extracted text.
minimum: 0 · maximum: 1000000

Example request

curl 'https://telepath.lemma.company/api/v1/messages/file' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"message_id":42,"include_text":true}'

HTTP 200 response

filename, mimeType, bytes, message_type, caption, expiring url and optional extracted text. Inspect text_error, text_truncated and line ranges; media in a text-only export may be unavailable.

{
  "filename": "example.txt",
  "mimeType": "text/plain",
  "bytes": 7,
  "message_type": "document",
  "caption": null,
  "url": null,
  "text": "Example",
  "text_truncated": false,
  "text_error": null
}
POST/messages/photoGet an archived photo

Scope: telegram.read · Read-only action

Return photo data and metadata through Telepath's existing media loader. Rendering or image understanding depends on the client; this is not an image-analysis endpoint.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
message_idinteger
Required
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991

Example request

curl 'https://telepath.lemma.company/api/v1/messages/photo' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"message_id":42}'

HTTP 200 response

Base64 data, mimeType, bytes, caption and an expiring url when available. This retrieves an image; it does not analyze it.

{
  "data": "<base64 image bytes>",
  "mimeType": "image/jpeg",
  "bytes": 12345,
  "caption": null,
  "url": null
}
POST/messages/send-mediaSend a photo or document

Scope: telegram.write · Write action

Confirm recipient and media before sending. Supply exactly one source: public HTTP(S) URL or from_chat_id plus from_message_id in your archive. Private messages use Business permissions; groups send as the bot. Never retry automatically after uncertain delivery.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
from_chat_idinteger
Optional
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
from_message_idinteger
Optional
Source message in from_chat_id.
minimum: -9007199254740991 · maximum: 9007199254740991
urlstring
Optional
Media or button URL. See the field constraints and operation rules.
pattern: ^https?:\/\/ · format: uri
captionstring
Optional

maxLength: 1024
as_documentboolean
Optional
Send the media as a document.
reply_to_message_idinteger
Optional
Source message in from_chat_id.
minimum: -9007199254740991 · maximum: 9007199254740991
message_thread_idinteger
Optional
Source message in from_chat_id.
minimum: -9007199254740991 · maximum: 9007199254740991

Example request

curl 'https://telepath.lemma.company/api/v1/messages/send-media' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"url":"https://example.com/example.pdf","as_document":true}'

HTTP 200 response

sent, kind, chat_id, chat_name, message_id, filename, caption and sent_as. Delivery may be uncertain after a timeout.

{
  "sent": true,
  "kind": "document",
  "chat_id": 123456789,
  "chat_name": "Example contact",
  "message_id": 44,
  "filename": "example.pdf",
  "caption": null,
  "sent_as": "you"
}
POST/messages/editEdit a sent message

Scope: telegram.write · Write action

Confirm the exact replacement and recipient. Only eligible outgoing messages can be edited. Use dedicated post tools for channel posts.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
message_idinteger
Required
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991
textstring
Required
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
minLength: 1 · maxLength: 4096

Example request

curl 'https://telepath.lemma.company/api/v1/messages/edit' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"message_id":43,"text":"Updated reply."}'

HTTP 200 response

edited, chat_id, message_id and replacement text.

{
  "edited": true,
  "chat_id": 123456789,
  "message_id": 43,
  "text": "Updated reply."
}
POST/messages/mark-readMark a conversation read

Scope: telegram.write · Write action

Mark a Business conversation read through Telegram, up to the given message or the newest known message. This changes the unread state; ordinary archive reads do not.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
message_idinteger
Optional
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991

Example request

curl 'https://telepath.lemma.company/api/v1/messages/mark-read' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"message_id":42}'

HTTP 200 response

marked_read, chat_id, chat_name and up_to_message_id.

{
  "marked_read": true,
  "chat_id": 123456789,
  "chat_name": "Example contact",
  "up_to_message_id": 42
}
POST/messages/reactionSet or remove a reaction

Scope: telegram.write · Write action

Confirm the target and emoji. Reacts as the bot in supported groups or authorized connected channels; private Business reactions are unsupported. Omit emoji to remove the bot's reaction.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
message_idinteger
Required
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991
emojistring
Optional
Telegram-supported reaction. Omit to remove the bot reaction.
maxLength: 100
bigboolean
Optional
Request a large reaction animation.

Example request

curl 'https://telepath.lemma.company/api/v1/messages/reaction' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":-1001234567890,"message_id":42,"emoji":"👍"}'

HTTP 200 response

For a group: ok, chat_id, chat_name, message_id, reaction, removed and reacted_as. A channel result instead uses emoji and sent_as.

{
  "ok": true,
  "chat_id": -1001234567890,
  "chat_name": "Example group",
  "message_id": 42,
  "reaction": "👍",
  "removed": false,
  "reacted_as": "the bot"
}

Bot inbox

POST/bot/messagesList bot inbox messages

Scope: telegram.read · Read-only action

Read the bot's separate direct-message inbox. Never mix this line with private Business chats, even when chat IDs match.

JSON body

ParameterType / presenceDescription / constraints
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 20 for archive reads.
minimum: 1 · maximum: 100

Example request

curl 'https://telepath.lemma.company/api/v1/bot/messages' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"limit":10}'

HTTP 200 response

count, note and messages. Entries use line=bot_dm, sender display name, date, text and also_has_business_chat. This inbox is separate from Business chats and channel DMs.

{
  "count": 1,
  "messages": [
    {
      "chat_id": 123456789,
      "message_id": 42,
      "from": "Example contact",
      "date": "2026-11-05T08:00:00.000Z",
      "text": "Hello",
      "line": "bot_dm",
      "also_has_business_chat": false
    }
  ]
}
POST/bot/replyReply in the bot inbox

Scope: telegram.write · Write action

Send an authorized reply as the bot to someone present in this account's bot inbox. Does not reply in the owner's Business chat. Never automatically retry uncertain delivery.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
textstring
Required
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
minLength: 1 · maxLength: 4096

Example request

curl 'https://telepath.lemma.company/api/v1/bot/reply' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"text":"Thanks for your message."}'

HTTP 200 response

ok, chat_id, sent_as and message_id.

{
  "ok": true,
  "chat_id": 123456789,
  "sent_as": "the bot",
  "message_id": 43
}
POST/bot/reactionReact in the bot inbox

Scope: telegram.write · Write action

Set a reaction as the bot on a message in this account's separate bot inbox. Omit emoji to remove the reaction.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Required
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
message_idinteger
Required
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991
emojistring
Optional
Telegram-supported reaction. Omit to remove the bot reaction.
maxLength: 100
bigboolean
Optional
Request a large reaction animation.

Example request

curl 'https://telepath.lemma.company/api/v1/bot/reaction' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"message_id":42,"emoji":"👍"}'

HTTP 200 response

ok, chat_id, message_id, reaction, removed and reacted_as.

{
  "ok": true,
  "chat_id": 123456789,
  "message_id": 42,
  "reaction": "👍",
  "removed": false,
  "reacted_as": "the bot"
}

Archive

POST/archive/forgetDelete archived messages

Scope: telegram.write · Write action

Permanently delete Telepath archived messages in the specified scope. Does not delete messages in Telegram. Requires the account's archive deletion capability and explicit confirmation. Provide chat_id, before, or both.

JSON body

ParameterType / presenceDescription / constraints
chat_idinteger
Optional
Nonzero safe integer identifying a chat. JSON bodies use numbers; GET parameters are decimal strings on the wire.
minimum: -9007199254740991 · maximum: 9007199254740991
beforestring
Optional
ISO 8601 upper date bound, with Z or an explicit UTC offset.
format: date-time
confirmedboolean
Required
Must be true; caller must obtain authorization for this exact action.
Must equal true

Example request

curl 'https://telepath.lemma.company/api/v1/archive/forget' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"chat_id":123456789,"confirmed":true}'

HTTP 200 response

forgotten (row count), chat_id or null, before or null, and a note about retained copies. This removes archive data, not the Telegram conversation.

{
  "forgotten": 3,
  "chat_id": 123456789,
  "before": null,
  "note": "Removed from the archive. Telegram retains its copy."
}

Notes

POST/notes/searchSearch notes

Scope: telegram.read · Read-only action

Search this account's Notes. Empty query lists recent notes. Optionally filter by tag.

JSON body

ParameterType / presenceDescription / constraints
querystring
Required
Search text; Notes search also accepts an empty string.
maxLength: 1000
tagstring
Optional
Optional exact tag filter.
maxLength: 100
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 20 for archive reads.
minimum: 1 · maximum: 100

Example request

curl 'https://telepath.lemma.company/api/v1/notes/search' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"query":"Follow up","limit":10}'

HTTP 200 response

count and notes; search also includes query. List/search entries are note summaries, without full body, links or backlinks; use notes/get for those.

{
  "count": 1,
  "notes": [
    {
      "id": 17,
      "title": "Follow up",
      "type": "note",
      "tags": [],
      "task_status": null,
      "reminder": null,
      "created_at": "2026-11-05T08:00:00.000Z",
      "updated_at": "2026-11-05T08:00:00.000Z"
    }
  ]
}
POST/notes/getRead a note

Scope: telegram.read · Read-only action

Read one note, task, project or person with links and backlinks. Supply its ID or exact title.

JSON body

ParameterType / presenceDescription / constraints
idinteger
Optional
Note ID or reminder ID, as typed below.
minimum: -9007199254740991 · maximum: 9007199254740991
titlestring
Optional
Note title (trimmed, 1–500 characters); exact-title selector when ID is omitted.
minLength: 1 · maxLength: 500

Example request

curl 'https://telepath.lemma.company/api/v1/notes/get' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"id":17}'

HTTP 200 response

The note object: id, title, body, tags, type, task_status, reminder, created_at, updated_at, links and backlinks.

{
  "id": 17,
  "title": "Follow up",
  "body": "Send the requested details.",
  "tags": [],
  "type": "note",
  "task_status": null,
  "reminder": null,
  "created_at": "2026-11-05T08:00:00.000Z",
  "updated_at": "2026-11-05T08:00:00.000Z",
  "links": [],
  "backlinks": []
}
POST/notes/listList notes

Scope: telegram.read · Read-only action

List recent notes, tasks and projects. Filter by tag when needed.

JSON body

ParameterType / presenceDescription / constraints
tagstring
Optional
Optional exact tag filter.
maxLength: 100
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 30 for archive reads.
minimum: 1 · maximum: 200

Example request

curl 'https://telepath.lemma.company/api/v1/notes/list' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"limit":10}'

HTTP 200 response

count and notes; search also includes query. List/search entries are note summaries, without full body, links or backlinks; use notes/get for those.

{
  "count": 1,
  "notes": [
    {
      "id": 17,
      "title": "Follow up",
      "type": "note",
      "tags": [],
      "task_status": null,
      "reminder": null,
      "created_at": "2026-11-05T08:00:00.000Z",
      "updated_at": "2026-11-05T08:00:00.000Z"
    }
  ]
}
POST/notes/createCreate a note or task

Scope: telegram.write · Write action

Save user-authorized content. Titles are unique; use [[Title]] links and tags. Types: note, project, person, task. Only explicitly authorized reminders on open tasks may be scheduled. A quota failure means the save did not happen. Search before creating duplicates.

JSON body

ParameterType / presenceDescription / constraints
titlestring
Required
Note title (trimmed, 1–500 characters); exact-title selector when ID is omitted.
minLength: 1 · maxLength: 500
bodystring
Optional
Note body, up to 50,000 characters; an empty string is meaningful.
maxLength: 50000
tagsarray
Optional
At most 100 strings, each up to 100 characters. On update this replaces all tags.
maxItems: 100
typestring
Optional
Note type or media type, according to the enclosing object.
Allowed: note, project, person, task
task_statusstring
Optional
open or done; completing a task cancels its reminder.
Allowed: open, done
reminderobject | null
Optional
Optional task reminder object, or null to cancel. Valid only on an open task.
reminder.textstring
Required when parent is supplied
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
minLength: 1 · maxLength: 1500
reminder.atstring
Required when parent is supplied
Future ISO 8601 date/time with explicit offset, within five years.
format: date-time
reminder.timezonestring
Required when parent is supplied
IANA timezone, for example Europe/London.
minLength: 1 · maxLength: 80

Example request

curl 'https://telepath.lemma.company/api/v1/notes/create' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"title":"Follow up","body":"Send the requested details."}'

HTTP 200 response

The note object: id, title, body, tags, type, task_status, reminder, created_at, updated_at, links and backlinks.

{
  "id": 17,
  "title": "Follow up",
  "body": "Send the requested details.",
  "tags": [],
  "type": "note",
  "task_status": null,
  "reminder": null,
  "created_at": "2026-11-05T08:00:00.000Z",
  "updated_at": "2026-11-05T08:00:00.000Z",
  "links": [],
  "backlinks": []
}
POST/notes/updateUpdate a note or task

Scope: telegram.write · Write action

Read before editing. Use ID when renaming; otherwise title addresses the existing note. Omitted fields are preserved, append adds body text, tags replaces tags. reminder:null cancels; completing a task cancels its reminder. Confirm destructive replacements. Do not automatically retry append operations.

JSON body

ParameterType / presenceDescription / constraints
idinteger
Optional
Note ID or reminder ID, as typed below.
minimum: -9007199254740991 · maximum: 9007199254740991
titlestring
Optional
Note title (trimmed, 1–500 characters); exact-title selector when ID is omitted.
minLength: 1 · maxLength: 500
bodystring
Optional
Note body, up to 50,000 characters; an empty string is meaningful.
maxLength: 50000
tagsarray
Optional
At most 100 strings, each up to 100 characters. On update this replaces all tags.
maxItems: 100
typestring
Optional
Note type or media type, according to the enclosing object.
Allowed: note, project, person, task
task_statusstring
Optional
open or done; completing a task cancels its reminder.
Allowed: open, done
reminderobject | null
Optional
Optional task reminder object, or null to cancel. Valid only on an open task.
reminder.textstring
Required when parent is supplied
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
minLength: 1 · maxLength: 1500
reminder.atstring
Required when parent is supplied
Future ISO 8601 date/time with explicit offset, within five years.
format: date-time
reminder.timezonestring
Required when parent is supplied
IANA timezone, for example Europe/London.
minLength: 1 · maxLength: 80
appendboolean
Optional
Append body rather than replace it.

Example request

curl 'https://telepath.lemma.company/api/v1/notes/update' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"id":17,"body":"Updated details."}'

HTTP 200 response

The note object: id, title, body, tags, type, task_status, reminder, created_at, updated_at, links and backlinks.

{
  "id": 17,
  "title": "Follow up",
  "body": "Send the requested details.",
  "tags": [],
  "type": "note",
  "task_status": null,
  "reminder": null,
  "created_at": "2026-11-05T08:00:00.000Z",
  "updated_at": "2026-11-05T08:00:00.000Z",
  "links": [],
  "backlinks": []
}
POST/notes/deleteDelete a note

Scope: telegram.write · Write action

Permanently delete the chosen note after user confirmation. Also cancels its task reminder. Supply ID or exact title.

JSON body

ParameterType / presenceDescription / constraints
idinteger
Optional
Note ID or reminder ID, as typed below.
minimum: -9007199254740991 · maximum: 9007199254740991
titlestring
Optional
Note title (trimmed, 1–500 characters); exact-title selector when ID is omitted.
minLength: 1 · maxLength: 500

Example request

curl 'https://telepath.lemma.company/api/v1/notes/delete' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"id":17}'

HTTP 200 response

deleted, id and title.

{
  "deleted": true,
  "id": 17,
  "title": "Follow up"
}

Reminders

POST/reminders/createCreate a reminder

Scope: telegram.write · Write action

Schedule a one-time reminder only to the authenticated account owner. Clarify time, timezone and text; only schedule when authorized. Reuse request_id and identical details on retry. Creation allowance is shared with task reminders. Scheduled does not mean delivered.

JSON body

ParameterType / presenceDescription / constraints
textstring
Required
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
minLength: 1 · maxLength: 1500
atstring
Required
Future ISO 8601 date/time with explicit offset, within five years.
format: date-time
timezonestring
Required
IANA timezone, for example Europe/London.
minLength: 1 · maxLength: 80
request_idstring
Optional
8–100 letters, digits, hyphens or underscores. Reuse only for the identical operation.
minLength: 8 · maxLength: 100 · pattern: ^[-a-zA-Z0-9_]+$

Example request

curl 'https://telepath.lemma.company/api/v1/reminders/create' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"text":"Follow up","at":"2027-01-15T09:00:00Z","timezone":"Europe/London","request_id":"reminder-example-001"}'

HTTP 200 response

reminder, created and quota. An identical request_id replay returns created=false. Scheduled is not delivered.

{
  "reminder": {
    "id": "r_example_reminder",
    "kind": "standalone",
    "note_id": null,
    "at": "2027-01-15T09:00:00.000Z",
    "timezone": "Europe/London",
    "text": "Follow up",
    "status": "scheduled"
  },
  "created": true
}
POST/reminders/listList reminders

Scope: telegram.read · Read-only action

List standalone/task reminders and delivery states. Available regardless of remaining creation allowance. By default excludes done/cancelled. Uncertain is not delivered.

JSON body

ParameterType / presenceDescription / constraints
statusstring
Optional
Filter by reminder delivery state.
Allowed: scheduled, sending, delivered, failed, uncertain, cancelled, done
limitinteger
Optional
Maximum results; source-specific caps may be lower. No Return All or implicit pagination. Default 30 for archive reads.
minimum: 1 · maximum: 100
offsetinteger
Optional
Reminder list offset.
minimum: 0 · maximum: 1000000

Example request

curl 'https://telepath.lemma.company/api/v1/reminders/list' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"limit":10,"offset":0}'

HTTP 200 response

count, total, reminders, next_offset (or null) and quota. This endpoint supports offset pagination.

{
  "count": 1,
  "total": 1,
  "reminders": [
    {
      "id": "r_example_reminder",
      "kind": "standalone",
      "note_id": null,
      "at": "2027-01-15T09:00:00.000Z",
      "timezone": "Europe/London",
      "text": "Follow up",
      "status": "scheduled"
    }
  ],
  "next_offset": null
}
POST/reminders/cancelCancel a reminder

Scope: telegram.write · Write action

Cancel by reminder ID at the owner's request; preserves linked task. Available even when Notes creation is disabled or allowance is exhausted. Cancellation does not restore creation allowance or recall an already sent message.

JSON body

ParameterType / presenceDescription / constraints
idstring
Required
Note ID or reminder ID, as typed below.
minLength: 1 · maxLength: 100

Example request

curl 'https://telepath.lemma.company/api/v1/reminders/cancel' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"id":"r_example_reminder"}'

HTTP 200 response

reminder and cancelled. Inspect the returned status; cancellation does not recall a delivered message.

{
  "reminder": {
    "id": "r_example_reminder",
    "kind": "standalone",
    "note_id": null,
    "at": "2027-01-15T09:00:00.000Z",
    "timezone": "Europe/London",
    "text": "Follow up",
    "status": "cancelled"
  },
  "cancelled": true
}

Channels

POST/channels/posts/createPublish a channel post

Scope: telegram.write · Write action

Broadcast to a connected channel you currently own. Show channel, text, all media and button destinations and obtain explicit confirmation. Supports text, one photo/document, or 2–10 album items. Albums cannot have buttons or mix documents with photo/video. Captions max 1024. Requires bot Post messages permission. Reuse request_id for identical retries; never retry uncertain delivery with a new ID.

JSON body

ParameterType / presenceDescription / constraints
channel_idinteger
Required
Negative safe integer for a connected channel currently owned by this account.
minimum: -9007199254740991 · maximum: 9007199254740991
request_idstring
Required
8–100 letters, digits, hyphens or underscores. Reuse only for the identical operation.
minLength: 8 · maxLength: 100 · pattern: ^[-a-zA-Z0-9_]+$
confirmedboolean
Required
Must be true; caller must obtain authorization for this exact action.
Must equal true
textstring
Optional
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
maxLength: 4096
mediaobject
Optional
One photo or document with an HTTPS URL.
media.typestring
Required when parent is supplied
Note type or media type, according to the enclosing object.
Allowed: photo, document
media.urlstring
Required when parent is supplied
Media or button URL. See the field constraints and operation rules.
pattern: ^https\:\/\/ · format: uri
buttonsarray
Optional
Up to five rows of 1–4 HTTPS link buttons; [] removes buttons on edit.
maxItems: 5
buttons[][].textstring
Required when parent is supplied
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
minLength: 1 · maxLength: 64
buttons[][].urlstring
Required when parent is supplied
Media or button URL. See the field constraints and operation rules.
pattern: ^https\:\/\/ · format: uri
formatstring
Optional
plain or HTML for channel content.
Allowed: plain, HTML
albumarray
Optional
2–10 photo/video/document items; see album restrictions.
minItems: 2 · maxItems: 10
album[].typestring
Required when parent is supplied
Note type or media type, according to the enclosing object.
Allowed: photo, video, document
album[].urlstring
Required when parent is supplied
Media or button URL. See the field constraints and operation rules.
pattern: ^https\:\/\/ · format: uri

Example request

curl 'https://telepath.lemma.company/api/v1/channels/posts/create' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"channel_id":-1001234567890,"request_id":"post-create-example-001","confirmed":true,"text":"Example announcement."}'

HTTP 200 response

ok, channel_id, channel_title, message_id and action. Album creation also includes message_ids and media_group_id. Successful identical request_id replays return the saved result.

{
  "ok": true,
  "channel_id": -1001234567890,
  "channel_title": "Example channel",
  "message_id": 42,
  "action": "telegram_create_post"
}
POST/channels/posts/editEdit a channel post

Scope: telegram.write · Write action

Read first, confirm channel and exact replacement. Omitted fields are preserved; empty buttons removes them. Requires current ownership and bot Edit messages permission. Targets one album item, not the whole album. Reuse request_id on identical retry.

JSON body

ParameterType / presenceDescription / constraints
channel_idinteger
Required
Negative safe integer for a connected channel currently owned by this account.
minimum: -9007199254740991 · maximum: 9007199254740991
request_idstring
Required
8–100 letters, digits, hyphens or underscores. Reuse only for the identical operation.
minLength: 8 · maxLength: 100 · pattern: ^[-a-zA-Z0-9_]+$
confirmedboolean
Required
Must be true; caller must obtain authorization for this exact action.
Must equal true
textstring
Optional
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
maxLength: 4096
mediaobject
Optional
One photo or document with an HTTPS URL.
media.typestring
Required when parent is supplied
Note type or media type, according to the enclosing object.
Allowed: photo, document
media.urlstring
Required when parent is supplied
Media or button URL. See the field constraints and operation rules.
pattern: ^https\:\/\/ · format: uri
buttonsarray
Optional
Up to five rows of 1–4 HTTPS link buttons; [] removes buttons on edit.
maxItems: 5
buttons[][].textstring
Required when parent is supplied
Message, post or reminder text. Whitespace-only ordinary sends are rejected.
minLength: 1 · maxLength: 64
buttons[][].urlstring
Required when parent is supplied
Media or button URL. See the field constraints and operation rules.
pattern: ^https\:\/\/ · format: uri
formatstring
Optional
plain or HTML for channel content.
Allowed: plain, HTML
message_idinteger
Required
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991

Example request

curl 'https://telepath.lemma.company/api/v1/channels/posts/edit' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"channel_id":-1001234567890,"message_id":42,"request_id":"post-edit-example-001","confirmed":true,"text":"Updated announcement."}'

HTTP 200 response

ok, channel_id, channel_title, message_id and action. Album creation also includes message_ids and media_group_id. Successful identical request_id replays return the saved result.

{
  "ok": true,
  "channel_id": -1001234567890,
  "channel_title": "Example channel",
  "message_id": 42,
  "action": "telegram_edit_post"
}
POST/channels/posts/deleteDelete a channel post

Scope: telegram.write · Write action

Permanently delete one archived post from Telegram after confirmation. Requires current ownership and bot Delete messages permission, subject to Telegram's deletion window. Not an archive-only delete. Reuse request_id on identical retry.

JSON body

ParameterType / presenceDescription / constraints
channel_idinteger
Required
Negative safe integer for a connected channel currently owned by this account.
minimum: -9007199254740991 · maximum: 9007199254740991
request_idstring
Required
8–100 letters, digits, hyphens or underscores. Reuse only for the identical operation.
minLength: 8 · maxLength: 100 · pattern: ^[-a-zA-Z0-9_]+$
confirmedboolean
Required
Must be true; caller must obtain authorization for this exact action.
Must equal true
message_idinteger
Required
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991

Example request

curl 'https://telepath.lemma.company/api/v1/channels/posts/delete' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"channel_id":-1001234567890,"message_id":42,"request_id":"post-delete-example-001","confirmed":true}'

HTTP 200 response

ok, channel_id, channel_title, message_id and action. Album creation also includes message_ids and media_group_id. Successful identical request_id replays return the saved result.

{
  "ok": true,
  "channel_id": -1001234567890,
  "channel_title": "Example channel",
  "message_id": 42,
  "action": "telegram_delete_post"
}
POST/channels/posts/pinPin or unpin a channel post

Scope: telegram.write · Write action

Confirm the channel, post and desired state. Pin/unpin this specific post only; requires current ownership and bot Edit messages permission. Reuse request_id on identical retry.

JSON body

ParameterType / presenceDescription / constraints
channel_idinteger
Required
Negative safe integer for a connected channel currently owned by this account.
minimum: -9007199254740991 · maximum: 9007199254740991
request_idstring
Required
8–100 letters, digits, hyphens or underscores. Reuse only for the identical operation.
minLength: 8 · maxLength: 100 · pattern: ^[-a-zA-Z0-9_]+$
confirmedboolean
Required
Must be true; caller must obtain authorization for this exact action.
Must equal true
message_idinteger
Required
Positive safe integer identifying a message in the selected chat.
minimum: -9007199254740991 · maximum: 9007199254740991
pinnedboolean
Required
true to pin, false to unpin.

Example request

curl 'https://telepath.lemma.company/api/v1/channels/posts/pin' \
  -H "Authorization: Bearer $TELEPATH_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"channel_id":-1001234567890,"message_id":42,"request_id":"post-pin-example-001","confirmed":true,"pinned":true}'

HTTP 200 response

ok, channel_id, channel_title, message_id and action. Album creation also includes message_ids and media_group_id. Successful identical request_id replays return the saved result.

{
  "ok": true,
  "channel_id": -1001234567890,
  "channel_title": "Example channel",
  "message_id": 42,
  "action": "telegram_set_post_pinned"
}

Errors and retry rules

Errors generally use {"error":"code","error_description":"explanation"}. Reminder quota errors also return quota. Authentication middleware can return an OAuth error without an error_description. Domain failures not mapped to a specific error become 502 operation_failed; do not assume every permission or validation failure returns 400/403.

HTTPCodesMeaning
400invalid_request / unsupported_chat_type / invalid_reminderInvalid parameters or JSON; unsupported chat type; invalid reminder.
401invalid_tokenMissing, expired, revoked or otherwise invalid access token. Refresh through OAuth.
403account_unavailable / insufficient_scope / sending_disabled / capability_unavailable / entitlement_requiredInactive account, missing scope, disabled capability or exhausted reminder allowance.
404chat_not_found / not_foundUnknown route/method, unavailable item, or chat absent from the required archive/inbox.
413invalid_requestJSON body exceeds 256 KB.
415unsupported_media_type / invalid_requestUse application/json; unsupported charset or encoding.
429rate_limited / telegram_rate_limitedShared account rate limit or Telegram rejection. Respect Retry-After when present.
500server_errorUnexpected request-processing failure.
502operation_failedOperation failed or completion is uncertain. A write may have succeeded; inspect state before retrying.
  • Read retries: use backoff and respect Retry-After when supplied. Stop and resolve authentication or permissions errors.
  • Ordinary sends and appends: no general idempotency key. A network timeout or 502 can follow a successful action. Inspect the destination before repeating; disable blind whole-workflow retries.
  • Channel actions: require confirmed=true and a stable request_id. Identical completed requests return their receipt; changed payloads with the same key are rejected. Pending or uncertain receipts require inspection, not a new key.
  • Reminder creation: an optional request_id deduplicates identical requests. Completing/deleting a task cancels its associated reminder; cancellation does not refund creation allowance.
  • 429 on writes: distinguish the gateway's explicit pre-dispatch rate_limited from Telegram or network errors. Do not turn every rate-limit or server error into a send retry.

REST does not expose account administration, OAuth credentials, automatic-reply configuration or a general arbitrary-tool endpoint. Generated-voice inputs present in other transports are not accepted by these REST media/post schemas.

Download OpenAPI JSON ↓Get integration help ↗