> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ethioreview.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Review widget SDK

> NPM packages for embedding EthioReview testimonials.

Install packages from npm — see [Widget packages](/sdks/review-widget/packages) for the full list.

## Packages

| Package                                   | Description                    |
| ----------------------------------------- | ------------------------------ |
| `@ethioreview/review-widget-core-client`  | HTTP client, types, telemetry  |
| `@ethioreview/review-widget-core`         | Re-exports + `WidgetApiClient` |
| `@ethioreview/review-widget-web-vanilla`  | Web Component + script loader  |
| `@ethioreview/review-widget-web-iframe`   | iframe helpers                 |
| `@ethioreview/review-widget-react`        | React components               |
| `@ethioreview/review-widget-next`         | Next.js SSR + JSON-LD          |
| `@ethioreview/review-widget-react-native` | WebView URL helper             |

## Core client

```typescript theme={null}
import { CoreClient } from "@ethioreview/review-widget-core-client";

const client = new CoreClient({
  baseUrl: "https://api.ethioreview.com",
  publicKey: "pk_live_...",
});

const data = await client.fetchReviews("org_abc", { limit: 5, minStars: 4 });
// data.reviews[].reviewUrl → EthioReview deep link
```

## Next.js

```typescript theme={null}
import { getWidgetReviewsServerData, buildAggregateRatingJsonLd } from "@ethioreview/review-widget-next";

export async function getStaticProps() {
  const reviews = await getWidgetReviewsServerData({
    baseUrl: process.env.ETHIOREVIEW_API_URL!,
    publicKey: process.env.ETHIOREVIEW_PUBLIC_KEY!,
    businessId: process.env.ETHIOREVIEW_ORG_ID!,
  });
  return { props: { reviews } };
}
```

## Versioning

Independent semver per package. Pin versions in your `package.json` for reproducible builds.

[Package list →](/sdks/review-widget/packages)
