Eindev APIui.eindev.ir ↗
Search and retrieve liquid glass UI components from the EinUI registry. Get metadata, npm dependencies, and full source code via 2 endpoints.
What is the Eindev API?
The EinUI Registry API exposes 2 endpoints for discovering and fetching liquid glass UI components from the EinUI component registry. Use search_components to filter components by text query or category, returning fields like name, title, description, dependencies, and file paths. Use get_component to pull the complete source code, type, and dependency list for any specific component by name.
curl -X GET 'https://api.parse.bot/scraper/768785e1-c914-4526-8800-26d8721f92dc/search_components' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace ui-eindev-ir-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
EinUI Liquid Glass Components API Client
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Any
class ParseClient:
"""Client for interacting with the EinUI Liquid Glass Components API."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "768785e1-c914-4526-8800-26d8721f92dc"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key not provided and PARSE_API_KEY environment variable not set")
def _call(self, endpoint: str, method: str = "POST", **params) -> dict[str, Any]:
"""
Internal method to call the Parse API.
Args:
endpoint: API endpoint name
method: HTTP method (GET or POST)
**params: Query or body parameters
Returns:
JSON response from the API
Raises:
requests.RequestException: If the API request fails
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
elif method.upper() == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def search_components(
self, query: Optional[str] = None, category: Optional[str] = None
) -> dict[str, Any]:
"""
Search and list liquid glass components from the EinUI registry.
Args:
query: Optional search text to filter components by name, title, or description
category: Optional category filter to match against component name
Returns:
Dictionary containing total count and list of component objects
"""
params = {}
if query:
params["query"] = query
if category:
params["category"] = category
return self._call("search_components", method="GET", **params)
def get_component(self, name: str) -> dict[str, Any]:
"""
Get full details of a specific component including source code and metadata.
Args:
name: Component name from the registry (e.g., 'glass-card', 'glass-button')
Returns:
Dictionary containing component details, dependencies, and full source code
"""
return self._call("get_component", method="GET", name=name)
def main():
"""Practical workflow example: Search for glass components and retrieve their full source code."""
# Initialize the client
client = ParseClient()
print("=" * 70)
print("EinUI Liquid Glass Components - Practical Usage Example")
print("=" * 70)
# Step 1: Search for all glass components
print("\n[Step 1] Searching for glass components...")
search_results = client.search_components(category="glass")
total = search_results.get("total", 0)
components = search_results.get("components", [])
print(f"Found {total} glass components:")
print("-" * 70)
for idx, component in enumerate(components[:5], 1): # Show first 5
print(f"{idx}. {component['title']} (name: {component['name']})")
print(f" Description: {component['description']}")
print(f" Dependencies: {', '.join(component['dependencies']) if component['dependencies'] else 'None'}")
print()
# Step 2: If components found, get detailed source code for the first component
if components:
first_component = components[0]
component_name = first_component["name"]
print("\n[Step 2] Retrieving full details and source code...")
print(f"Getting detailed information for '{component_name}'...")
print("-" * 70)
try:
component_details = client.get_component(component_name)
print(f"\nComponent: {component_details['title']}")
print(f"Type: {component_details['type']}")
print(f"Description: {component_details['description']}")
if component_details.get("dependencies"):
print(f"Dependencies: {', '.join(component_details['dependencies'])}")
# Display source code information
print(f"\nSource Files:")
for file_obj in component_details.get("files", []):
path = file_obj.get("path", "unknown")
content_length = len(file_obj.get("content", ""))
print(f" - {path}")
print(f" Size: {content_length} characters")
# Show first 200 chars of content as preview
if content_length > 0:
preview = file_obj.get("content", "")[:200]
print(f" Preview: {preview}...")
except requests.RequestException as e:
print(f"Error retrieving component details: {e}")
# Step 3: Search by query to find components with specific functionality
print("\n[Step 3] Searching for components with 'select' functionality...")
print("-" * 70)
select_results = client.search_components(query="select")
select_components = select_results.get("components", [])
if select_components:
for component in select_components[:3]:
print(f"- {component['title']} ({component['name']})")
print(f" {component['description']}\n")
else:
print("No components found with 'select' in their metadata.")
print("\n" + "=" * 70)
print("Workflow completed successfully!")
print("=" * 70)
if __name__ == "__main__":
main()Search and list liquid glass components from the EinUI registry. Returns component metadata including name, title, description, dependencies, and file paths. Supports filtering by text query (matched against name, title, and description) and by category (matched against component name).
| Param | Type | Description |
|---|---|---|
| query | string | Search text to filter components. Matched case-insensitively against component name, title, and description. Omitting returns all components. |
| category | string | Category filter matched against component name (e.g. 'glass', 'widget', 'block'). Omitting returns all categories. |
{
"type": "object",
"fields": {
"total": "integer",
"components": "array of component objects with name, title, type, description, dependencies, and files"
},
"sample": {
"total": 17,
"components": [
{
"name": "glass-select",
"type": "registry:component",
"files": [
"registry/liquid-glass/glass-select.tsx"
],
"title": "Glass Select",
"description": "A liquid glass styled select dropdown with frosted glass styling.",
"dependencies": [
"@radix-ui/react-select",
"lucide-react"
]
}
]
}
}About the Eindev API
Searching the EinUI Registry
The search_components endpoint returns an array of component objects along with a total count. Each object includes name, title, type, description, dependencies (npm packages the component requires), and files (paths to the component's source files). The query parameter filters results case-insensitively against name, title, and description. The category parameter narrows results by matching against name, which works for category prefixes like glass, widget, or block. Omitting both parameters returns the full registry.
Fetching Full Component Details
The get_component endpoint accepts a name string — discoverable from search_components results — and returns the complete component record. The files array in the response includes objects with path, type, and content, where content is the full source code of each file. The dependencies array lists the npm package names required to use the component. Fields title and description provide human-readable context alongside the raw code.
Practical Notes
Component names follow a consistent hyphenated pattern (e.g. glass-card, glass-button, glass-avatar), making it straightforward to construct get_component calls directly once you know naming conventions. The files array can contain multiple file objects per component, covering cases where a component is split across more than one source file.
The Eindev API is a managed, monitored endpoint for ui.eindev.ir — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ui.eindev.ir changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official ui.eindev.ir API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Auto-generating a component picker UI by listing all EinUI registry entries with their titles and descriptions.
- Pulling the full source code and npm dependencies for a
glass-cardcomponent to embed in a design system scaffold. - Filtering registry components by category (e.g.
widget) to build a curated showcase of widget-type elements. - Extracting the
dependenciesfield across all components to produce a consolidated npm install command. - Building a documentation site that renders component metadata and live code previews from registry data.
- Syncing a local component library with the EinUI registry by diffing fetched component
filesagainst local versions.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does EinUI have an official developer API for its component registry?+
What does `get_component` return beyond what `search_components` already includes?+
search_components returns metadata fields — name, title, type, description, dependencies, and file paths. get_component adds the actual source code: each file object in the files array includes a content field with the full component source, which is not present in search results.Does the API expose version history or changelogs for components?+
Can I filter components by their npm dependency list?+
dependencies field is returned per component but cannot be used as a filter parameter. You can fork it on Parse and revise to add dependency-based filtering as an endpoint parameter.How should I discover valid component names before calling `get_component`?+
search_components with no parameters to retrieve the full registry. Each object in the components array includes a name field (e.g. glass-button, glass-avatar) that can be passed directly to get_component as the required name input.