diff --git a/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 b/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4
index 52edd2e..c1bd90b 100644
--- a/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4
+++ b/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4
@@ -6,7 +6,7 @@ configkey               : IDENTIFIER ;
 configvalue             : (IDENTIFIER|VALUE) ;
 namedTypeDeclaration    : typeName typeDeclaration ;
 typeName                : IDENTIFIER ;
-typeDeclaration         : typeName? '(' typeField (',' typeField)* ')' ;
+typeDeclaration         : '(' typeField (',' typeField)* ')' ;
 typeField               : fieldName ':' fieldType ;
 fieldName               : IDENTIFIER ;
 fieldType               : IDENTIFIER ;
diff --git a/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java b/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java
index 556a23c..51b0854 100644
--- a/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java
+++ b/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java
@@ -56,8 +56,24 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsP
             var endpoint = new EndpointNode(new PathsNode(segments), typeReference.getText());
             this.endpoints.add(endpoint);
         } else {
-            var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration());
-            var endpoint = new EndpointNode(new PathsNode(segments), compoundTypeNode.name().orElseThrow());
+            EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ;
+            String requestTypeName = null ;
+            // request can be either a named type declaration, an anonymous type declaration or a type reference
+            if (requestBodyContext.namedTypeDeclaration() != null) {
+                var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration());
+                requestTypeName = compoundTypeNode.name() ;
+                this.dataTypes.add(compoundTypeNode);
+            } else if (requestBodyContext.typeDeclaration() != null) {
+                var typeFields = extractTypeFields(requestBodyContext.typeDeclaration().typeField()) ;
+                requestTypeName = segments.getLast() + "Request" ;
+                this.dataTypes.add(new TypeNode(requestTypeName, typeFields));
+            } else if (requestBodyContext.IDENTIFIER() != null) {
+                requestTypeName = requestBodyContext.IDENTIFIER().getText() ;
+            }
+            if (requestTypeName == null) {
+                throw new ParseException("Unable to create the request body data type" + ctx.toStringTree()) ;
+            }
+            var endpoint = new EndpointNode(new PathsNode(segments), requestTypeName);
             this.endpoints.add(endpoint);
         }
     }
@@ -65,7 +81,7 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsP
     private TypeNode extractCompoundTypeNode(EndpointsParser.NamedTypeDeclarationContext ctx) {
         String typeName = ctx.typeName().getText();
         List<FieldNode> fields = extractTypeFields(ctx.typeDeclaration().typeField());
-        return new TypeNode(Optional.of(typeName), fields);
+        return new TypeNode(typeName, fields);
     }
 
     private List<FieldNode> extractTypeFields(List<EndpointsParser.TypeFieldContext> compoundFieldContexts) {
diff --git a/parser/src/main/java/nu/zoom/dsl/ast/ParseException.java b/parser/src/main/java/nu/zoom/dsl/ast/ParseException.java
new file mode 100644
index 0000000..d9dde07
--- /dev/null
+++ b/parser/src/main/java/nu/zoom/dsl/ast/ParseException.java
@@ -0,0 +1,7 @@
+package nu.zoom.dsl.ast;
+
+public class ParseException extends RuntimeException {
+    public ParseException(String message) {
+        super(message);
+    }
+}
diff --git a/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java b/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java
index 1e76b1a..095da4f 100644
--- a/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java
+++ b/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java
@@ -3,5 +3,5 @@ package nu.zoom.dsl.ast;
 import java.util.List;
 import java.util.Optional;
 
-public record TypeNode(Optional<String> name, List<FieldNode> fields) {
+public record TypeNode(String name, List<FieldNode> fields) {
 }
diff --git a/test01.endpoints b/test01.endpoints
index c60ce61..aa8ff9a 100644
--- a/test01.endpoints
+++ b/test01.endpoints
@@ -1,2 +1,5 @@
-/some/endpoint =< SomeType(foo:String)
-/some/other/endpoint =< SomeOtherType(bar:Seq[Embedded])
\ No newline at end of file
+AType(data: List[String])
+
+/some/endpoint <- SomeType(foo:String)
+/some/other/endpoint <- SomeOtherType(bar:Seq[Embedded])
+/yet/other/endpoint <- (bar:Seq[Embedded])
\ No newline at end of file