diff --git a/package-lock.json b/package-lock.json
index 766f58f7e8cb8a29251f4ca986f05e34a5ed22c4..28ab4158201a88d53f6a473656dce5b79c295617 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3028,6 +3028,14 @@
         "sha.js": "^2.4.8"
       }
     },
+    "cross-fetch": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz",
+      "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==",
+      "requires": {
+        "node-fetch": "2.6.1"
+      }
+    },
     "cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -7474,6 +7482,11 @@
       "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==",
       "dev": true
     },
+    "node-fetch": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+    },
     "node-libs-browser": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
diff --git a/package.json b/package.json
index 1e7412d7ecf62e888f1c970807e022bf8da878a3..6a9b11e054e364856aa18b2419bf642201df7eba 100644
--- a/package.json
+++ b/package.json
@@ -37,8 +37,10 @@
 		"watch2null": "chokidar src/* -c \"npm run test:dev:runTests 2>/dev/null\""
 	},
 	"dependencies": {
+		"cross-fetch": "^3.1.4",
 		"js-sha256": "https://github.com/1000i100/js-sha256#master",
 		"latinize-to-ascii": "^0.5.2",
+		"node-fetch": "^2.6.1",
 		"scrypt-async-modern": "^3.0.12",
 		"tweetnacl": "^1.0.3"
 	},
diff --git a/src/data-pod-client.mjs b/src/data-pod-client.mjs
index cb0ff5c3b541f646105198ee23ac0fc3d805023e..cec8a43a235ae37374f1321efb9a32366e4ed786 100644
--- a/src/data-pod-client.mjs
+++ b/src/data-pod-client.mjs
@@ -1 +1,11 @@
-export {};
+import fetch from 'node-fetch';
+
+export function DataPodClient(hosts){
+	const self = this;
+	self.hosts = hosts;
+	self.query = queryStr => query(self,queryStr)
+	return self;
+}
+async function query(self,queryStr){
+	return await (await fetch(self.hosts[0]+queryStr)).json();
+}
diff --git a/src/data-pod-client.test-e2e.mjs b/src/data-pod-client.test-e2e.mjs
index 807ea8279e09b6cf1d75a5324a7dc30ed09bc779..740ab3339138778a8f9ee821e905037a758b8265 100644
--- a/src/data-pod-client.test-e2e.mjs
+++ b/src/data-pod-client.test-e2e.mjs
@@ -1,7 +1,7 @@
 import test from 'ava';
 import * as app from './data-pod-client.mjs';
 
-test.skip('data-pod-client real server request', async t => {
+test('data-pod-client real server request', async t => {
 	const hosts = ['https://g1.data.e-is.pro/'];
 	const query = 'user/profile/2sZF6j2PkxBDNAqUde7Dgo5x3crkerZpQ4rBqqJGn8QT?&_source=title';
 	const expectedResult = JSON.parse(`{
diff --git a/src/gva-client.mjs b/src/gva-client.mjs
index cb0ff5c3b541f646105198ee23ac0fc3d805023e..fe6ac9390682c11f31ab6a81cc75af1cb23c0420 100644
--- a/src/gva-client.mjs
+++ b/src/gva-client.mjs
@@ -1 +1,11 @@
-export {};
+import fetch from 'node-fetch';
+
+export function GvaClient(hosts){
+	const self = this;
+	self.hosts = hosts;
+	self.query = queryStr => query(self,queryStr)
+	return self;
+}
+async function query(self,queryStr){
+	return await (await fetch(self.hosts[0],{method: 'POST',body:queryStr})).json();
+}
diff --git a/src/gva-client.test-e2e.mjs b/src/gva-client.test-e2e.mjs
index 75c7f6135f8de32b14da5e22a09566bc042f28d5..9e49c275e0c78e4eca95f9577839c36925250153 100644
--- a/src/gva-client.test-e2e.mjs
+++ b/src/gva-client.test-e2e.mjs
@@ -1,6 +1,16 @@
 import test from 'ava';
 import * as app from './gva-client.mjs';
 
-test('dummy', async t => {
-	t.true(true);
+// TODO: handle GVASUB in gva-ws-client.mjs
+// subscription{newBlocks{number}}
+
+test('gva real server request', async t => {
+	const hosts = ['https://g1.librelois.fr/gva'];
+	const query = '{"query":"query($pubkey: PkOrScriptGva!) { balance(script: $pubkey) { amount }}","variables":{"pubkey":"2sZF6j2PkxBDNAqUde7Dgo5x3crkerZpQ4rBqqJGn8QT"}}';
+	// Unused result example : `{ "data": { "balance": { "amount": 0 } } }`
+
+	const client = new app.GvaClient(hosts);
+	const result = await client.query(query);
+
+	t.true(result.data.balance.amount > 0);
 });