Files
simplex-chat/bots/api/TYPES.md
T
1b329f41fb core: wallet for names (#7684)
* core: wallet key for name ownership (CLI only)

A name has to be owned by an address the client can still derive after a
restart or on a new device. This adds that key and nothing else.

/wallet create makes one BIP-39 key per device and one BIP-44 account per
chat profile under it, /wallet shows the address that would own the next
name that profile buys, /wallet import and /wallet export move the key with
its recovery phrase.

A name key sits at m/44'/60'/<profile>'/0/<name>, which is ordinary BIP-44,
so the phrase reaches the same addresses in other wallets. No signing, so
nothing can be bought or edited yet.

Split out of #7390 / #7425.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: pin simplexmq with eth crypto merged into master

ab/eth-crypto forked before Crypto.Entitlement, which Chat.Badges imports,
so the branch had to be merged with simplexmq master before it could be
pinned here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: wallet review fixes, and show the derived addresses

Concurrency: the account index is incremented in SQL and read back in the
same transaction, so two profiles cannot be handed the same key. Importing
a phrase is one transaction and single_seed is UNIQUE, so a phrase cannot
be discarded in favour of a key created meanwhile, and a device cannot end
up with two keys.

Wallet commands are no longer forwarded to a remote host: the recovery
phrase must not leave the device, and the raw command is logged there.

/wallet delete removes the key, confirmed by the last word of the phrase,
so creating a key before importing your own is no longer a dead end.

/wallet now shows every profile on the key with the first two name
addresses each, to check derivation against other wallets. Hidden profiles
are left out, as they are by /users. A bad phrase no longer says which word
was wrong. /wallet export uses the profile's own key.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: make the wallet an API, not a user-facing feature

Names commands will use the wallet; users do not. The commands move to
/_wallet, and the help section, its topic and the changelog entry are
removed. The tests drive the API end to end.

Comments cut to what the code does not say, dead exports removed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: wallet export and delete act on the device key

The key is one per device, so both commands read it directly instead of
going through the active profile's account. A profile without an account
of its own can now export, and the delete error says that the key goes for
every profile on the device. The confirmation word is lowercased, as the
phrase is when imported.

Two known limitations are written down: account indexes restart at 0 after
an import, so profiles are bound in the order they ask for a key, and the
gap left by a hidden profile in the printed indexes shows that it exists.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: /_wallet delete takes no confirmation word

The wallet is an API, and no other API command takes a typed confirmation:
/_delete user takes the profile password. The word was also no barrier to a
caller, which can read it from /_wallet export. Confirming belongs in the
command that will wrap this one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: name the unique index on wallet_seeds

The one key per device rule is meant to be lifted later. SQLite cannot drop
a column with an inline UNIQUE, or its automatic index, so lifting it would
have meant rebuilding the table. As a named index it is a DROP INDEX and a
DROP COLUMN.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: export the secret of a single name key

/_wallet export gives the seed mnemonic, /_wallet export <account> <name>
gives the secret of one derived key, so a single name can be handed over
without the seed. Both are what a wallet takes on import: the mnemonic as a
recovery phrase, the secret as hex.

The commands are named for what they return, APIWalletExportSeedMnemonic
and APIWalletExportDerivedSecret, as the difference is which secret leaves
the device.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: reject a key index BIP-32 cannot harden

A.decimal wraps into Word32 and hardened leaves anything at or above 2^31
alone, so /_wallet export 4294967296 0 returned account 0's secret under the
path m/44'/60'/0'/0/0. Handing out a different account's key for a mistyped
index is the wrong failure for this command.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: /_wallet bind, and name the other profiles instead of numbering them

Restoring a chat database older than the key loses which account each
profile had, and the keys are still there, so /_wallet bind <account> sets
it by hand. The counter moves past an account bound this way, and an
account another profile holds is refused.

/_wallet now shows the paths of the active profile only, and names the
other profiles on the key. Their account indexes were the gap that showed
a hidden profile exists.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: say same seed, not same key, for the other profiles

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: create makes the seed, bind claims a path

The two were one command: on a device that already had a seed, /_wallet
create only bound a profile. Now create makes the seed and refuses when one
exists, and binds every profile that exists, as a new seed has no account
that already owns a name.

/_wallet import binds nothing. Which account a profile had is what an
import is recovering, and the seed does not say, so the profile says it
with /_wallet bind <account>. /_wallet bind with no account takes the next
free one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: the known issue is now about bind, not import

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: create binds no profile either

Create and import differed only in whether they bound a profile, which made
the convenient one inconsistent. Neither binds now, so the store keeps one
function for both, and a profile reaches an account only through bind.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: test the restore cases the key has to survive

A database backed up after the key carries the key and the binding, so the
restore is all of it and an import is refused. A database backed up before
the key comes back with the profiles and no binding, so the phrase is
imported and each profile says which account was its. A key imported before
the database is restored is replaced by what the backup held.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: drop the types nothing reads, and say account where it means account

AccountRef and WalletAccount were built and never read: deriveNameKey now
returns the key, and the address comes from addressFromPrivateKey, which
already exists. SeedId is a plain Int64 like every other row id here.

The master key is derived once per command rather than once per name key,
which is where PBKDF2 runs.

A device has a key and a profile has an account, so /_wallet says "no
account for this profile" rather than repeating "no wallet key", which is
what it says when the device has none.

Also: no "wallet: " in front of "bad chat command: ", strEncode for the
address, the repeated seed lookup in one place, comments cut to what the
code does not say, and the export test pins its addresses and secrets,
including one whose first byte is zero.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: store the seed as bytes, and bind one account per profile

On Postgres a bare ByteString binds as a text literal, so entropy with a
backslash or a high bit was rejected and entropy with a zero byte was
truncated: the BIP-39 test vector stored as an empty seed. Blob columns go
through DB.Binary here, as every other one does.

/_wallet bind with no account moved a profile that already had one to a
fresh account, abandoning the old one without saying so. It refuses now;
moving is asked for by number.

The counter could walk past 2^31, where BIP-32 hardening folds every index
back onto a low one, so a profile handed 2147483648 derived account 0's
keys and printed account 0's path. Binding refuses once the counter is
there, and a very long index is now rejected on its digit count rather than
after reading it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: rfc for the keys that own names

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: pin simplexmq for the BIP-44 path, and use it

ethereumPath now takes the address index, so the path a name key sits at is
built once in the library rather than again here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: refuse an account index BIP-32 cannot harden, whichever way it arrives

The counter path checked it, the explicit one did not, and the parser is not
the only caller: processChatCommand takes APIWalletBind from library callers
too. hardened leaves an index at or above 2^31 alone, so account i and
i + 2^31 are the same key while the duplicate check compares the stored
integers, and two profiles could hold one account's names.

The rfc now says what hiding a profile from /_wallet does and does not
protect: the seed is one per device, so whoever unlocks any profile can
derive every account.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: pin simplexmq with the wordlist embedded from the upstream file

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: cut the rfc to what stands on its own

Drops the references to other documents and to what is or is not in a pull
request, so the design reads without them, and the list of tests, which
restated their names and would drift. 164 lines to 134, against a median of
117 for the rfcs here that define schema.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: what the stealth meta address is for

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: the wallet is not only for names

The seed, the accounts and the derivation are a wallet. Owning a name is the
first thing it is used for, not what it is, and the title and the problem it
solves now say so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: the reason for a key per name is that owners are public

One address owning several names links them: whoever knows one name can read
its owner and find the others. That is the reason, not the narrower export.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: give the reason for the counter before what it costs

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: names are the device's, so drop the per-profile account

A name's profile is the record it resolves to, not the key that owns it, so
the account level was carrying a mapping nothing needs. It was also the only
source of the profile to account ambiguity after a restore, of /_wallet
bind, and of the index gap and the refusal that told a visible profile an
account was held by one it cannot see. All of it goes.

Names sit in account 0 from index 1. Index 0 is left unused so neither the
names nor the profile accounts, which start at 1, claim the origin of both
dimensions. users gains no columns at all now, so the migration is one
CREATE TABLE.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: rfc for names counted per device

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: one command for the seed, whichever way it arrives

create and import differed only in where the entropy came from and already
shared one store function, so they are one command with the source named:
/_wallet create new, or /_wallet create seed=<phrase>. Naming it means no
seed is generated by typing a prefix.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: the argument is a mnemonic, so name it one

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: the column holds entropy, so name it entropy

The mnemonic comes back from the entropy exactly, which is what export
returns, and the seed PBKDF2 derives from the mnemonic is computed when a
key is needed and never stored. The column was the one thing called seed
that is not the seed, which is why it needed a comment saying so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: 24 words is a choice, not a default

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: deleting the seed reports ok, not the empty wallet

Delete re-ran /_wallet, so a successful delete printed "no wallet key",
which is the same words the error uses and reads as a failure. There is
nothing to show after a delete.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: the export argument is an index, not a name

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: export says which kind of secret, so other kinds can follow

/_wallet export name <k> rather than an index straight after export. The
bare form stays the seed mnemonic, and a profile's key can be added beside
the name one without the argument having to be guessed from its shape.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* disencourage hidden profiles using names

* let remote use wallet, but filter logs to avoid leaking secrets

* change RFC wallet architecture to BIP-85 per profile and hardened paths for names

* introduce keyring as the thing a profile binds to

* restructure RFC

* shorten

* drop BIP85 and flattenhierarche. no keyrings

* /goal iteration 4 - unconfirmed

* /goal iteration 5 - unconfirmed

* repin

* rename to adapt

* cut comments

* next review round

* minimize diff and align style even more

* missing type mappings

* fix review comments

* self-review iteration 2

* self-review iteration 3

* self-review iteration 5

* iteration 6

* self-review iteration 9

* self-review iteration 10

* repin

* rng preserve

* refactor WalletSeed type, see mq wip

* repin

* infallibel wallet and account derivation

* review iterations

* repin to mq, derivation fallible again

* repin

* use deriveAddress, update simplexmq

* simplexmq

* add down migration for db and drop redundant masterkey field in db

* repin to simplexmq PR

* fable review fixes

* iterations on /goal

* treat hidden profiles same as normal ones. they can hold accounts now

* reduce explicit types

* repin mq

* doc cosmetics

* simplify

* query plans

* query plan

* simplify

* query plans

* simplify more

* fixes for comment ^^

---------

Co-authored-by: Alain Brenzikofer <alain@encointer.org>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-13 18:22:55 +01:00

74 KiB

API Types

This file is generated automatically.


ACIReaction

Record type:


AChat

Record type:


AChatItem

Record type:


AddRelayResult

Record type:


AddressSettings

Record type:


AgentCryptoError

Discriminated union type:

DECRYPT_AES:

  • type: "DECRYPT_AES"

DECRYPT_CB:

  • type: "DECRYPT_CB"

RATCHET_HEADER:

  • type: "RATCHET_HEADER"

RATCHET_SYNC:

  • type: "RATCHET_SYNC"

AgentErrorType

Discriminated union type:

CMD:

CONN:

NO_USER:

  • type: "NO_USER"

SMP:

  • type: "SMP"
  • serverAddress: string
  • smpErr: ErrorType

NTF:

  • type: "NTF"
  • serverAddress: string
  • ntfErr: ErrorType

XFTP:

FILE:

NO_NAME_SERVERS:

  • type: "NO_NAME_SERVERS"

PROXY:

  • type: "PROXY"
  • proxyServer: string
  • relayServer: string
  • proxyErr: ProxyClientError

RCP:

BROKER:

AGENT:

NOTICE:

  • type: "NOTICE"
  • server: string
  • preset: bool
  • expiresAt: UTCTime?

INTERNAL:

  • type: "INTERNAL"
  • internalErr: string

CRITICAL:

  • type: "CRITICAL"
  • offerRestart: bool
  • criticalErr: string

INACTIVE:

  • type: "INACTIVE"

AgentServiceError

Discriminated union type:

Rejected:

  • type: "rejected"
  • rejectReason: string

Timeout:

  • type: "timeout"

NoPendingRequest:

  • type: "noPendingRequest"

NotDRAddress:

  • type: "notDRAddress"

BadSignature:

  • type: "badSignature"

AppVersionRange

Remote controller app version range (min and max as version strings).

Record type:

  • minVersion: string
  • maxVersion: string

AutoAccept

Record type:

  • acceptIncognito: bool

BadgeInfo

Record type:

  • badgeType: BadgeType
  • badgeExpiry: UTCTime
  • badgeExtra: string

BadgeProof

Record type:

  • badgeKeyIdx: int
  • presHeader: string
  • proof: string
  • badgeInfo: BadgeInfo

BadgeRedeemError

Discriminated union type:

InvalidCode:

  • type: "invalidCode"

ServiceNotConfigured:

  • type: "serviceNotConfigured"

BadgeActive:

  • type: "badgeActive"

ServiceError:

InvalidResponse:

  • type: "invalidResponse"
  • message: string

UnknownKeyIndex:

  • type: "unknownKeyIndex"

CredentialNotVerified:

  • type: "credentialNotVerified"

BadgeServiceErrorCode

Enum type:

  • "bad_request"
  • "unsupported_version"
  • "unknown_purchase_key"
  • "unknown_offer_id"
  • "offer_disabled"
  • "offer_mismatch"
  • "product_unavailable"
  • "payment_not_entitled"
  • "payment_pending"
  • "provider_unavailable"
  • "rate_limited"
  • "code_invalid"
  • "code_used"
  • "code_expired"
  • "receipt_invalid"
  • "receipt_used"
  • "internal"

BadgeStatus

Enum type:

  • "active"
  • "expired"
  • "expiredOld"
  • "failed"
  • "unknownKey"

BadgeType

Enum type:

  • "supporter"
  • "legend"
  • "investor"

BlockingInfo

Record type:


BlockingReason

Enum type:

  • "spam"
  • "content"

BrokerErrorType

Discriminated union type:

RESPONSE:

  • type: "RESPONSE"
  • respErr: string

UNEXPECTED:

  • type: "UNEXPECTED"
  • respErr: string

NETWORK:

HOST:

  • type: "HOST"

NO_SERVICE:

  • type: "NO_SERVICE"

TRANSPORT:

TIMEOUT:

  • type: "TIMEOUT"

BusinessChatInfo

Record type:


BusinessChatType

Enum type:

  • "business"
  • "customer"

CICallStatus

Enum type:

  • "pending"
  • "missed"
  • "rejected"
  • "accepted"
  • "negotiated"
  • "progress"
  • "ended"
  • "error"

CIContent

Discriminated union type:

SndMsgContent:

RcvMsgContent:

SndDeleted:

RcvDeleted:

SndCall:

RcvCall:

RcvIntegrityError:

RcvDecryptionError:

  • type: "rcvDecryptionError"
  • msgDecryptError: MsgDecryptError
  • msgCount: word32

RcvMsgError:

RcvGroupInvitation:

SndGroupInvitation:

RcvDirectEvent:

RcvGroupEvent:

SndGroupEvent:

RcvConnEvent:

SndConnEvent:

RcvChatFeature:

SndChatFeature:

RcvChatPreference:

SndChatPreference:

RcvGroupFeature:

SndGroupFeature:

RcvChatFeatureRejected:

RcvGroupFeatureRejected:

  • type: "rcvGroupFeatureRejected"
  • groupFeature: GroupFeature

SndModerated:

  • type: "sndModerated"

RcvModerated:

  • type: "rcvModerated"

RcvBlocked:

  • type: "rcvBlocked"

SndDirectE2EEInfo:

  • type: "sndDirectE2EEInfo"
  • e2eeInfo: E2EInfo

RcvDirectE2EEInfo:

  • type: "rcvDirectE2EEInfo"
  • e2eeInfo: E2EInfo

SndGroupE2EEInfo:

  • type: "sndGroupE2EEInfo"
  • e2eeInfo: E2EInfo

RcvGroupE2EEInfo:

  • type: "rcvGroupE2EEInfo"
  • e2eeInfo: E2EInfo

ChatBanner:

  • type: "chatBanner"

CIDeleteMode

Enum type:

  • "broadcast"
  • "internal"
  • "internalMark"
  • "history"

CIDeleted

Discriminated union type:

Deleted:

  • type: "deleted"
  • deletedTs: UTCTime?
  • chatType: ChatType

Blocked:

  • type: "blocked"
  • deletedTs: UTCTime?

BlockedByAdmin:

  • type: "blockedByAdmin"
  • deletedTs: UTCTime?

Moderated:

  • type: "moderated"
  • deletedTs: UTCTime?
  • byGroupMember: GroupMember

CIDirection

Discriminated union type:

DirectSnd:

  • type: "directSnd"

DirectRcv:

  • type: "directRcv"

GroupSnd:

  • type: "groupSnd"

GroupRcv:

ChannelRcv:

  • type: "channelRcv"

LocalSnd:

  • type: "localSnd"

LocalRcv:

  • type: "localRcv"

CIFile

Record type:


CIFileStatus

Discriminated union type:

SndStored:

  • type: "sndStored"

SndTransfer:

  • type: "sndTransfer"
  • sndProgress: int64
  • sndTotal: int64

SndCancelled:

  • type: "sndCancelled"

SndComplete:

  • type: "sndComplete"

SndError:

SndWarning:

RcvInvitation:

  • type: "rcvInvitation"

RcvAccepted:

  • type: "rcvAccepted"

RcvTransfer:

  • type: "rcvTransfer"
  • rcvProgress: int64
  • rcvTotal: int64

RcvAborted:

  • type: "rcvAborted"

RcvComplete:

  • type: "rcvComplete"

RcvCancelled:

  • type: "rcvCancelled"

RcvError:

RcvWarning:

Invalid:

  • type: "invalid"
  • text: string

CIForwardedFrom

Discriminated union type:

Unknown:

  • type: "unknown"

Contact:

  • type: "contact"
  • chatName: string
  • msgDir: MsgDirection
  • contactId: int64?
  • chatItemId: int64?

Group:

  • type: "group"
  • chatName: string
  • msgDir: MsgDirection
  • groupId: int64?
  • chatItemId: int64?
  • memberId: string?
  • sharedMsgId_: string?
  • groupType: GroupType?

GroupLink:

  • type: "groupLink"
  • chatName: string
  • msgDir: MsgDirection
  • groupLink: string
  • publicGroupId: string
  • memberId: string?
  • sharedMsgId: string
  • groupType: GroupType?

CIGroupInvitation

Record type:


CIGroupInvitationStatus

Enum type:

  • "pending"
  • "accepted"
  • "rejected"
  • "expired"

CIMention

Record type:


CIMentionMember

Record type:

  • groupMemberId: int64
  • displayName: string
  • localAlias: string?
  • memberRole: GroupMemberRole

CIMeta

Record type:

  • itemId: int64
  • itemTs: UTCTime
  • itemText: string
  • itemStatus: CIStatus
  • sentViaProxy: bool?
  • itemSharedMsgId: string?
  • itemForwarded: CIForwardedFrom?
  • itemDeleted: CIDeleted?
  • itemEdited: bool
  • itemTimed: CITimed?
  • itemLive: bool?
  • userMention: bool
  • hasLink: bool
  • deletable: bool
  • editable: bool
  • forwardedByMember: int64?
  • showGroupAsSender: bool
  • msgVerified: MsgVerified?
  • createdAt: UTCTime
  • updatedAt: UTCTime

CIQuote

Record type:


CIReaction

Record type:


CIReactionCount

Record type:

  • reaction: MsgReaction
  • userReacted: bool
  • totalReacted: int

CIStatus

Discriminated union type:

SndNew:

  • type: "sndNew"

SndSent:

SndRcvd:

SndErrorAuth:

  • type: "sndErrorAuth"

SndError:

SndWarning:

  • type: "sndWarning"
  • agentError: SndError

RcvNew:

  • type: "rcvNew"

RcvRead:

  • type: "rcvRead"

Invalid:

  • type: "invalid"
  • text: string

CITimed

Record type:

  • ttl: int
  • deleteAt: UTCTime?

ChatBotCommand

Discriminated union type:

Command:

  • type: "command"
  • keyword: string
  • label: string
  • params: string?

Menu:


ChatDeleteMode

Discriminated union type:

Full:

  • type: "full"
  • notify: bool

Entity:

  • type: "entity"
  • notify: bool

Messages:

  • type: "messages"

Syntax:

full|entity|messages[ notify=off]
type + (type == 'messages' ? '' : (!notify ? ' notify=off' : '')) // JavaScript
str(type) + ('' if str(type) == 'messages' else (' notify=off' if not notify else '')) # Python

ChatError

Discriminated union type:

Error:

ErrorAgent:

ErrorStore:


ChatErrorType

Discriminated union type:

NoActiveUser:

  • type: "noActiveUser"

NoConnectionUser:

  • type: "noConnectionUser"
  • agentConnId: string

NoSndFileUser:

  • type: "noSndFileUser"
  • agentSndFileId: string

NoRcvFileUser:

  • type: "noRcvFileUser"
  • agentRcvFileId: string

UserUnknown:

  • type: "userUnknown"

UserExists:

  • type: "userExists"
  • contactName: string

ChatRelayExists:

  • type: "chatRelayExists"

DifferentActiveUser:

  • type: "differentActiveUser"
  • commandUserId: int64
  • activeUserId: int64

CantDeleteActiveUser:

  • type: "cantDeleteActiveUser"
  • userId: int64

CantDeleteLastUser:

  • type: "cantDeleteLastUser"
  • userId: int64

CantHideLastUser:

  • type: "cantHideLastUser"
  • userId: int64

HiddenUserAlwaysMuted:

  • type: "hiddenUserAlwaysMuted"
  • userId: int64

EmptyUserPassword:

  • type: "emptyUserPassword"
  • userId: int64

UserAlreadyHidden:

  • type: "userAlreadyHidden"
  • userId: int64

UserNotHidden:

  • type: "userNotHidden"
  • userId: int64

InvalidDisplayName:

  • type: "invalidDisplayName"
  • displayName: string
  • validName: string

ChatNotStarted:

  • type: "chatNotStarted"

ChatNotStopped:

  • type: "chatNotStopped"

ChatStoreChanged:

  • type: "chatStoreChanged"

InvalidConnReq:

  • type: "invalidConnReq"

SimplexDomainNotReady:

NotResolvedLocally:

  • type: "notResolvedLocally"

UnsupportedConnReq:

  • type: "unsupportedConnReq"

ConnReqMessageProhibited:

  • type: "connReqMessageProhibited"

ContactNotReady:

  • type: "contactNotReady"
  • contact: Contact

ContactNotActive:

  • type: "contactNotActive"
  • contact: Contact

ContactDisabled:

  • type: "contactDisabled"
  • contact: Contact

ConnectionDisabled:

  • type: "connectionDisabled"
  • connection: Connection

GroupUserRole:

GroupMemberInitialRole:

ContactIncognitoCantInvite:

  • type: "contactIncognitoCantInvite"

GroupIncognitoCantInvite:

  • type: "groupIncognitoCantInvite"

GroupContactRole:

  • type: "groupContactRole"
  • contactName: string

GroupDuplicateMember:

  • type: "groupDuplicateMember"
  • contactName: string

GroupDuplicateMemberId:

  • type: "groupDuplicateMemberId"

GroupNotJoined:

  • type: "groupNotJoined"
  • groupInfo: GroupInfo

GroupMemberNotActive:

  • type: "groupMemberNotActive"

CantBlockMemberForSelf:

GroupMemberUserRemoved:

  • type: "groupMemberUserRemoved"

GroupMemberNotFound:

  • type: "groupMemberNotFound"

GroupCantResendInvitation:

  • type: "groupCantResendInvitation"
  • groupInfo: GroupInfo
  • contactName: string

GroupInternal:

  • type: "groupInternal"
  • message: string

FileNotFound:

  • type: "fileNotFound"
  • message: string

FileSize:

  • type: "fileSize"
  • filePath: string

FileAlreadyReceiving:

  • type: "fileAlreadyReceiving"
  • message: string

FileCancelled:

  • type: "fileCancelled"
  • message: string

FileCancel:

  • type: "fileCancel"
  • fileId: int64
  • message: string

FileAlreadyExists:

  • type: "fileAlreadyExists"
  • filePath: string

FileWrite:

  • type: "fileWrite"
  • filePath: string
  • message: string

FileSend:

FileRcvChunk:

  • type: "fileRcvChunk"
  • message: string

FileInternal:

  • type: "fileInternal"
  • message: string

FileImageType:

  • type: "fileImageType"
  • filePath: string

FileImageSize:

  • type: "fileImageSize"
  • filePath: string

FileNotReceived:

  • type: "fileNotReceived"
  • fileId: int64

FileNotApproved:

  • type: "fileNotApproved"
  • fileId: int64
  • unknownServers: [string]

FallbackToSMPProhibited:

  • type: "fallbackToSMPProhibited"
  • fileId: int64

InlineFileProhibited:

  • type: "inlineFileProhibited"
  • fileId: int64

InvalidForward:

  • type: "invalidForward"

InvalidChatItemUpdate:

  • type: "invalidChatItemUpdate"

InvalidChatItemDelete:

  • type: "invalidChatItemDelete"

HasCurrentCall:

  • type: "hasCurrentCall"

NoCurrentCall:

  • type: "noCurrentCall"

CallContact:

  • type: "callContact"
  • contactId: int64

DirectMessagesProhibited:

AgentVersion:

  • type: "agentVersion"

AgentNoSubResult:

  • type: "agentNoSubResult"
  • agentConnId: string

CommandError:

  • type: "commandError"
  • message: string

BadgeRedeemError:

AgentCommandError:

  • type: "agentCommandError"
  • message: string

InvalidFileDescription:

  • type: "invalidFileDescription"
  • message: string

ConnectionIncognitoChangeProhibited:

  • type: "connectionIncognitoChangeProhibited"

ConnectionUserChangeProhibited:

  • type: "connectionUserChangeProhibited"

PeerChatVRangeIncompatible:

  • type: "peerChatVRangeIncompatible"

RelayTestError:

  • type: "relayTestError"
  • message: string

InternalError:

  • type: "internalError"
  • message: string

Exception:

  • type: "exception"
  • message: string

ChatFeature

Enum type:

  • "timedMessages"
  • "fullDelete"
  • "reactions"
  • "voice"
  • "files"
  • "calls"
  • "sessions"

ChatInfo

Discriminated union type:

Direct:

Group:

Local:

ContactRequest:

ContactConnection:


ChatItem

Record type:


ChatItemDeletion

Message deletion result.

Record type:


ChatListQuery

Discriminated union type:

Filters:

  • type: "filters"
  • favorite: bool
  • unread: bool

Search:

  • type: "search"
  • search: string

ChatPeerType

Enum type:

  • "human"
  • "bot"
  • "business"

ChatRef

Used in API commands. Chat scope can only be passed with groups.

Record type:

Syntax:

<str(chatType)><chatId>[<str(chatScope)>]
ChatType.cmdString(chatType) + chatId + (chatScope ? GroupChatScope.cmdString(chatScope) : '') // JavaScript
ChatType_cmd_string(chatType) + str(chatId) + ((GroupChatScope_cmd_string(chatScope)) if chatScope is not None else '') # Python

ChatSettings

Record type:

  • enableNtfs: MsgFilter
  • sendRcpts: bool?
  • favorite: bool

ChatStats

Record type:

  • unreadCount: int
  • unreadMentions: int
  • reportsCount: int
  • minUnreadItemId: int64
  • unreadChat: bool

ChatType

Enum type:

  • "direct"
  • "group"
  • "local"

Syntax:

@|#|*|
self == 'direct' ? '@' : self == 'group' ? '#' : self == 'local' ? '*' : '' // JavaScript
'@' if str(self) == 'direct' else '#' if str(self) == 'group' else '*' if str(self) == 'local' else '' # Python

ChatWallpaper

Record type:

  • preset: string?
  • imageFile: string?
  • background: string?
  • tint: string?
  • scaleType: ChatWallpaperScale?
  • scale: double?

ChatWallpaperScale

Enum type:

  • "fill"
  • "fit"
  • "repeat"

ClientNotice

Record type:

  • ttl: int64?

Color

Enum type:

  • "black"
  • "red"
  • "green"
  • "yellow"
  • "blue"
  • "magenta"
  • "cyan"
  • "white"

CommandError

Discriminated union type:

UNKNOWN:

  • type: "UNKNOWN"

SYNTAX:

  • type: "SYNTAX"

PROHIBITED:

  • type: "PROHIBITED"

NO_AUTH:

  • type: "NO_AUTH"

HAS_AUTH:

  • type: "HAS_AUTH"

NO_ENTITY:

  • type: "NO_ENTITY"

CommandErrorType

Discriminated union type:

PROHIBITED:

  • type: "PROHIBITED"

SYNTAX:

  • type: "SYNTAX"

NO_CONN:

  • type: "NO_CONN"

SIZE:

  • type: "SIZE"

LARGE:

  • type: "LARGE"

CommentsGroupPreference

Record type:


ComposedMessage

Record type:


ConnStatus

Discriminated union type:

New:

  • type: "new"

Prepared:

  • type: "prepared"

Joined:

  • type: "joined"

Requested:

  • type: "requested"

Accepted:

  • type: "accepted"

SndReady:

  • type: "sndReady"

Ready:

  • type: "ready"

Deleted:

  • type: "deleted"

Failed:

  • type: "failed"
  • connError: string

ConnType

Enum type:

  • "contact"
  • "member"
  • "user_contact"

Connection

Record type:

  • connId: int64
  • agentConnId: string
  • connChatVersion: int
  • peerChatVRange: VersionRange
  • connLevel: int
  • viaContact: int64?
  • viaUserContactLink: int64?
  • viaGroupLink: bool
  • groupLinkId: string?
  • xContactId: string?
  • customUserProfileId: int64?
  • connType: ConnType
  • connStatus: ConnStatus
  • contactConnInitiated: bool
  • localAlias: string
  • entityId: int64?
  • connectionCode: SecurityCode?
  • pqSupport: bool
  • pqEncryption: bool
  • pqSndEnabled: bool?
  • pqRcvEnabled: bool?
  • authErrCounter: int
  • quotaErrCounter: int
  • createdAt: UTCTime

ConnectionEntity

Discriminated union type:

RcvDirectMsgConnection:

RcvGroupMsgConnection:

UserContactConnection:


ConnectionErrorType

Discriminated union type:

NOT_FOUND:

  • type: "NOT_FOUND"

DUPLICATE:

  • type: "DUPLICATE"

SIMPLEX:

  • type: "SIMPLEX"

NOT_ACCEPTED:

  • type: "NOT_ACCEPTED"

NOT_AVAILABLE:

  • type: "NOT_AVAILABLE"

ConnectionMode

Enum type:

  • "inv"
  • "con"

ConnectionPlan

Discriminated union type:

InvitationLink:

ContactAddress:

GroupLink:

Error:


Contact

Record type:


ContactAddressPlan

Discriminated union type:

Ok:

OwnLink:

  • type: "ownLink"

ConnectingConfirmReconnect:

  • type: "connectingConfirmReconnect"

ConnectingProhibit:

  • type: "connectingProhibit"
  • contact: Contact

Known:

ContactViaAddress:

  • type: "contactViaAddress"
  • contact: Contact

ContactShortLinkData

Record type:


ContactStatus

Enum type:

  • "active"
  • "deleted"
  • "deletedByUser"
  • "rejected"

ContactUserPref

Discriminated union type:

Contact:

User:


ContactUserPreference

Record type:


ContactUserPreferences

Record type:


Record type:

  • connFullLink: string
  • connShortLink: string?

Syntax:

<connFullLink>[ <connShortLink>]
connFullLink + (connShortLink ? ' ' + connShortLink : '') // JavaScript
connFullLink + ((' ' + connShortLink) if connShortLink is not None else '') # Python

CryptoFile

Record type:


CryptoFileArgs

Record type:

  • fileKey: string
  • fileNonce: string

CtrlAppInfo

Remote controller application info.

Record type:


DomainVerification

Enum type:

  • "failed"
  • "verified"
  • "moved"

DroppedMsg

Record type:

  • brokerTs: UTCTime
  • attempts: int

E2EInfo

Record type:

  • public: bool?
  • pqEnabled: bool?

ErrorType

Discriminated union type:

BLOCK:

  • type: "BLOCK"

SESSION:

  • type: "SESSION"

CMD:

PROXY:

AUTH:

  • type: "AUTH"

BLOCKED:

SERVICE:

  • type: "SERVICE"

CRYPTO:

  • type: "CRYPTO"

QUOTA:

  • type: "QUOTA"

STORE:

  • type: "STORE"
  • storeErr: string

NO_MSG:

  • type: "NO_MSG"

LARGE_MSG:

  • type: "LARGE_MSG"

EXPIRED:

  • type: "EXPIRED"

INTERNAL:

  • type: "INTERNAL"

NAME:

DUPLICATE_:

  • type: "DUPLICATE_"

FeatureAllowed

Enum type:

  • "always"
  • "yes"
  • "no"

FileDescr

Record type:

  • fileDescrText: string
  • fileDescrPartNo: int
  • fileDescrComplete: bool

FileError

Discriminated union type:

Auth:

  • type: "auth"

Blocked:

NoFile:

  • type: "noFile"

Relay:

Other:

  • type: "other"
  • fileError: string

FileErrorType

Discriminated union type:

NOT_APPROVED:

  • type: "NOT_APPROVED"

SIZE:

  • type: "SIZE"

REDIRECT:

  • type: "REDIRECT"
  • redirectError: string

FILE_IO:

  • type: "FILE_IO"
  • fileIOError: string

NO_FILE:

  • type: "NO_FILE"

FileInvitation

Record type:


FileProhibited

Record type:


FileProtocol

Enum type:

  • "smp"
  • "xftp"
  • "local"

FileStatus

Enum type:

  • "new"
  • "accepted"
  • "connected"
  • "complete"
  • "cancelled"

FileTransferMeta

Record type:

  • fileId: int64
  • xftpSndFile: XFTPSndFile?
  • xftpRedirectFor: int64?
  • fileName: string
  • filePath: string
  • fileSize: int64
  • fileInline: InlineFileMode?
  • chunkSize: int64
  • cancelled: bool

FileType

Enum type:

  • "normal"
  • "roster"

Format

Discriminated union type:

Bold:

  • type: "bold"

Italic:

  • type: "italic"

StrikeThrough:

  • type: "strikeThrough"

Snippet:

  • type: "snippet"

Secret:

  • type: "secret"

Small:

  • type: "small"

Colored:

  • type: "colored"
  • color: Color

Uri:

  • type: "uri"

HyperLink:

  • type: "hyperLink"
  • showText: string?
  • linkUri: string

SimplexLink:

  • type: "simplexLink"
  • showText: string?
  • linkType: SimplexLinkType
  • simplexUri: string
  • smpHosts: [string]

SimplexName:

Command:

  • type: "command"
  • commandStr: string

Mention:

  • type: "mention"
  • memberName: string

Email:

  • type: "email"

Phone:

  • type: "phone"

FormattedText

Record type:

  • format: Format?
  • text: string

FullGroupPreferences

Record type:


FullPreferences

Record type:


Group

Record type:


GroupChatScope

Discriminated union type:

MemberSupport:

  • type: "memberSupport"
  • groupMemberId_: int64?

Syntax:

(_support[:<groupMemberId_>])
'(_support' + (groupMemberId_ ? ':' + groupMemberId_ : '') + ')' // JavaScript
'(_support' + ((':' + str(groupMemberId_)) if groupMemberId_ is not None else '') + ')' # Python

GroupChatScopeInfo

Discriminated union type:

MemberSupport:


GroupDirectInvitation

Record type:

  • groupDirectInvLink: string
  • fromGroupId_: int64?
  • fromGroupMemberId_: int64?
  • fromGroupMemberConnId_: int64?
  • groupDirectInvStartedConnection: bool

GroupFeature

Enum type:

  • "timedMessages"
  • "directMessages"
  • "fullDelete"
  • "reactions"
  • "voice"
  • "files"
  • "simplexLinks"
  • "reports"
  • "history"
  • "support"
  • "sessions"
  • "comments"
  • "signMessages"

GroupFeatureEnabled

Enum type:

  • "on"
  • "off"

GroupInfo

Record type:


Record type:

  • userContactLinkId: int64
  • connLinkContact: CreatedConnLink
  • shortLinkDataSet: bool
  • shortLinkLargeDataSet: bool
  • groupLinkId: string
  • acceptMemberRole: GroupMemberRole

GroupLinkOwner

Record type:

  • memberId: string
  • memberKey: string

GroupLinkPlan

Discriminated union type:

Ok:

OwnLink:

ConnectingConfirmReconnect:

  • type: "connectingConfirmReconnect"

ConnectingProhibit:

  • type: "connectingProhibit"
  • groupInfo_: GroupInfo?

Known:

NoRelays:

UpdateRequired:


GroupMember

Record type:


GroupMemberAdmission

Record type:


GroupMemberCategory

Enum type:

  • "user"
  • "invitee"
  • "host"
  • "pre"
  • "post"

GroupMemberRef

Record type:

  • groupMemberId: int64
  • profile: Profile

GroupMemberRole

Enum type:

  • "relay"
  • "observer"
  • "author"
  • "member"
  • "moderator"
  • "admin"
  • "owner"

GroupMemberSettings

Record type:

  • showMessages: bool

GroupMemberStatus

Enum type:

  • "rejected"
  • "removed"
  • "left"
  • "deleted"
  • "unknown"
  • "invited"
  • "pending_approval"
  • "pending_review"
  • "introduced"
  • "intro-inv"
  • "accepted"
  • "announced"
  • "connected"
  • "complete"
  • "creator"

GroupPreference

Record type:


GroupPreferences

Record type:


GroupProfile

Record type:


GroupRelay

Record type:


GroupShortLinkData

Record type:


GroupShortLinkInfo

Record type:

  • direct: bool
  • groupRelays: [string]
  • publicGroupId: string?

GroupSummary

Record type:

  • currentMembers: int64
  • publicMemberCount: int64?

GroupSupportChat

Record type:

  • chatTs: UTCTime
  • unread: int64
  • memberAttention: int64
  • mentions: int64
  • lastMsgFromMemberTs: UTCTime?

GroupType

Enum type:

  • "channel"
  • "group"

HandshakeError

Enum type:

  • "PARSE"
  • "IDENTITY"
  • "BAD_AUTH"
  • "BAD_SERVICE"

InlineFileMode

Enum type:

  • "offer"
  • "sent"

InvitationLinkPlan

Discriminated union type:

Ok:

OwnLink:

  • type: "ownLink"

Connecting:

  • type: "connecting"
  • contact_: Contact?

Known:


InvitedBy

Discriminated union type:

Contact:

  • type: "contact"
  • byContactId: int64

User:

  • type: "user"

Unknown:

  • type: "unknown"

LinkContent

Discriminated union type:

Page:

  • type: "page"

Image:

  • type: "image"

Video:

  • type: "video"
  • duration: int?

Unknown:

  • type: "unknown"
  • tag: string
  • json: JSONObject

LinkOwnerSig

Record type:

  • ownerId: string?
  • chatBinding: string
  • ownerSig: string

LinkPreview

Record type:

  • uri: string
  • title: string
  • description: string
  • image: string
  • content: LinkContent?

LocalBadge

Record type:


LocalProfile

Record type:


MemberCriteria

Enum type:

  • "all"

Connection link sent in a message - only short links are allowed.

Discriminated union type:

Contact:

  • type: "contact"
  • connLink: string
  • profile: Profile
  • business: bool

Invitation:

  • type: "invitation"
  • invLink: string
  • profile: Profile

Group:


MsgContent

Discriminated union type:

Text:

  • type: "text"
  • text: string

Link:

Image:

  • type: "image"
  • text: string
  • image: string

Video:

  • type: "video"
  • text: string
  • image: string
  • duration: int

Voice:

  • type: "voice"
  • text: string
  • duration: int

File:

  • type: "file"
  • text: string

Report:

Chat:

Unknown:

  • type: "unknown"
  • tag: string
  • text: string
  • json: JSONObject

MsgDecryptError

Enum type:

  • "ratchetHeader"
  • "tooManySkipped"
  • "ratchetEarlier"
  • "other"
  • "ratchetSync"

MsgDirection

Enum type:

  • "rcv"
  • "snd"

MsgErrorType

Discriminated union type:

MsgSkipped:

  • type: "msgSkipped"
  • fromMsgId: int64
  • toMsgId: int64

MsgBadId:

  • type: "msgBadId"
  • msgId: int64

MsgBadHash:

  • type: "msgBadHash"

MsgDuplicate:

  • type: "msgDuplicate"

MsgFilter

Enum type:

  • "none"
  • "all"
  • "mentions"

MsgReaction

Discriminated union type:

Emoji:

  • type: "emoji"
  • emoji: string

Unknown:

  • type: "unknown"
  • tag: string
  • json: JSONObject

MsgReceiptStatus

Enum type:

  • "ok"
  • "badMsgHash"

MsgSigStatus

Enum type:

  • "verified"
  • "signedNoKey"

MsgVerified

Discriminated union type:

Signed:

SigMissing:

  • type: "sigMissing"

NameChange

Discriminated union type:

Lapsed:

Moved:


NameErrorType

Discriminated union type:

NO_RESOLVER:

  • type: "NO_RESOLVER"

NOT_FOUND:

  • type: "NOT_FOUND"

RESOLVER:

  • type: "RESOLVER"
  • resolverErr: string

NamePrice

Record type:

  • amount: int64
  • years: int

NameWarning

Discriminated union type:

Expired:

  • type: "expired"
  • expiredAt: UTCTime
  • graceUntil: UTCTime?

Available:

ReservedForCommunity:

  • type: "reservedForCommunity"

NotRegistered:

  • type: "notRegistered"

NetworkError

Discriminated union type:

ConnectError:

  • type: "connectError"
  • connectError: string

TLSError:

  • type: "tLSError"
  • tlsError: string

UnknownCAError:

  • type: "unknownCAError"

FailedError:

  • type: "failedError"

TimeoutError:

  • type: "timeoutError"

SubscribeError:

  • type: "subscribeError"
  • subscribeError: string

NewUser

Record type:

  • profile: Profile?
  • pastTimestamp: bool
  • userChatRelay: bool
  • clientService: bool

NoteFolder

Record type:

  • noteFolderId: int64
  • userId: int64
  • createdAt: UTCTime
  • updatedAt: UTCTime
  • chatTs: UTCTime
  • favorite: bool
  • unread: bool

OwnerVerification

Discriminated union type:

Verified:

  • type: "verified"

Failed:

  • type: "failed"
  • reason: string

PaginationByTime

Discriminated union type:

Last:

  • type: "last"
  • count: int

Syntax:

count=<count>
'count=' + count // JavaScript
'count=' + str(count) # Python

PendingContactConnection

Record type:

  • pccConnId: int64
  • pccAgentConnId: string
  • pccConnStatus: ConnStatus
  • viaContactUri: bool
  • viaUserContactLink: int64?
  • groupLinkId: string?
  • customUserProfileId: int64?
  • connLinkInv: CreatedConnLink?
  • localAlias: string
  • createdAt: UTCTime
  • updatedAt: UTCTime

PlanResolveMode

Enum type:

  • "allGroups"
  • "unknown"
  • "never"

PrefEnabled

Record type:

  • forUser: bool
  • forContact: bool

Preferences

Record type:


PreparedContact

Record type:


PreparedGroup

Record type:

  • connLinkToConnect: CreatedConnLink
  • connLinkPreparedConnection: bool
  • connLinkStartedConnection: bool
  • welcomeSharedMsgId: string?
  • requestSharedMsgId: string?

Profile

Record type:


ProxyClientError

Discriminated union type:

ProtocolError:

  • type: "protocolError"
  • protocolErr: ErrorType

UnexpectedResponse:

  • type: "unexpectedResponse"
  • responseStr: string

ResponseError:

  • type: "responseError"
  • responseErr: ErrorType

ProxyError

Discriminated union type:

PROTOCOL:

BROKER:

BASIC_AUTH:

  • type: "BASIC_AUTH"

NO_SESSION:

  • type: "NO_SESSION"

PublicGroupAccess

Record type:

  • groupWebPage: string?
  • groupDomainClaim: SimplexDomainClaim?
  • domainWebPage: bool
  • allowEmbedding: bool

PublicGroupData

Record type:

  • publicMemberCount: int64

PublicGroupProfile

Record type:


RCErrorType

Discriminated union type:

Internal:

  • type: "internal"
  • internalErr: string

Identity:

  • type: "identity"

NoLocalAddress:

  • type: "noLocalAddress"

NewController:

  • type: "newController"

NotDiscovered:

  • type: "notDiscovered"

TLSStartFailed:

  • type: "tLSStartFailed"

Exception:

  • type: "exception"
  • exception: string

CtrlAuth:

  • type: "ctrlAuth"

CtrlNotFound:

  • type: "ctrlNotFound"

CtrlError:

  • type: "ctrlError"
  • ctrlErr: string

Invitation:

  • type: "invitation"

Version:

  • type: "version"

Encrypt:

  • type: "encrypt"

Decrypt:

  • type: "decrypt"

BlockSize:

  • type: "blockSize"

Syntax:

  • type: "syntax"
  • syntaxErr: string

RatchetSyncState

Enum type:

  • "ok"
  • "allowed"
  • "required"
  • "started"
  • "agreed"

RcvConnEvent

Discriminated union type:

SwitchQueue:

RatchetSync:

VerificationCodeReset:

  • type: "verificationCodeReset"

PqEnabled:

  • type: "pqEnabled"
  • enabled: bool

RcvDirectEvent

Discriminated union type:

ContactDeleted:

  • type: "contactDeleted"

ProfileUpdated:

GroupInvLinkReceived:


RcvFileDescr

Record type:

  • fileDescrId: int64
  • fileDescrText: string
  • fileDescrPartNo: int
  • fileDescrComplete: bool

RcvFileStatus

Discriminated union type:

New:

  • type: "new"

Accepted:

  • type: "accepted"
  • filePath: string

Connected:

  • type: "connected"
  • filePath: string

Complete:

  • type: "complete"
  • filePath: string

Cancelled:

  • type: "cancelled"
  • filePath_: string?

RcvFileTransfer

Record type:


RcvGroupEvent

Discriminated union type:

MemberAdded:

  • type: "memberAdded"
  • groupMemberId: int64
  • profile: Profile

MemberConnected:

  • type: "memberConnected"

MemberAccepted:

  • type: "memberAccepted"
  • groupMemberId: int64
  • profile: Profile

UserAccepted:

  • type: "userAccepted"

MemberLeft:

  • type: "memberLeft"

MemberRole:

MemberBlocked:

  • type: "memberBlocked"
  • groupMemberId: int64
  • profile: Profile
  • blocked: bool

UserRole:

MemberDeleted:

  • type: "memberDeleted"
  • groupMemberId: int64
  • profile: Profile

UserDeleted:

  • type: "userDeleted"

GroupDeleted:

  • type: "groupDeleted"

GroupUpdated:

InvitedViaGroupLink:

  • type: "invitedViaGroupLink"

MemberCreatedContact:

  • type: "memberCreatedContact"

MemberProfileUpdated:

  • type: "memberProfileUpdated"
  • fromProfile: Profile
  • toProfile: Profile

NewMemberPendingReview:

  • type: "newMemberPendingReview"

MsgBadSignature:

  • type: "msgBadSignature"

RcvMsgError

Discriminated union type:

Dropped:

  • type: "dropped"
  • attempts: int

ParseError:

  • type: "parseError"
  • parseError: string

RelayCapabilities

Record type:

  • webDomain: string?

RelayConnectionResult

Record type:


RelayProfile

Record type:

  • displayName: string
  • fullName: string
  • shortDescr: string?
  • image: string?

RelayStatus

Enum type:

  • "new"
  • "invited"
  • "accepted"
  • "acknowledgedRoster"
  • "active"
  • "inactive"
  • "rejected"

RemoteCtrlInfo

Record type:


RemoteCtrlSessionState

Discriminated union type:

Starting:

  • type: "starting"

Searching:

  • type: "searching"

Connecting:

  • type: "connecting"

PendingConfirmation:

  • type: "pendingConfirmation"
  • sessionCode: string

Connected:

  • type: "connected"
  • sessionCode: string

RemoteCtrlStopReason

Discriminated union type:

DiscoveryFailed:

  • type: "discoveryFailed"
  • chatError: ChatError

ConnectionFailed:

  • type: "connectionFailed"
  • chatError: ChatError

SetupFailed:

Disconnected:

  • type: "disconnected"

ReportReason

Enum type:

  • "spam"
  • "content"
  • "community"
  • "profile"
  • "other"

RoleGroupPreference

Record type:


SMPAgentError

Discriminated union type:

A_MESSAGE:

  • type: "A_MESSAGE"
  • messageErr: string

A_PROHIBITED:

  • type: "A_PROHIBITED"
  • prohibitedErr: string

A_VERSION:

  • type: "A_VERSION"

A_LINK:

  • type: "A_LINK"
  • linkErr: string

A_CRYPTO:

A_DUPLICATE:

A_QUEUE:

  • type: "A_QUEUE"
  • queueErr: string

A_SERVICE:


SecurityCode

Record type:

  • securityCode: string
  • verifiedAt: UTCTime

SimplePreference

Record type:


SimplexDomain

Record type:

  • nameTLD: SimplexTLD
  • domain: string
  • subDomain: [string]

SimplexDomainClaim

Record type:


SimplexDomainError

Discriminated union type:

NoValidLink:

  • type: "noValidLink"

UnknownDomain:

  • type: "unknownDomain"

NameWarning:


SimplexDomainProof

Record type:

  • linkOwnerId: string?
  • presHeader: string
  • signature: string

SimplexLinkType

Enum type:

  • "contact"
  • "invitation"
  • "group"
  • "channel"
  • "relay"

SimplexNameInfo

Record type:


SimplexNameType

Enum type:

  • "publicGroup"
  • "contact"

SimplexTLD

Enum type:

  • "simplex"
  • "testing"
  • "web"

SndCIStatusProgress

Enum type:

  • "partial"
  • "complete"

SndConnEvent

Discriminated union type:

SwitchQueue:

RatchetSync:

PqEnabled:

  • type: "pqEnabled"
  • enabled: bool

SndError

Discriminated union type:

Auth:

  • type: "auth"

Quota:

  • type: "quota"

Expired:

  • type: "expired"

Relay:

Proxy:

  • type: "proxy"
  • proxyServer: string
  • srvError: SrvError

ProxyRelay:

  • type: "proxyRelay"
  • proxyServer: string
  • srvError: SrvError

Other:

  • type: "other"
  • sndError: string

SndFileTransfer

Record type:

  • fileId: int64
  • fileName: string
  • filePath: string
  • fileSize: int64
  • chunkSize: int64
  • recipientDisplayName: string
  • connId: int64
  • agentConnId: string
  • groupMemberId: int64?
  • fileStatus: FileStatus
  • fileDescrId: int64?
  • fileInline: InlineFileMode?

SndGroupEvent

Discriminated union type:

MemberRole:

MemberBlocked:

  • type: "memberBlocked"
  • groupMemberId: int64
  • profile: Profile
  • blocked: bool

UserRole:

MemberDeleted:

  • type: "memberDeleted"
  • groupMemberId: int64
  • profile: Profile

UserLeft:

  • type: "userLeft"

GroupUpdated:

MemberAccepted:

  • type: "memberAccepted"
  • groupMemberId: int64
  • profile: Profile

UserPendingReview:

  • type: "userPendingReview"

SrvError

Discriminated union type:

Host:

  • type: "host"

Version:

  • type: "version"

Other:

  • type: "other"
  • srvError: string

StoreError

Discriminated union type:

DuplicateName:

  • type: "duplicateName"

UserNotFound:

  • type: "userNotFound"
  • userId: int64

RelayUserNotFound:

  • type: "relayUserNotFound"

UserNotFoundByName:

  • type: "userNotFoundByName"
  • contactName: string

UserNotFoundByContactId:

  • type: "userNotFoundByContactId"
  • contactId: int64

UserNotFoundByGroupId:

  • type: "userNotFoundByGroupId"
  • groupId: int64

UserNotFoundByFileId:

  • type: "userNotFoundByFileId"
  • fileId: int64

UserNotFoundByContactRequestId:

  • type: "userNotFoundByContactRequestId"
  • contactRequestId: int64

ContactNotFound:

  • type: "contactNotFound"
  • contactId: int64

ContactNotFoundByName:

  • type: "contactNotFoundByName"
  • contactName: string

ContactNotFoundByMemberId:

  • type: "contactNotFoundByMemberId"
  • groupMemberId: int64

ContactNotReady:

  • type: "contactNotReady"
  • contactName: string

DuplicateContactLink:

  • type: "duplicateContactLink"

UserContactLinkNotFound:

  • type: "userContactLinkNotFound"

ContactRequestNotFound:

  • type: "contactRequestNotFound"
  • contactRequestId: int64

ContactRequestNotFoundByName:

  • type: "contactRequestNotFoundByName"
  • contactName: string

InvalidContactRequestEntity:

  • type: "invalidContactRequestEntity"
  • contactRequestId: int64

InvalidBusinessChatContactRequest:

  • type: "invalidBusinessChatContactRequest"

GroupNotFound:

  • type: "groupNotFound"
  • groupId: int64

GroupNotFoundByName:

  • type: "groupNotFoundByName"
  • groupName: string

GroupMemberNameNotFound:

  • type: "groupMemberNameNotFound"
  • groupId: int64
  • groupMemberName: string

GroupMemberNotFound:

  • type: "groupMemberNotFound"
  • groupMemberId: int64

GroupMemberNotFoundByIndex:

  • type: "groupMemberNotFoundByIndex"
  • groupMemberIndex: int64

MemberRelationsVectorNotFound:

  • type: "memberRelationsVectorNotFound"
  • groupMemberId: int64

GroupHostMemberNotFound:

  • type: "groupHostMemberNotFound"
  • groupId: int64

GroupMemberNotFoundByMemberId:

  • type: "groupMemberNotFoundByMemberId"
  • memberId: string

MemberContactGroupMemberNotFound:

  • type: "memberContactGroupMemberNotFound"
  • contactId: int64

InvalidMemberRelationUpdate:

  • type: "invalidMemberRelationUpdate"

GroupWithoutUser:

  • type: "groupWithoutUser"

DuplicateGroupMember:

  • type: "duplicateGroupMember"

DuplicateMemberId:

  • type: "duplicateMemberId"

GroupAlreadyJoined:

  • type: "groupAlreadyJoined"

GroupInvitationNotFound:

  • type: "groupInvitationNotFound"

NoteFolderAlreadyExists:

  • type: "noteFolderAlreadyExists"
  • noteFolderId: int64

NoteFolderNotFound:

  • type: "noteFolderNotFound"
  • noteFolderId: int64

UserNoteFolderNotFound:

  • type: "userNoteFolderNotFound"

SndFileNotFound:

  • type: "sndFileNotFound"
  • fileId: int64

SndFileInvalid:

  • type: "sndFileInvalid"
  • fileId: int64

RcvFileNotFound:

  • type: "rcvFileNotFound"
  • fileId: int64

RcvFileDescrNotFound:

  • type: "rcvFileDescrNotFound"
  • fileId: int64

FileNotFound:

  • type: "fileNotFound"
  • fileId: int64

RcvFileInvalid:

  • type: "rcvFileInvalid"
  • fileId: int64

RcvFileInvalidDescrPart:

  • type: "rcvFileInvalidDescrPart"

LocalFileNoTransfer:

  • type: "localFileNoTransfer"
  • fileId: int64

SharedMsgIdNotFoundByFileId:

  • type: "sharedMsgIdNotFoundByFileId"
  • fileId: int64

FileIdNotFoundBySharedMsgId:

  • type: "fileIdNotFoundBySharedMsgId"
  • sharedMsgId: string

SndFileNotFoundXFTP:

  • type: "sndFileNotFoundXFTP"
  • agentSndFileId: string

RcvFileNotFoundXFTP:

  • type: "rcvFileNotFoundXFTP"
  • agentRcvFileId: string

ConnectionNotFound:

  • type: "connectionNotFound"
  • agentConnId: string

ConnectionNotFoundById:

  • type: "connectionNotFoundById"
  • connId: int64

ConnectionNotFoundByMemberId:

  • type: "connectionNotFoundByMemberId"
  • groupMemberId: int64

PendingConnectionNotFound:

  • type: "pendingConnectionNotFound"
  • connId: int64

UniqueID:

  • type: "uniqueID"

LargeMsg:

  • type: "largeMsg"

InternalError:

  • type: "internalError"
  • message: string

DBException:

  • type: "dBException"
  • message: string

DBBusyError:

  • type: "dBBusyError"
  • message: string

BadChatItem:

  • type: "badChatItem"
  • itemId: int64
  • itemTs: UTCTime?

ChatItemNotFound:

  • type: "chatItemNotFound"
  • itemId: int64

ChatItemNotFoundByText:

  • type: "chatItemNotFoundByText"
  • text: string

ChatItemSharedMsgIdNotFound:

  • type: "chatItemSharedMsgIdNotFound"
  • sharedMsgId: string

ChatItemNotFoundByFileId:

  • type: "chatItemNotFoundByFileId"
  • fileId: int64

ChatItemNotFoundByContactId:

  • type: "chatItemNotFoundByContactId"
  • contactId: int64

ChatItemNotFoundByGroupId:

  • type: "chatItemNotFoundByGroupId"
  • groupId: int64

ProfileNotFound:

  • type: "profileNotFound"
  • profileId: int64

DuplicateGroupLink:

  • type: "duplicateGroupLink"
  • groupInfo: GroupInfo

GroupLinkNotFound:

  • type: "groupLinkNotFound"
  • groupInfo: GroupInfo

HostMemberIdNotFound:

  • type: "hostMemberIdNotFound"
  • groupId: int64

ContactNotFoundByFileId:

  • type: "contactNotFoundByFileId"
  • fileId: int64

NoGroupSndStatus:

  • type: "noGroupSndStatus"
  • itemId: int64
  • groupMemberId: int64

DuplicateGroupMessage:

  • type: "duplicateGroupMessage"
  • groupId: int64
  • sharedMsgId: string
  • authorGroupMemberId: int64?
  • forwardedByGroupMemberId: int64?

RemoteHostNotFound:

  • type: "remoteHostNotFound"
  • remoteHostId: int64

RemoteHostUnknown:

  • type: "remoteHostUnknown"

RemoteHostDuplicateCA:

  • type: "remoteHostDuplicateCA"

RemoteCtrlNotFound:

  • type: "remoteCtrlNotFound"
  • remoteCtrlId: int64

RemoteCtrlDuplicateCA:

  • type: "remoteCtrlDuplicateCA"

ProhibitedDeleteUser:

  • type: "prohibitedDeleteUser"
  • userId: int64
  • contactId: int64

OperatorNotFound:

  • type: "operatorNotFound"
  • serverOperatorId: int64

UsageConditionsNotFound:

  • type: "usageConditionsNotFound"

UserChatRelayNotFound:

  • type: "userChatRelayNotFound"
  • chatRelayId: int64

GroupRelayNotFound:

  • type: "groupRelayNotFound"
  • groupRelayId: int64

GroupRelayNotFoundByMemberId:

  • type: "groupRelayNotFoundByMemberId"
  • groupMemberId: int64

InvalidQuote:

  • type: "invalidQuote"

InvalidMention:

  • type: "invalidMention"

InvalidDeliveryTask:

  • type: "invalidDeliveryTask"
  • taskId: int64

DeliveryTaskNotFound:

  • type: "deliveryTaskNotFound"
  • taskId: int64

InvalidDeliveryJob:

  • type: "invalidDeliveryJob"
  • jobId: int64

DeliveryJobNotFound:

  • type: "deliveryJobNotFound"
  • jobId: int64

WalletNotFound:

  • type: "walletNotFound"

DuplicateWallet:

  • type: "duplicateWallet"

WorkItemError:

  • type: "workItemError"
  • errContext: string

SubscriptionStatus

Discriminated union type:

Active:

  • type: "active"

Pending:

  • type: "pending"

Removed:

  • type: "removed"
  • subError: string

NoSub:

  • type: "noSub"

SupportGroupPreference

Record type:


SwitchPhase

Enum type:

  • "started"
  • "confirmed"
  • "secured"
  • "completed"

TimedMessagesGroupPreference

Record type:


TimedMessagesPreference

Record type:


TransportError

Discriminated union type:

BadBlock:

  • type: "badBlock"

Version:

  • type: "version"

LargeMsg:

  • type: "largeMsg"

BadSession:

  • type: "badSession"

NoServerAuth:

  • type: "noServerAuth"

Handshake:


UIColorMode

Enum type:

  • "light"
  • "dark"

UIColors

Record type:

  • accent: string?
  • accentVariant: string?
  • secondary: string?
  • secondaryVariant: string?
  • background: string?
  • menus: string?
  • title: string?
  • accentVariant2: string?
  • sentMessage: string?
  • sentReply: string?
  • receivedMessage: string?
  • receivedReply: string?

UIThemeEntityOverride

Record type:


UIThemeEntityOverrides

Record type:


UpdatedMessage

Record type:

  • msgContent: MsgContent
  • mentions: {string : int64}

User

Record type:

  • userId: int64
  • agentUserId: int64
  • userContactId: int64
  • localDisplayName: string
  • profile: LocalProfile
  • fullPreferences: FullPreferences
  • activeUser: bool
  • activeOrder: int64
  • viewPwdHash: UserPwdHash?
  • showNtfs: bool
  • sendRcptsContacts: bool
  • sendRcptsSmallGroups: bool
  • autoAcceptMemberContacts: bool
  • autoAcceptGroupInvitations: bool
  • userMemberProfileUpdatedAt: UTCTime?
  • userChatRelay: bool
  • clientService: bool
  • uiThemes: UIThemeEntityOverrides?

UserChatRelay

Record type:

  • chatRelayId: int64
  • address: string
  • relayProfile: RelayProfile
  • domains: [string]
  • preset: bool
  • tested: bool?
  • enabled: bool
  • deleted: bool

UserContact

Record type:

  • userContactLinkId: int64
  • connReqContact: string
  • groupId: int64?

Record type:


UserContactRequest

Record type:

  • contactRequestId: int64
  • agentInvitationId: string
  • contactId_: int64?
  • businessGroupId_: int64?
  • userContactLinkId_: int64?
  • cReqChatVRange: VersionRange
  • localDisplayName: string
  • profileId: int64
  • profile: LocalProfile
  • createdAt: UTCTime
  • updatedAt: UTCTime
  • xContactId: string?
  • pqSupport: bool
  • welcomeSharedMsgId: string?
  • requestSharedMsgId: string?
  • rejectionSupported: bool

UserContactRequestRef

Record type:

  • contactRequestId: int64
  • rejectionSupported: bool

UserInfo

Record type:

  • user: User
  • unreadCount: int

UserProfileUpdateSummary

Record type:

  • updateSuccesses: int
  • updateFailures: int
  • changedContacts: [Contact]

UserPwdHash

Record type:

  • hash: string
  • salt: string

VersionRange

Record type:

  • minVersion: int
  • maxVersion: int

XFTPErrorType

Discriminated union type:

BLOCK:

  • type: "BLOCK"

SESSION:

  • type: "SESSION"

HANDSHAKE:

  • type: "HANDSHAKE"

CMD:

AUTH:

  • type: "AUTH"

BLOCKED:

SIZE:

  • type: "SIZE"

QUOTA:

  • type: "QUOTA"

DIGEST:

  • type: "DIGEST"

CRYPTO:

  • type: "CRYPTO"

NO_FILE:

  • type: "NO_FILE"

HAS_FILE:

  • type: "HAS_FILE"

FILE_IO:

  • type: "FILE_IO"

TIMEOUT:

  • type: "TIMEOUT"

INTERNAL:

  • type: "INTERNAL"

DUPLICATE_:

  • type: "DUPLICATE_"

XFTPRcvFile

Record type:

  • rcvFileDescription: RcvFileDescr
  • agentRcvFileId: string?
  • agentRcvFileDeleted: bool
  • userApprovedRelays: bool

XFTPSndFile

Record type:

  • agentSndFileId: string
  • privateSndFileDescr: string?
  • agentSndFileDeleted: bool
  • cryptoArgs: CryptoFileArgs?