Errors
One shape for every failure, and the codes to branch on.
The shape
Every failure has this shape. Branch on code, which is stable; the error text may be reworded at any time and is written to be shown to a vet.
errorstringrequired
Human-readable explanation, safe to display.
Codes
unsupported_languageunsupported_note_formatinvalid_requestmissing_idempotency_keyidempotency_key_reusedinvalid_clientinvalid_codeinvalid_tokenconnection_revokedpartner_disabledsubscription_inactiveaudio_too_largeaudio_unreadablenote_not_foundrate_limitedinternal_erroraudio_unavailabletranscription_failednote_generation_failed
Stable identifier for a failure. New codes may be added within /v1, so treat one you do not recognise as a generic failure rather than failing hard.
internal_error is ours, not yours: something on our side failed before we could judge your request. Retry the same call shortly; nothing has been consumed.
The last three are the ways a consult can fail after it was accepted, and what you should do differs for each:
audio_unavailable: the recording could not be read back for processing. Ours to fix, not yours.
transcription_failed: speech recognition failed after internal retries. Retrying will not help, because it has already been retried. Have the vet check the microphone and input device before the next consult.
note_generation_failed: the transcript survived and is on the note. Show it to the vet so they can write the record themselves. Transport failures are already retried inside the model client, so one that reaches you has survived those and will not clear on its own.
Shared responses
Server Error
Something failed on our side before your request could be judged. Retry shortly: nothing was consumed, and no note was created.
json
{
"error": "Could not verify that connection. Try again shortly.",
"code": "internal_error"
}Bad Request
The request was rejected. Do not retry unchanged.
invalid_request
json
{
"error": "client_id, client_secret and code are required",
"code": "invalid_request"
}unsupported_language
json
{
"error": "Only English notes are available on this API.",
"code": "unsupported_language"
}missing_idempotency_key
json
{
"error": "An Idempotency-Key header is required.",
"code": "missing_idempotency_key"
}Unauthorized
The token is missing, malformed, or no longer valid. connection_revoked means the vet disconnected or left the practice, so clear the stored token and send them through the connect flow again.
partner_disabled is different and reconnecting will not fix it: your integration itself is switched off, and every token you hold stops at once. Stop retrying and contact us.
invalid_token
json
{
"error": "That connection token is not valid.",
"code": "invalid_token"
}connection_revoked
json
{
"error": "That vet is no longer connected to WisePaws.",
"code": "connection_revoked"
}partner_disabled
json
{
"error": "This integration is no longer enabled. Contact WisePaws.",
"code": "partner_disabled"
}Note Not Found
No note with that id belongs to this connection.
json
{
"error": "No note was found with that id.",
"code": "note_not_found"
}Rate Limited
On the note endpoints the ceiling is per connection, and submitting a recording is held far tighter than polling, which the contract asks you to do every 3 seconds. On /v1/connections/exchange, which has no connection yet, it is per source address. A platform-wide backstop sits above both; it is sized so that normal traffic never reaches it. Back off and respect Retry-After.
json
{
"error": "Too many requests. Retry shortly.",
"code": "rate_limited"
}