LandKit

JSON to CSV Converter

Convert JSON data to CSV format instantly. No signup required.

How it works

1

Paste your JSON

Copy and paste a JSON array of objects, or a single object. The tool handles nested objects automatically using dot notation.

2

Choose your options

Toggle the header row on or off, and pick your preferred delimiter: comma, semicolon, or tab.

3

Download or copy

Preview the first five rows, then download the file as data.csv or copy the raw CSV to your clipboard.

Deep dive

JSON to CSV converter: when SEO and growth teams actually need one in 2026

By Nikhil Kumar, Founder of LandKit. Last updated May 2026.

You opened a 14 MB API export, and Excel turned half your phone numbers into "1.23E+11."

That is the JSON-to-CSV problem in 2026, and almost every SEO and growth operator hits it within the first six weeks of any serious data project.

A JSON to CSV converter takes a hierarchical, nested JSON payload (the default response shape from GA4, Search Console, Ahrefs, Semrush, and almost every modern API) and flattens it into rows and columns a spreadsheet can sort, pivot, and chart. You need one whenever an API hands you nested objects but your analysis lives in Sheets or Excel. The right converter preserves leading zeros, handles arrays without breaking your schema, and runs in your browser so customer data never touches a third-party server.

Why marketers and SEO teams convert JSON to CSV in the first place

Almost every API a marketer touches today returns JSON, but almost every analysis still happens in a spreadsheet. JSON is the default output for the GA4 Data API, the Google Search Console Search Analytics API, Ahrefs, Semrush, OpenAI's Batch API, and most Reddit, X, and LinkedIn endpoints. CSV is the format Google Sheets, Excel, Looker Studio, BigQuery imports, and every junior analyst on your team can actually work with. Converting between the two is plumbing, and plumbing eats hours when you do it wrong.

The Ahrefs API, for example, lets you specify the output format on the request itself. According to Ahrefs API documentation, endpoints accept output=json, output=xml, or output=php. JSON is the default for almost every modern client.

Semrush is similar. Its official API overview notes that the platform returns either CSV or JSON depending on the endpoint, which means you will end up converting at least some of it whichever way you go.

The Google Analytics Data API returns purely structured JSON. Per Google's Data API documentation, a single runReport call can return up to 250,000 rows in one response, and pagination handles anything beyond that. Standard properties get 200,000 core tokens per day; Analytics 360 properties get 2,000,000.

Search Console is more restrictive. The Search Analytics API caps a single response at 25,000 rows and a daily total of 50,000 rows per site per search type. If you want everything, you paginate or fall back to the BigQuery bulk export Google added in February 2023.

The pattern is identical across all of them. API gives you JSON. Stakeholder wants CSV. Something in the middle has to flatten the structure.

What "nested JSON" actually means and why it breaks spreadsheets

Nested JSON is a tree. CSV is a grid. A converter has to decide how to fit the tree into the grid, and the decision it makes determines whether your spreadsheet formulas survive. The two safe strategies are dot-notation flattening (address.city, metrics.clicks) which keeps each row intact, and array-unwinding (each array element becomes a new row) which preserves cardinality but multiplies row counts. Picking the wrong one corrupts pivot tables, breaks VLOOKUP, and silently duplicates revenue numbers.

GA4 responses illustrate the problem cleanly. A single response carries dimensionHeaders, metricHeaders, and a rows array where each row contains its own nested dimensionValues and metricValues arrays. None of that imports cleanly into Sheets without a flattener.

The Search Console API returns rows where keys is itself an array (query, page, country, device, depending on dimensions you requested). If you flatten with dot-notation alone, you get keys.0, keys.1, keys.2, which is almost always wrong. You want them to become named columns: query, page, country, device.

OpenAI's Batch API output is the worst case. According to OpenAI's Batch API guide, every response is a JSONL file (one JSON object per line) where each line nests response.body.choices[0].message.content. Pull the wrong key path and you get null in every row.

Excel does not help. Per Microsoft's documentation on leading zeros, Excel limits numbers to 15 digits of precision and converts anything longer to scientific notation, while also stripping leading zeros from any column it auto-detects as numeric. SKUs, phone numbers, ZIP codes, GTINs, and IDs all get mangled the moment you double-click the file.

The fix is to import the CSV through Power Query or Sheets' import wizard and force string typing on the affected columns. The better fix is to convert with a tool that quotes those columns at write time, per the RFC 4180 specification, so Excel reads them as text without you babysitting the import.

Which APIs actually produce JSON you have to convert

Here is the short list of APIs every SEO and growth team eventually touches, what they return, and what you do about it.

API or sourceDefault outputRow or token capConversion challenge
GA4 Data APIJSON250,000 rows per runReport; 200K daily tokens (standard)Nested dimensionValues and metricValues arrays
Search Console APIJSON25,000 rows per query; 50,000 per day per sitekeys array needs splitting into named columns
Ahrefs APIJSON (default), XML, PHPDepends on plan and endpointBacklink data has nested anchor and link-context objects
Semrush APICSV or JSON depending on endpointEndpoint-specific row limitsMixed nesting; some endpoints need conversion either direction
OpenAI Batch APIJSONLUp to 50,000 requests per batchEach line wraps the model output 4 levels deep
Reddit Data APIJSON100 items per page; rate-limitedEach post nests data.children[].data

The Google Search Console API hard cap of 25,000 rows per query is well documented. The Search Analytics method reference sets maxRows = 25000 as the response ceiling and exposes 50,000 rows per day per search type. For most sites under 10,000 indexed URLs, that is more than enough; for larger sites, the BigQuery bulk export route bypasses the limit entirely.

Ahrefs has been explicit since version 2 that the JSON output mode is the recommended default. The legacy v2 endpoint signature is apiv2.ahrefs.com?token=...&output=json&select=anchor,backlinks,refpages,refdomains,first_seen. Pull a backlink report and you get a nested document with link metadata, ref domain stats, and anchor text per row.

OpenAI's Batch API is the one that has changed the workflow most for content teams. Per the Batch API documentation, batch jobs run at a 50% discount versus synchronous calls and complete within a 24-hour window. You hand it a JSONL file with up to 50,000 requests, and it hands you JSONL back. If you are running 1,000-keyword intent classifications or 10,000-URL meta description rewrites, the math is obvious: you save half your token bill, but every output is JSONL, and you have to flatten it before anyone in marketing can read it.

When browser-based conversion beats writing a Python script

A Python or Node script is the right answer when conversion is part of a recurring pipeline. A browser converter is the right answer when the conversion is one of forty things you are doing this week and the data has any chance of being sensitive. Browser tools run client-side, never upload, and finish in under a second on files up to 5–10 MB. Scripts win on files above that, on scheduled runs, and when you need to chain the output into another step. Pick by frequency, by file size, and by the sensitivity of what you are flattening.

A small but important detail: browser-based converters explicitly do not transmit your data. The well-known konklone.io JSON to CSV tool puts it in plain text on the page: "Your data is never sent to our servers. The conversion is done inside your browser." That matters when the file you are flattening contains email addresses, customer IDs, or revenue figures from your CRM.

Papa Parse, the most-used open-source browser CSV library, is RFC 4180-compliant and runs entirely client-side with zero dependencies. Most modern browser-based JSON-to-CSV tools use Papa Parse or json2csv under the hood.

The honest trade-off: browser tools cap at file sizes the browser can hold in memory. A 50 MB JSONL of OpenAI batch outputs will crash a Chrome tab on most laptops. For that, you write a 12-line Python script with pandas.json_normalize() or use the streaming ijson parser.

A useful rule for an SEO team. If you are converting once, use a browser. If you are converting weekly, write a script. If you are converting daily, schedule a cron job. The decision is operational, not technical.

If you also need to validate the structured-data side of your SEO work, the LandKit schema validator checks JSON-LD payloads and the schema markup generator builds them from scratch.

How do I flatten nested JSON without breaking my spreadsheet formulas

Flatten with dot-notation for object nesting and unwind for arrays of objects, then quote everything that looks numeric but is not. Object keys collapse cleanly: metrics.sessions becomes one column. Arrays of objects need to multiply rows: each row in rows[] becomes a separate spreadsheet row. Arrays of primitives become indexed columns: tags[0], tags[1], tags[2]. Excel's auto-conversion to scientific notation breaks the moment you do not quote ID-like strings, so flag those columns at write time.

The pandas approach is the most reliable for scripted work. A two-line snippet handles 90% of cases:

import pandas as pd
df = pd.json_normalize(data, record_path=['rows'], meta=['propertyId'])
df.to_csv('export.csv', index=False)

record_path tells pandas which array to treat as the row source. meta lets you carry top-level fields (the property ID, the date range) down into every row. Per the pandas json_normalize documentation, the max_level parameter caps how deeply you flatten so you do not explode a 12-level-deep structure into 200 columns.

For browser-based tools, the equivalent option is "dot-notation flattening with array unwinding," which most modern converters expose as a single checkbox.

The mistake people make: they flatten arrays of objects into pipe-separated strings to "preserve" them. That destroys downstream pivot tables. Always unwind to rows, never serialize to strings, unless the data is genuinely write-once and read-by-eye.

What is the safest way to handle phone numbers, ZIP codes, and IDs

Force the column to text in the CSV before Excel ever sees it, by wrapping the value in quotes and prefixing with an apostrophe, or by importing through Power Query with the data type set to Text. Excel's 15-digit numeric precision quietly mangles credit card hashes, GTINs, GA client IDs, and any phone number with a leading zero. The fix is at write time, not at read time, because once Excel saves the file the original characters are gone. Forcing text-mode handling preserves every leading zero and every long ID.

The Excel CSV import guide documents this behavior: "Numbers are limited to 15 digits of precision," and any longer string gets re-rendered as 1.23E+15. The behavior is permanent if you double-click the CSV and save.

The clean workflow:

  1. Convert JSON to CSV with quoting forced on.
  2. In Excel, choose Data > Get Data > From Text/CSV, never File > Open.
  3. In the import preview, change the data type for any ID, phone, or ZIP column from "Whole Number" or "General" to "Text."
  4. Load.

Skip step two and you lose the column.

How does this fit into a real SEO and GEO workflow

The workflow most growth teams actually run in 2026 looks like this: pull from one or more APIs into JSON, convert to CSV for analysis, work in Sheets or Excel for human review, then feed the cleaned CSV back into a workflow tool, a CMS, or a model. Conversion is the bottleneck step, and getting it right means the rest of the pipeline does not have to rebuild itself every week. Browser conversion handles ad-hoc work; scripted conversion handles the weekly cron jobs.

Here is the canonical seven-step pattern:

  1. Pull GA4 organic-traffic data via the Data API, broken down by landing page and source.
  2. Pull Search Console performance data for the same date range and the same URLs.
  3. Pull Ahrefs or Semrush keyword and backlink data for the top 200 pages.
  4. Convert all three JSON responses to CSV with consistent column naming.
  5. Join in Sheets on the URL key.
  6. Identify the gap pages: ranking but not converting, or converting but losing rankings.
  7. Push the priority list into your content workflow or your AI-citation tracking dashboard.

The same pattern, with different APIs, drives content briefs, link-building outreach, and AI-mention tracking. LandKit's free SEO audit tool and the llms.txt generator plug into the same JSON-first stack.

If you are also moving sitemaps around, the LandKit XML sitemap validator catches the malformed URLs that break Search Console's crawl reports before you waste an audit on bad data.

Why "API to spreadsheet" still wins over dashboards in 2026

Dashboards are great for monitoring; spreadsheets are great for thinking. A flattened CSV in Sheets lets you slice, pivot, write a formula nobody sold you on, and ship a one-pager to a CFO who does not want to log into Looker Studio. The 2025 boom in vertical analytics tools made this worse, not better, because every tool has its own dashboard and none of them pivot across each other. CSV is the lingua franca that joins them.

Looker Studio, Whatagraph, Klipfolio, Power BI: all of them ingest CSV. Almost none of them play well with each other natively. Your analyst's Sheet ends up being the join layer.

CSV is also the only format every junior on your team understands without training. Per the RFC 4180 specification, CSV has been a formally documented standard since 2005, and "comma-separated values" predates JSON by roughly two decades.

A small thing that matters more than people admit: a CSV opens on a phone. A 50 MB JSON does not, at least not in any way you can read on the train.

Frequently asked questions

How do I convert nested JSON to CSV without coding?

Use a browser-based JSON to CSV converter that flattens nested objects with dot-notation and unwinds arrays into rows. Paste your API response, pick the flatten option, and download the CSV. No upload, no script, no Python install. For files under 5–10 MB the conversion finishes in under a second client-side. For larger files or recurring jobs, switch to a Python script using pandas.json_normalize().

Can I convert GA4 API JSON output directly to CSV?

Yes, but you have to flatten the rows[] array first because each row contains nested dimensionValues and metricValues arrays. The clean approach is to use record_path='rows' with pandas, or paste the response into a browser converter that supports array unwinding. The GA4 Data API returns up to 250,000 rows per request per Google's documentation, so paginate for larger queries.

What is the row limit for Search Console API CSV exports?

The Search Analytics API caps responses at 25,000 rows per query and 50,000 rows per day per site per search type, per Google's official documentation. To export everything for a large site, paginate using startRow in increments of 25,000 until you get an empty response, or set up the BigQuery bulk export Google launched in February 2023, which has no row cap.

Why does Excel break my phone numbers when I open a CSV?

Excel limits numeric precision to 15 digits and strips leading zeros from any column it auto-types as a number, per Microsoft's documentation. A phone number like 0207-123-4567 becomes 2.07E+12 the moment you double-click the file. Fix it by importing through Data > Get Data > From Text/CSV and forcing the column data type to Text before loading.

Is a browser-based JSON to CSV converter safe for customer data?

Yes, if the converter runs entirely client-side and explicitly does not upload your file. Tools like konklone.io state "Your data is never sent to our servers. The conversion is done inside your browser." Verify the same on any tool you use by checking the network tab in DevTools while you convert. If you see no outbound requests, the file stayed on your machine.

Should I convert OpenAI Batch API output to CSV before reviewing it?

Yes. OpenAI's Batch API returns JSONL where each line nests the model response four levels deep at response.body.choices[0].message.content. Pull that key path into a CSV column and you get a clean two-column file: your custom_id and the model output. The 50% Batch API discount only pays off if your team can actually read the results, so the conversion step is non-optional.

Pick the conversion path that matches your real workflow

If you are pulling API data weekly, write a 15-line Python script with pandas and stop thinking about it. If you are converting one file today and you do not know whether you will ever do it again, paste it into a browser converter and ship the CSV in 30 seconds. The decision is not technical, it is operational, and getting it wrong wastes more time than the conversion itself.

The deeper habit worth building: every time you hit a JSON-to-CSV problem, write down which API caused it, what shape it took, and which flatten strategy worked. After three months you will have a private cheat sheet that turns a recurring annoyance into a 10-second decision. That is what separates an operator who runs SEO data pipelines from one who fights them.

Nikhil Kumar is the solo founder of LandKit, the SEO and AI visibility growth OS that tracks brand mentions across ChatGPT, Claude, Gemini, and Perplexity. He writes about practical SEO, AEO, and GEO workflows for solo founders and lean growth teams. Connect with Nikhil on LinkedIn.