Every documented route, request shape, and response example in one searchable catalog.
Base URL
api.dyva.ai/v1
Catalog
12 resources · 88 endpoints
Live status
88 endpoints
/v1/auth/signupCreate an account and receive a session immediately. Sends a verification email in the background; email_verified starts false.PublicPOST/v1/auth/loginAuthenticate and receive an access / refresh token pair. Returns requires_2fa instead when the account has TOTP enabled.PublicPOST/v1/auth/verify-emailVerify email using the token from the verification email.PublicPOST/v1/auth/forgot-passwordSend a password-reset email. Always responds the same way regardless of whether the email is registered, so the endpoint cannot be used to check who has an account.PublicPOST/v1/auth/reset-passwordReset password using the token from the reset email. The token is single-use: a second attempt with the same token is rejected even before it expires.PublicGET/v1/auth/meGet the authenticated user's full profile.AuthPATCH/v1/auth/meUpdate profile fields. Only fields present in the request body change; this is a representative subset of a larger allowed-field list, not the complete one.AuthPOST/v1/api-keysCreate an API key. The full key is returned once, at creation, and never again; only a short prefix is stored for display.AuthGET/v1/api-keysList your API keys. The response is a plain array; keys never include the full secret after creation, only the prefix.AuthDELETE/v1/api-keys/:idRevoke an API key. Requests using it fail immediately afterward. Responds with no body.AuthPOST/v1/auth/export-dataDownload a full data export (GDPR Art. 15/20). Streams the file directly in the response; there is no background job, export ID, or polling status to check.AuthDELETE/v1/auth/mePermanently delete your account. Deletion runs immediately, in one transaction; there is no grace period. Add ?dry_run=1 to get the same counts back without changing anything.Auth/v1/dyvasCreate a character with a name and, optionally, a system prompt, greeting, personality, and visibility.AuthGET/v1/dyvasList every character you own. Returns a plain array; there is no pagination, sort, or filter parameter on this endpoint.AuthGET/v1/dyvas/:idGet full details for a single character. Works without a token for public and unlisted characters; private characters are visible only to their owner. The system prompt is returned as null unless you're the owner.PublicPATCH/v1/dyvas/:idUpdate one or more fields. Only included fields change. This page previously documented this as a PUT; grepping the live route table on 2026-08-13 found only a PATCH handler. There is no PUT route for this path.AuthDELETE/v1/dyvas/:idDelete a character and all its conversations. Cannot be undone.AuthGET/v1/dyvas/exploreBrowse public characters. This endpoint has no auth requirement at all; the Authorization header shown here is optional.Public/v1/conversationsStart a conversation with a Dyva. There is no title field: a conversation is untitled until one gets set some other way. If the character has a greeting message, it's inserted immediately, so message_count may already be 1 in the response, not 0.AuthGET/v1/conversationsList your conversations, most recently active first. Returns a plain array; there is no total count or has_more flag. Pagination is page-based, not limit/offset.AuthGET/v1/conversations/:idGet one conversation's own fields: title, character, scene, takeover state. This does not include the message list; call GET /v1/conversations/:id/messages separately for that.AuthDELETE/v1/conversations/:idDelete a conversation and all messages. Cannot be undone.AuthGET/v1/conversations/:id/messagesGet message history, oldest first. Returns a plain array, capped at 200 rows per call. There is no offset parameter; page backward with before.AuthPOST/v1/conversations/:id/messagesSend a message. Without stream, blocks until generation completes and returns the stored messages; see the streaming note below for real-time output.AuthPOST/v1/conversations/:id/messagesSame endpoint as above, with stream: true. Response is text/event-stream instead of a blocking JSON reply.AuthGET/v1/conversations/searchSubstring search across your own message content (SQL ILIKE, not ranked full-text search). Returns a plain array of matching messages, capped at 20 rows; the limit isn't configurable. Queries under 2 characters return an empty array.Auth/v1/marketplaceBrowse public Dyvas. Filter, search, and sort. Responds with a plain array, not a paginated envelope: there is no total count in this response.PublicGET/v1/marketplace/featuredStaff-curated Dyvas, ranked by likes and conversation count. Plain array, always up to 12 entries.PublicGET/v1/marketplace/categoriesList marketplace categories with a live Dyva count in each. Use the slug for the category query parameter above.PublicGET/v1/marketplace/categories/:slugPublic Dyvas within one category, ranked by the same weighted score as the browse endpoint's default sort.PublicGET/v1/marketplace/:idFull listing detail. Accepts a Dyva ID or its slug. Owner-only fields (system_prompt, tool_config, and a few others) are null unless you're authenticated as the owner.PublicGET/v1/marketplace/:id/reviewsWritten ratings for a listing, newest first. Plain array; there is no rating-distribution or total field in this response.PublicGET/v1/marketplace/:id/similarUp to 6 other public Dyvas in the same category, ranked by conversation count.Public/v1/studio/:id/analyticsConversation and message counts for the period, plus a day-by-day conversation breakdown. There is no unique_users or retention_rate field.AuthGET/v1/studio/:id/versionsList saved snapshots, newest first. Plain array, capped at 20.AuthPOST/v1/studio/:id/versionsSnapshot the Dyva's current system_prompt and personality as a new version. The body cannot set instruction text directly; it only labels the snapshot.AuthPOST/v1/studio/:id/versions/:version_id/restoreCopy a saved snapshot's system_prompt and personality back onto the live Dyva. Not the PUT .../activate endpoint some older client code may expect: restoring is a POST, and the response is the full updated Dyva, not a version object.AuthPOST/v1/studio/:id/test-chatSend a single test turn against an optional system prompt override, without creating a real conversation. The body param is content, not message, and there is no version_id targeting; pass system_prompt directly if you want to test something other than the Dyva's current live prompt.AuthGET/v1/studio/:id/variantsList A/B variants for a Dyva. Plain array; metrics aren't included in this response (see /variants/analytics for that).AuthPOST/v1/studio/:id/variantsCreate a variant. name is required; traffic_pct defaults to 50 and must not push the active total over 100.AuthPATCH/v1/studio/:id/variants/:variant_idUpdate a variant. All fields optional. Not a PUT: a PUT to this path returns 404, since only PATCH is registered.AuthPOST/v1/studio/:id/publishPublish to the marketplace. Only category_slug is accepted in the body. There is no tags or pricing field on this endpoint. Fails with 422 and a readiness object when the Dyva isn't publish-ready (missing avatar, no category, etc.), not with a generic 400.AuthPOST/v1/studio/:id/unpublishTake a Dyva off the marketplace. Sets visibility back to private; the Dyva itself is untouched.Auth/v1/integrationsList every integration on your account.AuthPOST/v1/integrationsCreate an integration. This is a generic record, not a platform-specific setup flow: there is no dedicated Discord, Telegram, or Slack connect endpoint (see the note below). platform_config is stored as-is; this API does not validate its shape against a platform.AuthDELETE/v1/integrations/:idRemove an integration by id.Auth/v1/roomsCreate a room. At least one Dyva is required; you can't create an empty room and add characters later through this endpoint alone. You become the owner.AuthGET/v1/roomsPublic room directory, ranked by message count. Plain array, capped at 50 rooms, no pagination parameters. Use GET /v1/rooms/my for the rooms you actually belong to.PublicGET/v1/rooms/discoverSearchable, filterable room directory with pagination and a message preview per room. This is the endpoint the in-app Rooms discovery page actually uses, not GET /v1/rooms.PublicGET/v1/rooms/myRooms you own or are a member of, most recently active first. Capped at 50, no pagination parameters.AuthGET/v1/rooms/:idFull room detail: settings, members, and Dyvas. Accepts a room ID or slug.PublicPATCH/v1/rooms/:idUpdate room settings. Owner only. Every field is optional; omitted fields keep their current value.AuthDELETE/v1/rooms/:idDelete a room and its messages. Owner only.AuthPOST/v1/rooms/:id/joinJoin a room as a member. Private rooms only allow the owner to join; everyone else gets a 403. Fails with a 400 once the room hits max_members.AuthPOST/v1/rooms/:id/leaveLeave a room. Always succeeds, even if you weren't a member.AuthGET/v1/rooms/:id/membersList a room's members. Plain array, no pagination.PublicGET/v1/rooms/:id/messagesMessage history in chronological order (oldest first, despite the underlying query fetching newest-first and reversing). Supports limit and a before cursor; there is no offset parameter.PublicPOST/v1/rooms/:id/messagesSend a message. Room Dyvas may reply based on the room's ai_interaction and max_ai_responses settings. Set stream: true to receive Server-Sent Events instead of the JSON body below.AuthDELETE/v1/rooms/:id/messages/:msg_idDelete a message.AuthPOST/v1/rooms/:id/dyvasAdd a Dyva to the room. Owner only.AuthGET/v1/rooms/:id/dyvasList a room's Dyvas.PublicDELETE/v1/rooms/:id/dyvas/:dyva_idRemove a Dyva from the room. Owner only.Auth/v1/social/follow/:user_idFollow a user. Returns 200 with the same body if you already follow them; 201 the first time.AuthDELETE/v1/social/follow/:user_idUnfollow a user. Always responds 200, even if the relationship didn't exist.AuthGET/v1/social/followersYour own followers, most recent first.AuthGET/v1/social/followingUsers you follow.AuthGET/v1/social/followers/:user_idAnother user's followers. No authentication required.PublicGET/v1/social/following/:user_idWho another user follows. No authentication required.PublicGET/v1/social/profile/:usernamePublic profile by username (or by user ID: the route accepts either and detects which one it received). Includes the user's public Dyvas and aggregate stats, not a follower/following list.PublicGET/v1/social/users/searchSearch users by username or display name. Plain array, capped at 20 results, no ranking guarantee.AuthPOST/v1/social/like/:dyva_idLike a Dyva. Returns 201 with the new count the first time, 200 with the same shape on repeat calls.AuthDELETE/v1/social/like/:dyva_idRemove a like.AuthGET/v1/social/likesDyvas you've liked, most recent first. Includes your private note and pin/hide state for each, plus whether you follow the creator.AuthGET/v1/social/feedPosts from people you follow (and your own posts), newest first. This reads from the content-posts system, not from Dyva likes or conversations directly.AuthGET/v1/social/trending-tagsTags used across posts from the last 7 days, ranked by frequency. Plain array, capped at 20.PublicGET/v1/social/shares/mineConversations you've generated a public share link for. Share links themselves are created and revoked through the Conversations API (POST/DELETE /v1/conversations/:id/share), not here. This endpoint only lists the ones you already made.Auth/v1/knowledge/:dyva_id/uploadUpload a document you own the Dyva for. Rejects binary content (including PDF) with a 415: plain text only. This page previously documented this path as /v1/knowledge/:dyva_id/documents; the live route is /upload, not nested under /documents.AuthGET/v1/knowledge/:dyva_idList knowledge base documents for a Dyva you own. Returns a plain array; there is no pagination on this endpoint. This page previously documented this path with a trailing /documents segment, which does not exist.AuthDELETE/v1/knowledge/:dyva_id/:doc_idDelete a document and its embeddings. Cannot be undone. This page previously nested this path under /documents/; the live route has the document id directly after the Dyva id.Auth/v1/billing/create-checkoutCreate a Stripe Checkout session for a new subscription or a plan change. Redirect to the returned URL to complete payment. The success and cancel redirects are fixed server-side; this endpoint does not accept custom redirect URLs.AuthGET/v1/billing/subscriptionCurrent subscription state: tier, status, renewal date, and (when Stripe has one on file) the payment method on the account.AuthPOST/v1/billing/cancelCancel at the end of the current billing period. Access continues until then, then the account drops to Free. Reversible with /v1/billing/reactivate before the period ends. This page previously documented this action as a DELETE on /v1/billing/subscription; no such route exists, cancellation is this POST endpoint.AuthPOST/v1/billing/portalOpen the Stripe Customer Portal to manage payment methods, view invoices, and cancel or reactivate. Fails with a 400 if the account has never made a purchase (no Stripe customer on file yet).AuthGET/v1/billing/invoicesPast invoices: real Stripe subscription invoices merged with one-time credit-pack purchases (which don't always produce a Stripe invoice), newest first. Returns a plain array, not a paginated envelope.AuthGET/v1/billing/usageUsage counters against tier limits: messages sent today, characters owned, voice minutes this month, and API calls today. A limit of 0 means unlimited for that tier. There is no knowledge-document limit in this response; the plan catalog does not cap knowledge documents per character.AuthSend a bearer token or API key in the Authorization header. Public endpoints are labeled explicitly.
Authorization: Bearer sk_live_…Examples are hand-written to explain shape. They are not captured production responses.
Content-Type: application/jsonEvery method and path is a visible heading with a stable fragment link.
#get-rooms-id