diff --git a/ldvspec/lofardata/admin.py b/ldvspec/lofardata/admin.py
index cf044d64e6c5d0935980c65f941a89eff47f36d7..e42f80883d51fbabe15e412aaaa66445078aa39a 100644
--- a/ldvspec/lofardata/admin.py
+++ b/ldvspec/lofardata/admin.py
@@ -1,5 +1,7 @@
 from django.contrib import admin
 
 # Register your models here.
-from .models import LofarData
-admin.site.register(LofarData)
\ No newline at end of file
+from .models import DataProduct, DataProductFilter
+
+admin.site.register(DataProduct)
+admin.site.register(DataProductFilter)
diff --git a/ldvspec/lofardata/models.py b/ldvspec/lofardata/models.py
index 515628218e41e33b0be8633df57d83f89385ba58..0d233fc9c6f7c4d54490f66bcda851750b9c6459 100644
--- a/ldvspec/lofardata/models.py
+++ b/ldvspec/lofardata/models.py
@@ -1,8 +1,30 @@
 from django.db import models
+from django_filters import rest_framework as filters
 
 
-class LofarData(models.Model):
-    sas_id = models.CharField(verbose_name="SAS_ID", max_length=15, blank=True, null=True)
 
-    def __str__(self):
-        return self.sas_id
+
+class DataLocations(models.Model):
+    name = models.CharField(max_length=50, primary_key=True)
+    uri = models.CharField(max_length=200)
+
+
+class DataProduct(models.Model):
+    obs_id = models.CharField(verbose_name="OBS_ID", max_length=15)
+    oid_source = models.CharField(verbose_name='OBS_ID_SOURCE', max_length=15)
+    dataproduct_source = models.CharField(max_length=20)
+    dataproduct_type = models.CharField(max_length=50)
+    project = models.CharField(max_length=15)
+    location = models.ForeignKey(DataLocations, on_delete=models.DO_NOTHING)
+    activity = models.CharField(max_length=50)
+    surl = models.CharField(max_length=200)
+    filesize = models.PositiveBigIntegerField()
+    additional_meta = models.JSONField()
+
+
+class DataProductFilter(models.Model):
+
+    field = models.CharField(max_length=20)
+    name = models.CharField(max_length=20)
+    lookup_type = models.CharField(max_length=100)
+
diff --git a/ldvspec/lofardata/serializers.py b/ldvspec/lofardata/serializers.py
index aaf9229c414b1b20f901be87a5d9fa53618cd7a9..189e327c18d9210cd26b23ba53bd65f3051458b1 100644
--- a/ldvspec/lofardata/serializers.py
+++ b/ldvspec/lofardata/serializers.py
@@ -1,8 +1,8 @@
 from rest_framework import serializers
-from .models import LofarData
+from .models import DataProduct
 
-class LofarDataSerializer(serializers.ModelSerializer):
+class DataProductSerializer(serializers.ModelSerializer):
 
     class Meta:
-        model = LofarData
+        model = DataProduct
         fields = "__all__"
diff --git a/ldvspec/lofardata/templates/lofardata/base.html b/ldvspec/lofardata/templates/lofardata/base.html
index 020485dbd2f2b26f6a02a1d29810b4ed0e731bb7..e5ab1386442bf38a9a3f6bfd4fece547a9658fc5 100644
--- a/ldvspec/lofardata/templates/lofardata/base.html
+++ b/ldvspec/lofardata/templates/lofardata/base.html
@@ -34,7 +34,7 @@
                 </li>
 
                 <li><a class="nav-link" href="{% url 'index' %}">Home</a></li>
-                <li><a class="nav-link" href="{% url 'lofardata' %}">LOFAR Data</a></li>
+                <li><a class="nav-link" href="{% url 'dataproduct' %}">LOFAR Data</a></li>
 
             {% if user.is_authenticated %}
                 <a class="nav-link" href="{% url 'logout' %}" target="_blank">Logout {{ user.get_username }}</a>
diff --git a/ldvspec/lofardata/templates/lofardata/index.html b/ldvspec/lofardata/templates/lofardata/index.html
index 76803327bb3eef32421637c330b7029772fa9107..f41e698a5f62e759ff9087f7512d9892bb64452f 100644
--- a/ldvspec/lofardata/templates/lofardata/index.html
+++ b/ldvspec/lofardata/templates/lofardata/index.html
@@ -9,7 +9,8 @@
 
         <tbody>
             <tr><td>atdb_host</td><td>{{ atdb_host }}</td></tr>
-            <tr><td>api</td><td><a href="{% url 'lofardata' %}">{% url 'lofardata' %}</a></td></tr>
+            <tr><td>api</td><td><a href="{% url 'dataproduct' %}">{% url 'dataproduct' %}</a></td></tr>
+            <tr><td>api-schema</td><td><a href="{% url 'openapi-schema' %}">{% url 'openapi-schema' %}</a></td></tr>
         </tbody>
 
     </table>
diff --git a/ldvspec/lofardata/urls.py b/ldvspec/lofardata/urls.py
index 236c3de9ebcabd2e1765fd0144414e116a281fea..99257b63f946d7419d123ebfe0e89c14fc4cec47 100644
--- a/ldvspec/lofardata/urls.py
+++ b/ldvspec/lofardata/urls.py
@@ -1,6 +1,7 @@
 from django.urls import include, path
 from django.contrib.auth import views as auth_views
 from rest_framework.authtoken import views as rest_auth_views
+from rest_framework.schemas import get_schema_view
 
 from . import views
 
@@ -13,8 +14,12 @@ urlpatterns = [
     path('login/', auth_views.LoginView.as_view(template_name='registration/login.html')),
 
     # REST API
-    path('lofardata/', views.LofarDataView.as_view(), name='lofardata'),
-
+    path('data/', views.DataProductView.as_view(), name='dataproduct'),
+    path('openapi/', get_schema_view(
+        title="LDV Specification",
+        description="API description",
+        version="0.0.1"
+    ), name='openapi-schema'),
     # GUI
     #path('', views.IndexView.as_view(), name='index'),
     path('', views.index, name='index'),
diff --git a/ldvspec/lofardata/views.py b/ldvspec/lofardata/views.py
index d058d3cf4311c2ca01159c3ce6ed54dbdd5536c4..92120167993ee234e0de3838aa144633d3e0e6c1 100644
--- a/ldvspec/lofardata/views.py
+++ b/ldvspec/lofardata/views.py
@@ -1,26 +1,45 @@
-
-from django.shortcuts import render, redirect, reverse
-from django.views.generic import ListView
+from django.shortcuts import render
 from django.conf import settings
 
 from rest_framework import generics, pagination
-from rest_framework.views import APIView
 
-import django_filters
 from django_filters import rest_framework as filters
 
-from .models import LofarData
-from .serializers import LofarDataSerializer
+from .models import DataProduct, DataProductFilter
+from .serializers import DataProductSerializer
 
-# --- Filters ---
-class LofarDataFilter(filters.FilterSet):
+
+class DynamicFilterSet(filters.FilterSet):
     class Meta:
-        model = LofarData
+        filter_class = None
+
+    def __init__(self, *args, **kwargs):
+        self._load_filters()
+        super().__init__(*args, **kwargs)
+
+    def _load_filters(self):
+        print('Current filters are', self.base_filters)
+        if self.Meta.filter_class is None:
+            raise Exception('Define filter_class meta attribute')
+
+        print('Filter to be added', self.Meta.filter_class.objects.all())
+        for item in self.Meta.filter_class.objects.all():
+            field_obj = self.Meta.model._meta.get_field(item.field)
+            filter_class, *_ = self.filter_for_lookup(field_obj, item.lookup_type)
+            self.base_filters[item.name] = filter_class(item.field)
+        print('Final filters are', self.base_filters)
 
+
+# --- Filters ---
+class DataProductFilterSet(DynamicFilterSet):
+    class Meta:
+        model = DataProduct
+        filter_class = DataProductFilter
         fields = {
-            'sas_id': ['exact', 'icontains'],
+            'obs_id': ['exact', 'icontains'],
         }
 
+
 # ---------- GUI Views -----------
 
 def index(request):
@@ -30,12 +49,15 @@ def index(request):
 
 # ---------- REST API views ----------
 
-class LofarDataView(generics.ListCreateAPIView):
-    model = LofarData
-    serializer_class = LofarDataSerializer
+class DataProductView(generics.ListCreateAPIView):
+    model = DataProduct
+    serializer_class = DataProductSerializer
 
-    queryset = LofarData.objects.all().order_by('sas_id')
+    queryset = DataProduct.objects.all().order_by('obs_id')
 
     # using the Django Filter Backend - https://django-filter.readthedocs.io/en/latest/index.html
     filter_backends = (filters.DjangoFilterBackend,)
-    filter_class = LofarDataFilter
+    filter_class = DataProductFilterSet().__class__
+
+    def get_queryset(self):
+        return self.queryset.order_by('obs_id')