Skip to content

Instantly share code, notes, and snippets.

@Sdy603
Created March 25, 2026 16:22
Show Gist options
  • Select an option

  • Save Sdy603/421f01f3655aa4e1d754dafc35f2e4af to your computer and use it in GitHub Desktop.

Select an option

Save Sdy603/421f01f3655aa4e1d754dafc35f2e4af to your computer and use it in GitHub Desktop.
/**
* DX queries.datafeed fetcher
*
* Usage:
* export DX_API_KEY="your_api_key"
*
* node fetch_dx_query.js
* node fetch_dx_query.js --csv
* node fetch_dx_query.js --csv=out.csv
* node fetch_dx_query.js --feed=abc123
* node fetch_dx_query.js --apiKey=xxxx --feed=abc123 --csv=data.csv
*/
const https = require("https");
const fs = require("fs");
// --- DEFAULTS (fallbacks) ---
const DEFAULT_FEED_TOKEN = "cZUNCosVmt6d1rMkjCpiPe6S";
const DEFAULT_API_KEY = ""; // optional fallback if you want to hardcode
// --- CLI ARGS ---
const args = process.argv.slice(2);
function getArg(name) {
const arg = args.find(a => a.startsWith(`--${name}=`));
return arg ? arg.split("=")[1] : null;
}
// --- RESOLUTION ORDER: CLI -> ENV -> DEFAULT ---
const FEED_TOKEN =
getArg("feed") ||
process.env.DX_FEED_TOKEN ||
DEFAULT_FEED_TOKEN;
const DX_API_KEY =
getArg("apiKey") ||
process.env.DX_API_KEY ||
DEFAULT_API_KEY;
// CSV flags
const csvArg = args.find(arg => arg.startsWith("--csv"));
const ENABLE_CSV = !!csvArg;
const CSV_FILENAME = csvArg?.includes("=")
? csvArg.split("=")[1]
: "dx_output.csv";
// Optional query config
const QUERY_VARS = {
// "var-team": "platform"
};
const COLUMNS = []; // ["title", "open_to_deploy"]
// --- BUILD URL ---
function buildUrl() {
const url = new URL("https://api.getdx.com/queries.datafeed");
url.searchParams.append("feed_token", FEED_TOKEN);
Object.entries(QUERY_VARS).forEach(([key, value]) => {
url.searchParams.append(key, value);
});
if (COLUMNS.length > 0) {
url.searchParams.append("columns", COLUMNS.join(","));
}
return url.toString();
}
// --- FETCH ---
function fetchData() {
return new Promise((resolve, reject) => {
const options = {
method: "GET",
headers: {
"Accept": "application/json",
"Authorization": `Bearer ${DX_API_KEY}`
}
};
https
.get(buildUrl(), options, (res) => {
let data = "";
res.on("data", chunk => {
data += chunk;
});
res.on("end", () => {
try {
const parsed = JSON.parse(data);
if (!parsed.ok) {
return reject(new Error(`DX API error: ${JSON.stringify(parsed)}`));
}
resolve(parsed.data);
} catch (err) {
reject(err);
}
});
})
.on("error", reject);
});
}
// --- OUTPUT ---
function printTable(data) {
const { columns, rows } = data;
console.log("\nColumns:");
console.log(columns);
console.log("\nRows:");
rows.forEach((row) => {
const obj = {};
columns.forEach((col, i) => {
obj[col] = row[i];
});
console.log(obj);
});
}
function writeCSV(data, filename) {
const { columns, rows } = data;
const csv = [
columns.join(","),
...rows.map(row =>
row.map(val => `"${String(val).replace(/"/g, '""')}"`).join(",")
)
].join("\n");
fs.writeFileSync(filename, csv);
console.log(`\nSaved CSV -> ${filename}`);
}
// --- MAIN ---
async function main() {
if (!DX_API_KEY) {
console.error("Missing API key (use --apiKey or DX_API_KEY)");
process.exit(1);
}
if (!FEED_TOKEN) {
console.error("Missing feed token (use --feed or DX_FEED_TOKEN)");
process.exit(1);
}
console.log("Using feed_token:", FEED_TOKEN);
try {
const data = await fetchData();
if (ENABLE_CSV) {
writeCSV(data, CSV_FILENAME);
} else {
printTable(data);
}
} catch (err) {
console.error("Error:", err.message);
}
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment