Skip to main content

GET /api/v1/partner/reviews

Returns public, non-suppressed reviews for your company in reverse chronological order. Designed for initial backfills and periodic polling. For real-time delivery, use Webhooks instead.

Authentication

x-api-key header — see Authentication.

Query parameters

ParameterTypeDefaultDescription
limitinteger50Records per page. Max 100.
cursorstringOpaque pagination cursor from pagination.next_cursor.
sinceISO 8601Only return reviews created after this timestamp.

Example request

curl "https://app.eendorsements.com/api/v1/partner/reviews?limit=50" \
  -H "x-api-key: YOUR_API_KEY"

Example response

{
  "reviews": [
    {
      "id": "3f8a2c1d-...",
      "review_number": "R-3F8A2C1D",
      "created_at": "2026-04-16T19:00:00.000Z",
      "rating": 5.0,
      "comment": "Had a great experience with Taylor! She is so knowledgeable...",
      "is_verified": true,
      "reviewer": {
        "name": "Amber Martin",
        "email": "amber@example.com"
      },
      "professional": {
        "id": "a1b2c3d4-...",
        "name": "Taylor Hernandez"
      }
    }
  ],
  "pagination": {
    "count": 50,
    "has_more": true,
    "next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0..."
  }
}

Review object

FieldTypeDescription
idUUIDUnique review identifier
review_numberstringHuman-readable ID (e.g. R-3F8A2C1D)
created_atISO 8601Submission timestamp
ratingnumberStar rating 1–5
commentstring | nullReview text
is_verifiedbooleanWhether the review was verified
reviewer.namestring | nullReviewer’s full name
reviewer.emailstring | nullReviewer’s email address
professional.idUUID | nulleEndorsements professional ID
professional.namestring | nullProfessional’s full name

Pagination

The API uses cursor-based pagination (not page numbers). This guarantees consistency even as new reviews arrive between requests.
# Page 1
curl "https://app.eendorsements.com/api/v1/partner/reviews?limit=100" \
  -H "x-api-key: YOUR_API_KEY"

# Page 2 — use next_cursor from page 1
curl "https://app.eendorsements.com/api/v1/partner/reviews?limit=100&cursor=eyJjcmVh..." \
  -H "x-api-key: YOUR_API_KEY"
When pagination.has_more is false, you’ve reached the end of the dataset.

Backfill pattern

For an initial backfill of existing reviews:
async function backfillReviews(apiKey) {
  let cursor = null;
  let total  = 0;

  do {
    const url = new URL("https://app.eendorsements.com/api/v1/partner/reviews");
    url.searchParams.set("limit", "100");
    if (cursor) url.searchParams.set("cursor", cursor);

    const res  = await fetch(url, { headers: { "x-api-key": apiKey } });
    const data = await res.json();

    await saveToYourCRM(data.reviews);
    total += data.reviews.length;

    cursor = data.pagination.next_cursor;
  } while (cursor);

  console.log(`Backfilled ${total} reviews`);
}