# Get cached feedback

Returns the saved coaching feedback for the call. Returns 404 when none has been generated.

Source: https://docs.itsconvo.com/api-reference/conversations/get-feedback

API Base URL: https://www.itsconvo.com/api/v1

## GET /api/v1/conversations/{id}/feedback

```json
{
  "openapi": "3.0.3",
  "servers": [
    {
      "url": "https://www.itsconvo.com",
      "description": "Production"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/api/v1/conversations/{id}/feedback": {
      "get": {
        "tags": [
          "Conversations"
        ],
        "summary": "Get cached feedback",
        "description": "Returns the saved coaching feedback for the call. Returns 404 when none has been generated.",
        "operationId": "getFeedback",
        "parameters": [
          {
            "$ref": "#/components/parameters/conversationId"
          }
        ],
        "responses": {
          "200": {
            "description": "Cached feedback",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FeedbackResponse"
                    }
                  }
                },
                "example": {
                  "data": {
                    "id": "session_1773842400000",
                    "feedback": {
                      "overallScore": 8.5,
                      "topPriority": {
                        "focus": "Pause before answering Bob's pushback",
                        "quote": "Yeah no, we already considered that.",
                        "reason": "The two interruptions both came when Bob raised retention risk, and both shut the topic down before he finished the thought. Holding the pause is the single change that unblocks the retention conversation next call.",
                        "alternative": "That's a fair concern, Bob. Walk me through what you're seeing."
                      },
                      "strengths": [
                        {
                          "category": "clarity",
                          "description": "Clear and structured presentation of quarterly results",
                          "timestamp": "14:01",
                          "quote": "Let's review the Q1 targets one by one."
                        }
                      ],
                      "growthAreas": [
                        {
                          "category": "listening",
                          "description": "Interrupted Bob twice during the retention discussion",
                          "suggestion": "Pause for 2-3 seconds after others finish speaking before responding.",
                          "timestamp": "14:12"
                        }
                      ],
                      "categoryScores": {
                        "clarity": 9,
                        "listening": 7.5,
                        "timeManagement": 8.5,
                        "collaboration": 8,
                        "decisionMaking": 9
                      },
                      "talkListenRatio": 45,
                      "actionPlan": [
                        "Practice active listening by pausing before responding",
                        "Summarize others' points before adding your own"
                      ]
                    },
                    "overallScore": 8.5,
                    "userSpeakerName": "local",
                    "createdAt": "2026-03-18T15:00:00.000Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "API key",
        "description": "A Convo API key: `convo_` followed by 32 hex characters. Create it in the Convo desktop app under Settings → Convo API."
      }
    },
    "parameters": {
      "conversationId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "Conversation ID from List conversations",
        "example": "session_1773842400000"
      }
    },
    "headers": {
      "X-RateLimit-Limit": {
        "schema": {
          "type": "integer"
        },
        "description": "Requests allowed per hour on your plan"
      },
      "X-RateLimit-Remaining": {
        "schema": {
          "type": "integer"
        },
        "description": "Requests left this hour"
      },
      "X-RateLimit-Reset": {
        "schema": {
          "type": "integer"
        },
        "description": "Unix time in seconds of the next full hour (UTC), when the count resets"
      }
    },
    "schemas": {
      "FeedbackResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "feedback": {
            "type": "object",
            "properties": {
              "overallScore": {
                "type": "number",
                "example": 8.5,
                "description": "0 to 10"
              },
              "topPriority": {
                "type": "object",
                "description": "Optional. The single highest-leverage focus area to act on before the next call — synthesized from across the growth areas, not necessarily a copy of growthAreas[0]. Absent when the call was too brief/routine for a clear priority, or in feedback generated before this field existed.",
                "properties": {
                  "focus": {
                    "type": "string",
                    "description": "Short imperative theme, 4-8 words ('Slow down before committing to scope')."
                  },
                  "quote": {
                    "type": "string",
                    "description": "Verbatim anchoring moment from the user's transcript."
                  },
                  "reason": {
                    "type": "string",
                    "description": "Why this is the #1 priority for next call (1-2 sentences)."
                  },
                  "alternative": {
                    "type": "string",
                    "description": "Verbatim line the user could have said instead. Rendered as a 'Try saying' callout."
                  }
                }
              },
              "strengths": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "category": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "timestamp": {
                      "type": "string"
                    },
                    "quote": {
                      "type": "string",
                      "description": "Verbatim line the user said (primary content for chat-bubble rendering)."
                    },
                    "reason": {
                      "type": "string",
                      "description": "Why this specific moment landed well (1-2 sentences)."
                    }
                  }
                }
              },
              "growthAreas": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "category": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "suggestion": {
                      "type": "string"
                    },
                    "timestamp": {
                      "type": "string"
                    },
                    "quote": {
                      "type": "string",
                      "description": "Verbatim line the user said that could be improved."
                    },
                    "reason": {
                      "type": "string",
                      "description": "Why this moment fell short (1-2 sentences)."
                    },
                    "alternative": {
                      "type": "string",
                      "description": "Verbatim better phrasing the user could have used instead. Rendered as a 'Try saying' callout."
                    }
                  }
                }
              },
              "categoryScores": {
                "type": "object",
                "properties": {
                  "clarity": {
                    "type": "number"
                  },
                  "listening": {
                    "type": "number"
                  },
                  "timeManagement": {
                    "type": "number"
                  },
                  "collaboration": {
                    "type": "number"
                  },
                  "decisionMaking": {
                    "type": "number"
                  }
                }
              },
              "talkListenRatio": {
                "type": "number",
                "description": "Talk-to-listen ratio as a percentage (0 to 100), estimated by the model",
                "example": 45
              },
              "actionPlan": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "stats": {
                "type": "object",
                "description": "Added when the feedback is generated through the API",
                "properties": {
                  "talkListenRatio": {
                    "type": "number",
                    "description": "Same as `talkListenRatio`, 50 when the model gave none"
                  },
                  "totalMinutes": {
                    "type": "integer",
                    "description": "Minutes between the first and last segment"
                  }
                }
              }
            }
          },
          "overallScore": {
            "type": "number"
          },
          "userSpeakerName": {
            "type": "string",
            "description": "The speaker Convo scored as you: `local` (your microphone), a speaker whose name matches yours, or `Unknown`"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "unauthorized",
                  "forbidden",
                  "not_found",
                  "rate_limited",
                  "ai_limit_exceeded",
                  "validation_error",
                  "internal_error"
                ]
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "responses": {
      "Unauthorized": {
        "description": "The Authorization header is missing, or the key is wrong or revoked",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "unauthorized",
                "message": "Missing or invalid Authorization header. Use: Bearer <api_key>"
              }
            }
          }
        }
      },
      "Forbidden": {
        "description": "The plan doesn't allow this request, or the key only works with the MCP server",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "forbidden",
                "message": "API access requires a Starter plan or above. Upgrade at https://www.itsconvo.com/pricing"
              }
            }
          }
        }
      },
      "NotFound": {
        "description": "Resource not found",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "not_found",
                "message": "Conversation not found"
              }
            }
          }
        }
      },
      "RateLimited": {
        "description": "Over your hourly request limit",
        "headers": {
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/X-RateLimit-Reset"
          },
          "Retry-After": {
            "schema": {
              "type": "integer"
            },
            "description": "Seconds until the next full hour, when the count resets"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "rate_limited",
                "message": "Rate limit exceeded (100 requests per hour for starter plan)"
              }
            }
          }
        }
      },
      "AILimitExceeded": {
        "description": "Your monthly, daily or spending limit for AI credits is reached. The model provider being busy returns `429 rate_limited` instead, without headers.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "ai_limit_exceeded",
                "message": "Monthly AI generation limit reached. Upgrade your plan for more."
              }
            }
          }
        }
      },
      "ValidationError": {
        "description": "A field or parameter is missing or wrong. The message names it.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "validation_error",
                "message": "title is required and must be a non-empty string"
              }
            }
          }
        }
      }
    }
  }
}
```