POST/api/v1/opinions

Submit an opinion

Create or update a sentiment opinion for an AI model. Requires a Bearer API key.

Example

curl -X POST 'https://vibetracker.app/api/v1/opinions' \
  -H 'Authorization: Bearer $VIBETRACKER_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4o",
    "score": -1,
    "updateOptionalContext": true,
    "useCase": "coding",
    "interface": "api",
    "toolId": "openai-api",
    "comment": "Regression in tool calls after the latest deploy."
  }'

Headers

FieldTypeRequiredDescription
AuthorizationstringYesBearer token: Bearer YOUR_API_KEY
Content-TypestringYesMust be application/json

Request body

Only model and score are always required. Context fields are optional unless you are sending tool information.

FieldTypeRequiredDescription
modelstringYesModel slug. You can send gpt-4o or the canonical full slug openai/gpt-4o.
fullSlugstringNoBackward-compatible alias for model. Prefer model on new clients.
score-1 | 0 | 1YesNegative, neutral, or positive sentiment
updateOptionalContextbooleanNoWhen updating an active opinion, whether to overwrite optional context fields
useCaseenumNoOne of the supported use-case values listed below
interfacestringConditionalRequired when sending tool context. Must be a valid platform option.
toolIdstringConditionalMust be valid for the selected interface. Use "other" with toolNameOther.
toolNameOtherstringConditionalOnly when toolId is "other". Max 80 chars, no links.
commentstringNoFree-text comment. Max 280 chars, no links.

Supported useCase values

codingwritingresearchbrainstormingcustomer-supportimage-generationdata-analysisschool-studying

Response body

Returns the stored opinion state in a compact external-facing shape.

FieldTypeRequiredDescription
opinionIdstringAlwaysStable ID for the created or updated opinion
createdNewOpinionbooleanAlwaystrue if a new opinion was created, false if an active one was updated
modelobjectAlwaysCanonical model info: displayName and fullSlug
score-1 | 0 | 1AlwaysThe stored sentiment score after the write
useCasestring | nullAlwaysResolved use-case on the opinion
interfacestring | nullAlwaysResolved interface on the opinion
toolIdstring | nullAlwaysResolved tool identifier
toolNameOtherstring | nullAlwaysCustom tool name when toolId is "other"
commentstring | nullAlwaysStored comment after normalization
moderationStatus"visible" | "pending" | "suppressed"AlwaysModeration state for the opinion
submittedAtnumberAlwaysUnix timestamp (ms) when the opinion was submitted
cooldownEndsAtnumberAlwaysUnix timestamp (ms) when the 30-minute active window ends

Errors

FieldTypeRequiredDescription
401{ "error": string }Auth failureInvalid, revoked, or expired API key
400{ "error": string }Validation failureRequest body validation issues or other submission errors

Behavior

  • If the same user submits again while a prior opinion is still active (within 30 minutes), the existing opinion is updated instead of creating a new one.
  • model accepts either a short slug like gpt-5.4 or a canonical provider/model slug. If a short slug is ambiguous, send the canonical full slug.
  • comment and toolNameOther reject links and are trimmed before storage.
  • updateOptionalContext controls whether optional fields overwrite the context on an existing active opinion.

Rate limiting

Opinions have a 30-minute active window. API-key submissions are also limited by trusted client network.

New to the API? Start with the quickstart.