Search code examples
javascriptjqueryrestasynchronoustodoist

How to create todoist task using todoist api v7?


I'm trying to create a task in todoist but cant seem to do so

According to this todoist documentation, the below should work for creating a todoist task

$ curl https://todoist.com/api/v7/sync \
    -d token=0123456789abcdef0123456789abcdef01234567 \
    -d sync_token="VRyFHr0Qo3Hr--pzINyT6nax4vW7X2YG5RQlw3lB-6eYOPbSZVJepa62EVhO" \
    -d resource_types='["projects", "items"]' \
    -d commands='[
        { "type": "item_add",
          "temp_id": "fdef5d16-a40a-475e-bd4a-0ccbd6fd8c3f",
          "uuid": "a3aa2f44-23b4-4986-b513-ef7663bbb752",
          "args": { "project_id": "24a193a7-46f7-4314-b984-27b707bd2331", "content": "Task1" } },
        { "type": "item_add",
          "temp_id": "6f5e0b50-af7a-4133-bfc0-e8c041b819d2",
          "uuid": "d16ad84a-e10b-4894-af7d-93ba6adf7a1e",
          "args": { "project_id": 176637191, "content": "Task2" } },
      ]'

I've tried the following with little luck

commands = [{"type": "item_add", "uuid": "a3aa2f44-23b4-4986-b513-ef7663bbb752", "args": {"project_id": 2159935681,"content":"Test Task"}}]
$.ajax({
      type: "GET",
      url: 'https://en.todoist.com/api/v7/sync/',
      dataType: 'json',
      async: false,
      data: {
        'token': todoist_api_token,
        'sync_token':'*',
        'resource_types':'["projects", "items"]',
        'commands':commands
      }
    })

I've also tried the following:

commands = [{"type": "item_add", "uuid": "a3aa2f44-23b4-4986-b513-ef7663bbb752", "args": {"project_id": 2159935681,"content":"Test Task"}}]
$.ajax({
      type: "POST",
      url: 'https://en.todoist.com/api/v7/sync/',
      dataType: 'json',
      async: false,
      data: {
        'token': todoist_api_token,
        'sync_token':'*',
        'resource_types':'["projects", "items"]',
        'commands':commands
      }
    })

This results in the following error:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://en.todoist.com/api/v7/sync/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

I've also tried removing the project id

commands = [{"type": "item_add", "uuid": "a3aa2f44-23b4-4986-b513-ef7663bbb752", "args": {"content":"Test Task"}}]
$.ajax({
      type: "GET",
      url: 'https://en.todoist.com/api/v7/sync/',
      dataType: 'json',
      async: false,
      data: {
        'token': todoist_api_token,
        'sync_token':'*',
        'resource_types':'["items"]',
        'commands':commands
      }
    })

I've also tried adding the temp_id parameter:

commands = [{"type": "item_add","temp_id": "fdef5d16-a40a-475e-bd4a-0ccbd6fd8c3f", "uuid": "a3aa2f44-23b4-4986-b513-ef7663bbb752", "args": {"project_id": 2159896038,"content":"Test Task"}}]
$.ajax({
      type: "POST",
      url: 'https://en.todoist.com/api/v7/sync/',
      dataType: 'json',
      async: false,
      data: {
        'token': todoist_api_token,
        'sync_token':'*',
        'resource_types':'["projects", "items"]',
        'commands':commands
      }
    })

I've even tried the todoist api v8 version following the todoist instrucitons for the v8 api here

$.ajax({type: "POST",
    url: 'https://beta.todoist.com/API/v8/tasks',
    dataType: 'json',
    async: false,
    data: {'token':todoist_api_token,'content': 'Appointment with Maria'}
    });

This returns "Bad Request"

I did find that the following works for v6:

$.ajax({type: "POST",
    url: 'https://todoist.com/API/v6/add_item',
    dataType: 'json',
    async: false,
    data: {'token':todoist_api_token,'content': 'Appointment with Maria'}
    });

Solution

  • sync_token

    In the first example I see that the sync token is set. It should be var sync_token = '*' and after the ajax request you should save the token with sync_token = response.sync_token; I see that you realized that in the later examples.

    commands

    The rest looks good but I can't see your commands and I guess the problem comes from there. The commands object has to be stringified with JSON.stringify(commands).

    working example

    I created a working example below. You have to replace the todoist_api_token = "" with your token and the project id's in the example task.

    // Global variables
    	
    var todoist_api_token = ""; // Put your token here
    var sync_token = "*";
    
    // To get a project id: clicke on a project and look at the url.
    // In the example "#project%2F2179064046" you have to remove "#project%2F".
    // and the project id is 2179064046
    
    // Run example task after document load
    
    window.onload = function() {
    	
    	console.log("Add example task to todoist");
      
    	var example_tasks = [
        {"content": "Task1", "project_id": 2179064046},
        {"content": "Task2", "project_id": 2179064046}
      ];
      
    	todoist_add_tasks_ajax(example_tasks);
    	
    }
    
    // Functions
    
    todoist_add_tasks_ajax = function(tasks) {
    		
    	var commands = todoist_tasks_to_commands(tasks);
    	
    	var data = {
    		"token" : todoist_api_token,
    		'sync_token' : sync_token,
    		'resource_types' : '["projects", "items"]',
    		'commands' : commands
    	};
    	
    	jQuery.ajax({
    		url: "https://todoist.com/api/v7/sync",
    		data: data,
    		type: "POST",
    		dataType: "json",
    		success: function(response) {
    			console.log(response);
    			sync_token = response.sync_token;
    		},
    		error: function(response) { 
    			console.log(response);
    		},
    	});
    	
    }
    
    todoist_tasks_to_commands = function(tasks) {
    	
    	var commands = [];
    	
    	tasks.forEach(function(args) {
    		
    		var temp_commands = {
    			"type": "item_add",
    			"temp_id": create_guid(),
    			"uuid": create_guid(),
    			"args": args
    		};
    
    		commands.push(temp_commands)
    
    	});
    	
    	commands = JSON.stringify(commands);
    	
    	return commands;
    	
    }
    
    function create_guid() {
      function s4() {
        return Math.floor((1 + Math.random()) * 0x10000)
          .toString(16)
          .substring(1);
      }
      return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
        s4() + '-' + s4() + s4() + s4();
    }
    
    /*
    
    // Install jQuery
    
    javascript: (function(e, s) {
        e.src = s;
        e.onload = function() {
            jQuery.noConflict();
            console.log("jQuery installed");
        };
        document.head.appendChild(e);
    })( document.createElement('script'), 'http://code.jquery.com/jquery-latest.min.js')
    
    */
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">