docs/reference/feature-servers/registry-server.md
The Registry server supports both gRPC and REST interfaces for interacting with feature metadata. While gRPC remains the default protocol—enabling clients in any language with gRPC support—the REST API allows users to interact with the registry over standard HTTP using any REST-capable tool or language.
Feast supports running the Registry Server in three distinct modes:
| Mode | Command Example | Description |
|---|---|---|
| gRPC only | feast serve_registry | Default behavior for SDK and clients |
| REST + gRPC | feast serve_registry --rest-api | Enables both interfaces |
| REST only | feast serve_registry --rest-api --no-grpc | Used for REST-only clients like the UI |
The REST API provides HTTP/JSON endpoints for accessing all registry metadata. All endpoints are prefixed with /api/v1 and return JSON responses.
Global /all Endpoints
/all (e.g., /entities/all) aggregate results across all projects.project field.project parameter is required for /all endpoints.The REST API supports Bearer token authentication. Include your token in the Authorization header:
Authorization: Bearer <your-token>
Most endpoints support these common query parameters:
project (required for most endpoints): The project nameallow_cache (optional, default: true): Whether to allow cached datatags (optional): Filter results by tags in key=value formatinclude_relationships (optional, default: false): Include all relationships (both direct and indirect) for the object(s) in the responsepage (optional): Page number (starts from 1)limit (optional, max: 100): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order: "asc" or "desc" (default: "asc")GET /api/v1/entitiesproject (required): Project nameinclude_relationships (optional): Include relationships for each entityallow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")# Basic list
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/entities?project=my_project"
# With pagination
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/entities?project=my_project&page=1&limit=10&sort_by=name"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/entities?project=my_project&include_relationships=true"
GET /api/v1/entities/{name}name (path): Entity nameproject (required): Project nameinclude_relationships (optional): Include relationships for this entityallow_cache (optional): Whether to allow cached data# Basic get
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/entities/user_id?project=my_project"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/entities/user_id?project=my_project&include_relationships=true"
GET /api/v1/entities/allproject field.allow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")include_relationships (optional): Include relationships for each entity# List all entities across all projects
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/entities/all?page=1&limit=10&sort_by=name"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/entities/all?include_relationships=true"
{
"entities": [
{ "name": "customer_id", "project": "project1", ... },
{ "name": "driver_id", "project": "project2", ... }
],
"pagination": { "page": 1, "limit": 10, "total": 25, "totalPages": 3 },
"relationships": { ... }
}
GET /api/v1/data_sourcesproject (required): Project nameinclude_relationships (optional): Include relationships for each data sourceallow_cache (optional): Whether to allow cached datatags (optional): Filter by tagspage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")# Basic list
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/data_sources?project=my_project"
# With pagination and relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/data_sources?project=my_project&include_relationships=true&page=1&limit=10"
GET /api/v1/data_sources/{name}name (path): Data source nameproject (required): Project nameinclude_relationships (optional): Include relationships for this data sourceallow_cache (optional): Whether to allow cached data# Basic get
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/data_sources/user_data?project=my_project"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/data_sources/user_data?project=my_project&include_relationships=true"
GET /api/v1/data_sources/allproject field.allow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")include_relationships (optional): Include relationships for each data sourcecurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/data_sources/all?page=1&limit=10&sort_by=name"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/data_sources/all?include_relationships=true"
{
"dataSources": [
{ "name": "user_data", "project": "project1", ... },
{ "name": "item_data", "project": "project2", ... }
],
"pagination": { "page": 1, "limit": 10, "total": 25, "totalPages": 3 },
"relationships": { ... }
}
GET /api/v1/feature_viewsproject (required): Project nameinclude_relationships (optional): Include relationships for each feature viewallow_cache (optional): Whether to allow cached datatags (optional): Filter by tagsentity (optional): Filter feature views by entity namefeature (optional): Filter feature views by feature namefeature_service (optional): Filter feature views by feature service namedata_source (optional): Filter feature views by data source namepage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")# Basic list
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views?project=my_project"
# With pagination and relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views?project=my_project&include_relationships=true&page=1&limit=5&sort_by=name"
# Filter by entity
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views?project=my_project&entity=user"
# Filter by feature
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views?project=my_project&feature=age"
# Filter by data source
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views?project=my_project&data_source=user_profile_source"
# Filter by feature service
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views?project=my_project&feature_service=user_service"
# Multiple filters combined
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views?project=my_project&entity=user&feature=age"
GET /api/v1/feature_views/{name}name (path): Feature view nameproject (required): Project nameinclude_relationships (optional): Include relationships for this feature viewallow_cache (optional): Whether to allow cached data# Basic get
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views/user_features?project=my_project"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views/user_features?project=my_project&include_relationships=true"
GET /api/v1/feature_views/allproject field.allow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")include_relationships (optional): Include relationships for each feature viewcurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views/all?page=1&limit=10&sort_by=name"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_views/all?include_relationships=true"
{
"featureViews": [
{ "name": "user_features", "project": "project1", ... },
{ "name": "item_features", "project": "project2", ... }
],
"pagination": { "page": 1, "limit": 10, "total": 25, "totalPages": 3 },
"relationships": { ... }
}
GET /api/v1/featuresproject (required): Project namefeature_view (optional): Filter by feature view namename (optional): Filter by feature nameinclude_relationships (optional): Include relationships for each feature (relationships are keyed by feature name)allow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")# Basic list
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/features?project=my_project"
# With pagination and relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/features?project=my_project&include_relationships=true&page=1&limit=5"
{
"features": [
{ "name": "conv_rate", "featureView": "driver_hourly_stats_fresh", "type": "Float32" },
{ "name": "acc_rate", "featureView": "driver_hourly_stats_fresh", "type": "Float32" },
{ "name": "avg_daily_trips", "featureView": "driver_hourly_stats_fresh", "type": "Int64" },
{ "name": "conv_rate", "featureView": "driver_hourly_stats", "type": "Float32" },
{ "name": "acc_rate", "featureView": "driver_hourly_stats", "type": "Float32" }
],
"pagination": {
"page": 1,
"limit": 5,
"totalCount": 10,
"totalPages": 2,
"hasNext": true
},
"relationships": {
"conv_rate": [
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureView", "name": "driver_hourly_stats_fresh" } },
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureView", "name": "driver_hourly_stats" } },
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureService", "name": "driver_activity_v1" } }
]
}
}
GET /api/v1/features/{feature_view}/{name}feature_view (path): Feature view namename (path): Feature nameproject (required): Project nameinclude_relationships (optional): Include relationships for this featureallow_cache (optional): Whether to allow cached data# Basic get
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/features/driver_hourly_stats/conv_rate?project=my_project"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/features/driver_hourly_stats/conv_rate?project=my_project&include_relationships=true"
{
"name": "conv_rate",
"featureView": "driver_hourly_stats",
"type": "Float32",
"relationships": [
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureView", "name": "driver_hourly_stats_fresh" } },
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureView", "name": "driver_hourly_stats" } },
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureService", "name": "driver_activity_v1" } }
]
}
GET /api/v1/features/allproject field.page (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")include_relationships (optional): Include relationships for each featureallow_cache (optional): Whether to allow cached datacurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/features/all?page=1&limit=5&sort_by=name"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/features/all?include_relationships=true"
{
"features": [
{ "name": "conv_rate", "featureView": "driver_hourly_stats_fresh", "type": "Float32", "project": "multiproject" },
{ "name": "acc_rate", "featureView": "driver_hourly_stats_fresh", "type": "Float32", "project": "multiproject" },
{ "name": "avg_daily_trips", "featureView": "driver_hourly_stats_fresh", "type": "Int64", "project": "multiproject" },
{ "name": "conv_rate", "featureView": "driver_hourly_stats", "type": "Float32", "project": "multiproject" },
{ "name": "acc_rate", "featureView": "driver_hourly_stats", "type": "Float32", "project": "multiproject" }
],
"pagination": {
"page": 1,
"limit": 5,
"total_count": 20,
"total_pages": 4,
"has_next": true,
"has_previous": false
},
"relationships": {
"conv_rate": [
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureView", "name": "driver_hourly_stats" } },
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureView", "name": "driver_hourly_stats_fresh" } },
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureService", "name": "driver_activity_v3" } }
]
}
}
GET /api/v1/feature_servicesproject (required): Project nameinclude_relationships (optional): Include relationships for each feature serviceallow_cache (optional): Whether to allow cached datatags (optional): Filter by tagsfeature_view (optional): Filter feature services by feature view namepage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")# Basic list
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_services?project=my_project"
# With pagination and relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_services?project=my_project&include_relationships=true&page=1&limit=10"
# Filter by feature view
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_services?project=my_project&feature_view=user_profile"
GET /api/v1/feature_services/{name}name (path): Feature service nameproject (required): Project nameinclude_relationships (optional): Include relationships for this feature serviceallow_cache (optional): Whether to allow cached data# Basic get
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_services/recommendation_service?project=my_project"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_services/recommendation_service?project=my_project&include_relationships=true"
GET /api/v1/feature_services/allproject field.allow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")include_relationships (optional): Include relationships for each feature servicecurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_services/all?page=1&limit=10&sort_by=name"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/feature_services/all?include_relationships=true"
{
"featureServices": [
{ "name": "recommendation_service", "project": "project1", ... },
{ "name": "scoring_service", "project": "project2", ... }
],
"pagination": { "page": 1, "limit": 10, "total": 25, "totalPages": 3 },
"relationships": { ... }
}
GET /api/v1/lineage/registryproject (required): Project nameallow_cache (optional): Whether to allow cached datafilter_object_type (optional): Filter by object type (dataSource, entity, featureView, featureService, feature)filter_object_name (optional): Filter by object namecurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/lineage/registry?project=my_project"
GET /api/v1/lineage/objects/{object_type}/{object_name}object_type (path): Type of object (dataSource, entity, featureView, featureService, feature)object_name (path): Name of the objectproject (required): Project nameinclude_indirect (optional): Whether to include indirect relationshipsallow_cache (optional): Whether to allow cached datacurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/lineage/objects/feature/conv_rate?project=my_project&include_indirect=true"
{
"relationships": [
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureView", "name": "driver_hourly_stats_fresh" } },
{ "source": { "type": "feature", "name": "conv_rate" }, "target": { "type": "featureView", "name": "driver_hourly_stats" } }
],
"pagination": { "totalCount": 2, "totalPages": 1 }
}
GET /api/v1/lineage/completeproject (required): Project nameallow_cache (optional): Whether to allow cached datacurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/lineage/complete?project=my_project"
{
"project": "multiproject",
"objects": {
"entities": [ ... ],
"dataSources": [ ... ],
"featureViews": [ ... ],
"featureServices": [ ... ],
"features": [
{ "name": "conv_rate", "featureView": "driver_hourly_stats_fresh", "type": "Float32" },
{ "name": "acc_rate", "featureView": "driver_hourly_stats_fresh", "type": "Float32" },
{ "name": "avg_daily_trips", "featureView": "driver_hourly_stats_fresh", "type": "Int64" },
{ "name": "conv_rate", "featureView": "driver_hourly_stats", "type": "Float32" },
{ "name": "acc_rate", "featureView": "driver_hourly_stats", "type": "Float32" },
{ "name": "conv_rate_plus_val1", "featureView": "transformed_conv_rate_fresh", "type": "Float64" },
{ "name": "conv_rate_plus_val2", "featureView": "transformed_conv_rate_fresh", "type": "Float64" },
{ "name": "conv_rate_plus_val1", "featureView": "transformed_conv_rate", "type": "Float64" },
{ "name": "conv_rate_plus_val2", "featureView": "transformed_conv_rate", "type": "Float64" }
]
},
"relationships": [ ... ],
"indirectRelationships": [ ... ],
"pagination": {
"features": { "totalCount": 10, "totalPages": 1 },
...
}
}
GET /api/v1/lineage/registry/allallow_cache (optional): Whether to allow cached datafilter_object_type (optional): Filter by object type (dataSource, entity, featureView, featureService)filter_object_name (optional): Filter by object namecurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/lineage/registry/all"
{
"relationships": [ { ... , "project": "project1" }, ... ],
"indirect_relationships": [ { ... , "project": "project2" }, ... ]
}
GET /api/v1/lineage/complete/allallow_cache (optional): Whether to allow cached datacurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/lineage/complete/all"
{
"projects": [
{
"project": "project1",
"objects": {
"entities": [ ... ],
"dataSources": [ ... ],
"featureViews": [ ... ],
"featureServices": [ ... ]
},
"relationships": [ ... ],
"indirectRelationships": [ ... ]
},
{ "project": "project2", ... }
]
}
GET /api/v1/permissionsproject (required): Project nameinclude_relationships (optional): Include relationships for each permissionallow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")# Basic list
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/permissions?project=my_project"
# With pagination and relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/permissions?project=my_project&include_relationships=true&page=1&limit=10"
GET /api/v1/permissions/{name}name (path): Permission nameproject (required): Project nameinclude_relationships (optional): Include relationships for this permissionallow_cache (optional): Whether to allow cached data# Basic get
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/permissions/read_features?project=my_project"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/permissions/read_features?project=my_project&include_relationships=true"
GET /api/v1/projectsallow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")# Basic list
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/projects"
# With pagination
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/projects?page=1&limit=10&sort_by=name"
GET /api/v1/projects/{name}name (path): Project nameallow_cache (optional): Whether to allow cached datacurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/projects/my_project"
GET /api/v1/saved_datasetsproject (required): Project nameinclude_relationships (optional): Include relationships for each saved datasetallow_cache (optional): Whether to allow cached datatags (optional): Filter by tagspage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")# Basic list
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/saved_datasets?project=my_project"
# With pagination and relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/saved_datasets?project=my_project&include_relationships=true&page=1&limit=10"
GET /api/v1/saved_datasets/{name}name (path): Saved dataset nameproject (required): Project nameinclude_relationships (optional): Include relationships for this saved datasetallow_cache (optional): Whether to allow cached data# Basic get
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/saved_datasets/training_data?project=my_project"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/saved_datasets/training_data?project=my_project&include_relationships=true"
GET /api/v1/saved_datasets/allproject field.allow_cache (optional): Whether to allow cached datapage (optional): Page number for paginationlimit (optional): Number of items per pagesort_by (optional): Field to sort bysort_order (optional): Sort order ("asc" or "desc")include_relationships (optional): Include relationships for each saved datasetcurl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/saved_datasets/all?page=1&limit=10&sort_by=name"
# With relationships
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/saved_datasets/all?include_relationships=true"
{
"savedDatasets": [
{ "name": "training_data", "project": "project1", ... },
{ "name": "validation_data", "project": "project2", ... }
],
"pagination": { "page": 1, "limit": 10, "total": 25, "totalPages": 3 },
"relationships": { ... }
}
All endpoints return JSON responses with the following general structure:
The REST API provides consistent error responses with HTTP status codes included in the JSON response body. All error responses follow this format:
{
"status_code": 404,
"detail": "Entity 'user_id' does not exist in project 'demo_project'",
"error_type": "FeastObjectNotFoundException"
}
status_code: The HTTP status code (e.g., 404, 422, 500)detail: Human-readable error message describing the issueerror_type: The specific type of error that occurred| HTTP Status | Error Type | Description | Common Causes |
|---|---|---|---|
| 400 | HTTPException | Bad Request | Invalid request format or parameters |
| 401 | HTTPException | Unauthorized | Missing or invalid authentication token |
| 403 | FeastPermissionError | Forbidden | Insufficient permissions to access the resource |
| 404 | FeastObjectNotFoundException | Not Found | Requested entity, feature view, data source, etc. does not exist |
| 422 | ValidationError / RequestValidationError / ValueError / PushSourceNotFoundException | Unprocessable Entity | Validation errors, missing required parameters, or invalid input |
| 500 | InternalServerError | Internal Server Error | Unexpected server-side errors |
The REST API now supports enhanced response formats for relationships and pagination:
Single Object Endpoints (GET /resource/{name}):
Without relationships:
{
"entity": { ... }
}
With relationships:
{
"entity": { ... },
"relationships": [
{
"source": {
"type": "entity",
"name": "customer_id"
},
"target": {
"type": "featureView",
"name": "customer_features"
}
}
]
}
List Endpoints (GET /resources):
Without relationships or pagination:
{
"entities": [
{ "name": "customer_id", ... },
{ "name": "driver_id", ... }
]
}
With pagination only:
{
"entities": [
{ "name": "customer_id", ... },
{ "name": "driver_id", ... }
],
"pagination": {
"page": 1,
"limit": 10,
"total": 25,
"totalPages": 3
}
}
With relationships and pagination:
{
"entities": [
{ "name": "customer_id", ... },
{ "name": "driver_id", ... }
],
"pagination": {
"page": 1,
"limit": 10,
"total": 25,
"totalPages": 3
},
"relationships": {
"customer_id": [
{
"source": {
"type": "entity",
"name": "customer_id"
},
"target": {
"type": "featureView",
"name": "customer_features"
}
}
],
"driver_id": [
{
"source": {
"type": "entity",
"name": "driver_id"
},
"target": {
"type": "featureView",
"name": "driver_features"
}
}
]
}
}
The REST API has been enhanced with comprehensive support for relationships and pagination across all endpoints.
Relationships show how different Feast objects connect to each other, providing insight into dependencies and data lineage. When the include_relationships parameter is set to true, the API returns both direct and indirect relationships.
Supported Object Types:
entity - Feast entitiesdataSource - Data sourcesfeatureView - Feature views (including regular, on-demand, and stream)feature - Features (including features from on-demand feature views)featureService - Feature servicespermission - PermissionssavedDataset - Saved datasetsCommon Relationship Patterns:
All list endpoints support pagination to improve performance and manageability of large datasets:
page - Page number (starts from 1)limit - Number of items per page (maximum 100)sort_by - Field to sort bysort_order - Sort order: "asc" (ascending) or "desc" (descending)When the REST API server is running, you can access interactive documentation at:
http://localhost:6572/ (root path)http://localhost:6572/docshttp://localhost:6572/openapi.jsonThere is a CLI command that starts the Registry server: feast serve_registry. By default, remote Registry Server uses port 6570, the port can be overridden with a --port flag.
To start the Registry Server in TLS mode, you need to provide the private and public keys using the --key and --cert arguments.
More info about TLS mode can be found in feast-client-connecting-to-remote-registry-sever-started-in-tls-mode
To enable REST API support along with gRPC, start the registry server with REST mode enabled :
feast serve_registry --rest-api
This launches both the gRPC and REST servers concurrently. The REST server listens on port 6572 by default.
To run a REST-only server (no gRPC):
feast serve_registry --rest-api --no-grpc
Please see the detail how to configure Remote Registry client remote.md
Please refer the page for more details on API Endpoints and Permissions.
Please refer the page for more details on how to configure authentication and authorization.
GET /api/v1/metrics/resource_countsproject (optional): Project name to filter resource counts (if not provided, returns counts for all projects)# Get counts for specific project
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/resource_counts?project=my_project"
# Get counts for all projects
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/resource_counts"
{
"project": "my_project",
"counts": {
"entities": 5,
"dataSources": 3,
"savedDatasets": 2,
"features": 12,
"featureViews": 4,
"featureServices": 2
}
}
{
"total": {
"entities": 15,
"dataSources": 8,
"savedDatasets": 5,
"features": 35,
"featureViews": 12,
"featureServices": 6
},
"perProject": {
"project_a": {
"entities": 5,
"dataSources": 3,
"savedDatasets": 2,
"features": 12,
"featureViews": 4,
"featureServices": 2
},
"project_b": {
"entities": 10,
"dataSources": 5,
"savedDatasets": 3,
"features": 23,
"featureViews": 8,
"featureServices": 4
}
}
}
GET /api/v1/metrics/recently_visitedproject (optional): Project name to filter recent visits (defaults to current project)object (optional): Object type to filter recent visits (e.g., entities, features, feature_services)page (optional): Page number for pagination (starts from 1)limit (optional): Number of items per page (maximum 100)sort_by (optional): Field to sort by (e.g., timestamp, path, object)sort_order (optional): Sort order: "asc" or "desc" (default: "asc")# Get all recent visits for a project
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/recently_visited?project=my_project"
# Get recent visits with pagination
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/recently_visited?project=my_project&page=1&limit=10"
# Get recent visits filtered by object type
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/recently_visited?project=my_project&object=entities"
# Get recent visits sorted by timestamp descending
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/recently_visited?project=my_project&sort_by=timestamp&sort_order=desc"
{
"visits": [
{
"path": "/api/v1/entities/driver",
"timestamp": "2024-07-18T12:34:56.789Z",
"project": "my_project",
"user": "alice",
"object": "entities",
"object_name": "driver",
"method": "GET"
},
{
"path": "/api/v1/feature_services/user_service",
"timestamp": "2024-07-18T12:30:45.123Z",
"project": "my_project",
"user": "alice",
"object": "feature_services",
"object_name": "user_service",
"method": "GET"
}
],
"pagination": {
"totalCount": 2
}
}
{
"visits": [
{
"path": "/api/v1/entities/driver",
"timestamp": "2024-07-18T12:34:56.789Z",
"project": "my_project",
"user": "alice",
"object": "entities",
"object_name": "driver",
"method": "GET"
}
],
"pagination": {
"page": 1,
"limit": 10,
"totalCount": 25,
"totalPages": 3,
"hasNext": true,
"hasPrevious": false
}
}
Note: Recent visits are automatically logged when users access registry objects via the REST API. The logging behavior can be configured through the feature_server.recent_visit_logging section in feature_store.yaml (see configuration section below).
GET /api/v1/searchquery (required): Search query string. Searches in resource names, descriptions, and tags. Empty string returns all resources.projects (optional): List of project names to search in. If not specified, searches all projectsallow_cache (optional, default: true): Whether to allow cached datatags (optional): Filter results by tags in key:value format (e.g., tags=environment:production&tags=team:ml)page (optional, default: 1): Page number for pagination (starts from 1)limit (optional, default: 50, max: 100): Number of items per pagesort_by (optional, default: match_score): Field to sort by (match_score, name, or type)sort_order (optional, default: desc): Sort order ("asc" or "desc")# Basic search across all projects
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/search?query=user"
# Search in specific projects
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/search?query=driver&projects=ride_sharing&projects=analytics"
# Search with tag filtering
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/search?query=features&tags=environment:production&tags=team:ml"
# Search with pagination and sorting
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/search?query=conv_rate&page=1&limit=10&sort_by=name&sort_order=asc"
# Empty query to list all resources with filtering
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/search?query=&projects=my_project&page=1&limit=20"
{
"query": "user",
"projects_searched": ["project1", "project2"],
"results": [
{
"type": "entity",
"name": "user_id",
"description": "Primary identifier for users",
"project": "project1",
"match_score": 100,
"matched_tags": {}
},
{
"type": "featureView",
"name": "user_features",
"description": "User demographic and behavioral features",
"project": "project1",
"match_score": 100,
"matched_tags": {"team": "user_analytics"}
},
{
"type": "feature",
"name": "user_age",
"description": "Age of the user in years",
"project": "project1",
"featureView": "user_features",
"match_score": 80,
"matched_tags": {}
},
{
"type": "dataSource",
"name": "user_analytics",
"description": "Analytics data for user behavior tracking",
"project": "project2",
"match_score": 80,
"matched_tags": {"source": "user_data"}
}
],
"pagination": {
"page": 1,
"limit": 50,
"totalCount": 4,
"totalPages": 1,
"hasNext": false,
"hasPrevious": false
},
"errors": []
}
// Invalid sort_by parameter (HTTP 400)
{
"detail": "Invalid sort_by parameter: 'invalid_field'. Valid options are: ['match_score', 'name', 'type']"
}
// Invalid sort_order parameter (HTTP 400)
{
"detail": "Invalid sort_order parameter: 'invalid_order'. Valid options are: ['asc', 'desc']"
}
// Invalid pagination limit above maximum (HTTP 400)
{
"detail": "Invalid limit parameter: '150'. Must be less than or equal to 100"
}
// Missing required query parameter (HTTP 422)
{
"detail": [
{
"type": "missing",
"loc": ["query_params", "query"],
"msg": "Field required"
}
]
}
// Successful response with warnings
{
"query": "user",
"projects_searched": ["existing_project"],
"results": [],
"pagination": {
"page": 1,
"limit": 50,
"totalCount": 0,
"totalPages": 0
},
"errors": ["Following projects do not exist: nonexistent_project"]
}
// Successful response but empty results
{
"query": "user",
"projects_searched": ["existing_project"],
"results": [],
"pagination": {
"page": 1,
"limit": 50,
"totalCount": 0,
"totalPages": 0
},
"errors": []
}
GET /api/v1/metrics/popular_tagsproject (optional): Project name for popular tags (returns all projects if not specified)limit (optional, default: 4): Number of popular tags to returnallow_cache (optional, default: true): Whether to allow cached responses# Basic usage (all projects)
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/popular_tags"
# Specific project
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/popular_tags?project=my_project"
# Custom limit
curl -H "Authorization: Bearer <token>" \
"http://localhost:6572/api/v1/metrics/popular_tags?project=my_project&limit=3"
PopularTagsResponse{
"popular_tags": [
{
"tag_key": "environment",
"tag_value": "production",
"feature_views": [
{
"name": "user_features",
"project": "my_project"
},
{
"name": "order_features",
"project": "my_project"
}
],
"total_feature_views": 2
},
{
"tag_key": "team",
"tag_value": "ml_team",
"feature_views": [
{
"name": "user_features",
"project": "my_project"
}
],
"total_feature_views": 1
}
],
"metadata": {
"totalFeatureViews": 3,
"totalTags": 2,
"limit": 4
}
}
Response Models:
FeatureViewInfo: Contains feature view name and projectPopularTagInfo: Contains tag information and associated feature viewsPopularTagsMetadata: Contains metadata about the responsePopularTagsResponse: Main response model containing popular tags and metadataThe registry server supports configuration of recent visit logging via the feature_server section in feature_store.yaml.
Example:
feature_server:
type: local
recent_visit_logging:
limit: 100 # Number of recent visits to store per user
log_patterns:
- ".*/entities/(?!all$)[^/]+$"
- ".*/data_sources/(?!all$)[^/]+$"
- ".*/feature_views/(?!all$)[^/]+$"
- ".*/features/(?!all$)[^/]+$"
- ".*/feature_services/(?!all$)[^/]+$"
- ".*/saved_datasets/(?!all$)[^/]+$"
- ".*/custom_api/.*"
Configuration Options:
Default Log Patterns:
.*/entities/(?!all$)[^/]+$ - Individual entity endpoints.*/data_sources/(?!all$)[^/]+$ - Individual data source endpoints.*/feature_views/(?!all$)[^/]+$ - Individual feature view endpoints.*/features/(?!all$)[^/]+$ - Individual feature endpoints.*/feature_services/(?!all$)[^/]+$ - Individual feature service endpoints.*/saved_datasets/(?!all$)[^/]+$ - Individual saved dataset endpointsBehavior:
log_patterns will be trackedlimit visits per user are stored/metrics/*) are automatically excluded from logging to prevent circular references