Skip to content

assistant.messages.create

Ask the assistant

POST/assistant/messages

Operation
assistant.messages.create
MCP tool
not exposed over MCP

Ask a question about GogoScreen and get an answer, in the same call. Without conversationId a new conversation is started; with one, the question continues that thread. The answer is plain text written from a knowledge base built out of this product's own limits; the assistant has no tools, cannot see anything about any other customer, and cannot change, refund or decide anything about an account — when a question needs a person it says so and sets handoffSuggested. remainingToday is how many more questions this account may ask before the daily cap; null when the cap is off.

curl -X POST "https://api.gogoscreen.com/api/v1/assistant/messages" \
  -H "Authorization: Bearer $GOGOSCREEN_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "message": "<message>" }'
The shape of a request to this operation. The dashboard sends it with the signed in person's session; an API key is refused.

At a glance

FactDetail
Scopesassistant:use
Credentialsa signed in dashboard session. An API key cannot be granted these scopes, so this operation is reachable only from a signed in dashboard session.
Rate limit20 requests a minute per credential, in the expensive class.
IdempotencyRequired. Send an Idempotency-Key header; a retry with the same key and the same body returns the stored answer with Idempotent-Replayed: true. The key is also written to the record this creates, so a retry cannot leave two behind. How idempotency works.
MCP toolNot exposed over MCP.
Always setsCache-Control: private, no-store
Verified emailRequired. An account whose email address is not verified meets 403 email_unverified before the operation runs.

Request body

A JSON body is required. Unknown fields are refused rather than ignored, so a typo is a 400 validation_failed rather than a setting that silently did nothing.

NameTypeRequiredDescription
messagestringRequiredThe question, as the customer typed it. Treated as text throughout: it is never part of the assistant's instructions, and credentials or card numbers in it are removed before it is stored.1–2000 characters
conversationIdstringOptionalContinue this conversation. Omit to start a new one. A conversation of another account is a 404.format: uuid

Response

Answers 201. Every answer also carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, and every error body carries a requestId.

201 Created

Ask the assistant

201 Created body
NameTypeDescription
conversationobject
createdAtstringformat: date-time
idstringThe conversation's id. Pass it as conversationId to keep asking in the same thread.
lastMessageAtstring | nullWhen the thread was last written to. Null on a conversation with no messages yet.format: date-time
messageCountintegerHow many questions the customer has asked in this thread. The per-conversation cap counts this, not the replies.-9007199254740991–9007199254740991
statusstringopen takes another question. closed and handed_off both refuse one with 409 conversation_closed; start a new conversation.one of: open, closed, handed_off
remainingTodayinteger | null-9007199254740991–9007199254740991
replyobject
contentstringPlain text. The assistant writes no HTML, no markdown headings and no links off this product.
createdAtstringformat: date-time
handoffSuggestedbooleanThe assistant believes a person should take this. Offer the hand-off; it is never taken automatically.
idstring
rolestringone of: user, assistant
topicstring | nullThe assistant's own label for what the question was about — one of product, billing, account, api, troubleshooting, escalation, off_topic. Null on a customer's turn.
201 Created headers
HeaderMeaning
Cache-ControlAlways private, no-store.
Idempotent-ReplayedPresent only when this answer was stored by an earlier call with the same Idempotency-Key. Nothing new was done.

Errors

Every refusal is { error: { code, message, details?, requestId } }. Branch on code, never on the sentence. The full catalogue is at Errors.

CodeStatusWhen it happensWhat to do
idempotency_key_required400A mutating operation arrived over HTTP with no Idempotency-Key header. It is refused before the body is parsed, so a caller missing both learns about both at once.Add an Idempotency-Key header of up to 128 characters, unique to this request. Over MCP the same value goes in the idempotencyKey tool argument.
validation_failed400The merged path, query and body did not match the operation's schema. The schemas are strict, so an unknown field is a failure rather than something ignored, and a string carrying half of a character is refused before it can be stored.Read details.issues. Each entry carries a path, a message and a machine readable code. Fix every named field and send the request again; the same body always fails the same way.
unauthorized401No credential was presented, or the key is unknown, revoked or expired, or an X-API-Key header carried something that is not an API key. details.reason says which.Send Authorization: Bearer gsk_live_…. A revoked or expired key never starts working again, so issue a new one in the developer console. Put a dashboard session token in Authorization, never in X-API-Key.
feature_disabled403The operation sits behind a feature flag this deployment has switched off.Nothing a caller can change. Stop calling the operation, or ask the operator to enable it.
forbidden_scope403The credential does not carry every scope the operation declares, or it is the wrong kind of credential for it. keys.* and assistant.* are user only and can never be called by a key.details.requiredScopes and details.missingScopes name what is missing. A key's scopes cannot be changed after it is issued, so create a new key with them. When details.allowedActors is present, no key can call this operation at all.
conversation_not_found404No conversation with that id belongs to this account. Another account's conversation answers the same 404, so this does not say whether the id exists.Check the id. Read the current conversation to find the one to resume.
not_found404No resource of that id belongs to this account. A resource that belongs to somebody else answers 404 as well, never 403.Check the id. Do not treat this as a permissions problem.
assistant_conversation_full409This conversation with the support assistant has reached the most messages one conversation may hold.Start a new conversation. details.limit says how many messages a conversation holds.
conflict409The request conflicts with the state the resource is in, and no more specific code applies.Re-read the resource and decide from its current state. Retrying the same request unchanged will not help.
conversation_closed409A question was sent to a conversation that is closed or has been handed off to a person.Start a new conversation. The closed one can still be read.
idempotency_conflict409That idempotency key has already been used on this operation with a different request body.Use a fresh key for a different request. A key stands for one intent, not for one attempt.
idempotency_in_progress409The first request under that key is still being worked. Two concurrent identical requests both reach the store and one of them is told this.Wait the Retry-After seconds, which is 2, and send exactly the same request again with the same key. Do not change the body and do not mint a new key.
payload_too_large413The request body is over the transport's limit: 256 kb over HTTP, 1 mb over MCP.Send less. details.limit carries the limit. Version 1 has no upload operations, so a body this size is usually a mistake.
unsupported_media_type415The request carried a body whose Content-Type is not application/json, whose charset is not utf-8, or whose Content-Encoding this API does not decode. A body nobody can read would otherwise be silently discarded.Send Content-Type: application/json and utf-8 bytes. details names the charset, encoding or content type that was objected to.
ai_rate_limited429The support assistant was asked too many questions by this account in the last hour. Only the dashboard assistant answers it; a key cannot reach the assistant.Wait and ask again later, or send the question to a person with the hand off instead. Nothing was charged.
assistant_daily_limit429This account has asked the support assistant as many questions as it may today.Wait for details.resetAt, or send the question to a person with the hand off, which this limit does not cover.
rate_limited429The credential's per minute budget, the account's per minute ceiling, or a daily cap was exceeded. details.scope is minute, day or account, or global when the product's own daily cap on voice previews is spent.Wait the Retry-After seconds and retry. details.limit and details.resetAt say what was hit and when it reopens. The RateLimit-* headers on every answer let a client pace itself before it gets here.
internal_error500An unhandled failure inside this API. The original message is logged and never answered.Retry once, then quote requestId to support. A 5xx deletes the idempotency claim rather than storing it, so retrying under the same key is safe.
assistant_unavailable503The support assistant could not answer: every model provider failed, or a limit that has to be checked could not be.Try again shortly, or send the question to a person with the hand off, which needs no model.