Skip to main content

Live article:

  • FAQ
  • How to import a CSV as content entries in Storyblok?

With our Management API you can easily create new content entries and even component definitions. You can read CSV and push each line as a new entry. Below you can find a script that reads as CSV of Posts where each post consists of a title, path, text (multiline), and a category. The script below uses our Universal JS Client and Nodejs to create those entries. Also: you can create a folder in Storyblok to group them inside a Posts folder for example.

You can find the whole example on Github:

const fs = require('fs') 
const csvReader = require('fast-csv')
const StoryblokClient = require('storyblok-js-client')

// Initialize the client with the oauth token
const Storyblok = new StoryblokClient({
  oauthToken: 'YOUR_OAUTH_TOKEN' // can be found in your My account section

const config = {
  spaceId: 'YOUR_SPACE_ID', // can be found in the space settings.
  parentFolder: 'YOUR_NUMERIC_FOLDER_ID' // navigate into your folder and copy the id from the URL at <- last one 

let stream = fs.createReadStream('demo.csv')

csvReader.fromStream(stream, { headers: true, delimiter: ';' })
  .on('data', (line) => {
    // one line of csv in here
    let story = {
      slug: line.path,
      name: line.title,
      parent_id: config.parentFolder,
      content: {
        component: 'post',
        title: line.title,
        text: line.text,
        image: line.image,
        category: line.category
    }`spaces/${config.spaceId}/stories/`, {
    }).then(res => {
      console.log(`Success: ${} was created.`)
    }).catch(err => {
      console.log(`Error: ${err}`)
  .on('end', () => {
    // Done reading the CSV - now we finally create the component with a definition for each field
    // we can also skip that and define the content type using the interface at
    let component = {
      name: "post",
      display_name: "Post",
      schema: {
        title: {
          type: "text",
          pos: 0
        text: {
          type: "markdown",
          pos: 1
        image: {
          type: "image",
          pos: 2
        category: {
          type: "text",
          pos: 3
      is_root: true, // is content type
      is_nestable: false // is nestable (in another content type)
    }`spaces/${config.spaceId}/components/`, {
    }).then(res => {
      console.log(`Success: ${} was created.`)
    }).catch(err => {
      console.log(`Error: ${err}`)