Skip to main content
Each model in Morse runs at one of four privacy tiers: anon, private, tee, or e2ee. You choose the tier by choosing the model.

List the models

GET /v1/models lists every model with its id, tier, type (such as chat or image), display label, and retention. Chat and image models also list their price in micros, and 10,000 micros are one credit. The list is free, and it has its own rate limit of 60 calls a minute, apart from your plan’s.
The same model at two tiers has two ids. For example, GLM 5.3 is glm-5.3 at private, glm-5.3-tee at tee, and z-ai/glm-5.3 at e2ee.

What each tier protects

If Morse can’t verify an enclave’s attestation, requests to its tee and e2ee models get 503 with the code upstream_unattested until a check passes.

Call an e2ee model

An e2ee model needs a client that encrypts messages before it sends them. The OpenAI SDKs don’t, and these docs don’t yet describe the encryption protocol for API keys. From your own code, use a tee model for now. The Morse app encrypts its e2ee chats itself. Morse promises that it doesn’t see your plaintext, not that it can’t. The encryption doesn’t bind your client’s public key into the ciphertext, so a relay in the path, Morse included, could swap that key. You trust Morse not to.

Fields Morse forwards

On models outside e2ee, Morse builds the request it sends to the vendor from these fields alone: model, messages, max_tokens or max_completion_tokens, stream, stream_options, reasoning_effort, tools, tool_choice, and parallel_tool_calls. It drops every other field without an error, including temperature, top_p, stop, seed, response_format, and user. Images and other media go in a message as data: URIs, encoded in base64. A media link to a URL gets 400 with the code remote_media.