API Documentation

API Endpoint

Widgets

Widgets

Supported filter params

  • dashboard_id (array)
GET /api/v2/widgets
Requestsreturns widgets

GET  /api/v2/widgets

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Responses200
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": [
    {
      "id": "1",
      "type": "widgets",
      "attributes": {
        "widget_type_id": 1,
        "default_filter_id": null,
        "width": 2,
        "height": 2,
        "row_position": 0,
        "column_position": 0,
        "report_layout_id": null
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 753
          }
        },
        "dashboard": {
          "data": {
            "type": "dashboards",
            "id": "19"
          }
        }
      }
    },
    {
      "id": "2",
      "type": "widgets",
      "attributes": {
        "widget_type_id": 1,
        "default_filter_id": null,
        "width": 2,
        "height": 2,
        "row_position": 0,
        "column_position": 0,
        "report_layout_id": null
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 753
          }
        },
        "dashboard": {
          "data": {
            "type": "dashboards",
            "id": "19"
          }
        }
      }
    },
    {
      "id": "3",
      "type": "widgets",
      "attributes": {
        "widget_type_id": 1,
        "default_filter_id": null,
        "width": 2,
        "height": 2,
        "row_position": 0,
        "column_position": 0,
        "report_layout_id": null
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 753
          }
        },
        "dashboard": {
          "data": {
            "type": "dashboards",
            "id": "19"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "19",
      "type": "dashboards",
      "attributes": {
        "name": "dashboard_name"
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 753
          }
        },
        "person": {
          "data": {
            "type": "people",
            "id": "2042"
          }
        }
      }
    },
    {
      "id": "2042",
      "type": "people",
      "attributes": {
        "first_name": "test first name",
        "last_name": "test last name",
        "email": "user1992@email.com",
        "title": null,
        "joined_at": "2020-10-21T01:06:55.000+02:00",
        "last_seen_at": "2020-10-21T01:06:55.898+02:00",
        "deactivated_at": null,
        "archived_at": null,
        "role_id": 1,
        "invited_at": null,
        "is_user": true,
        "tag_list": [],
        "avatar_url": null,
        "virtual": false,
        "custom_fields": null,
        "autotracking": false,
        "created_at": "2020-10-21T01:06:55.820+02:00",
        "placeholder": false,
        "color_id": null,
        "private_custom_reports_used": 0
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 753
          }
        },
        "company": {
          "data": {
            "type": "companies",
            "id": "2884"
          }
        },
        "subsidiary": {
          "data": null
        }
      }
    },
    {
      "id": "2884",
      "type": "companies",
      "attributes": {
        "name": "Organization753",
        "billing_name": null,
        "vat": null,
        "default_currency": "USD",
        "created_at": "2020-10-21T01:06:55.818+02:00",
        "archived_at": null,
        "avatar_url": null,
        "invoice_email_recipients": {},
        "custom_fields": null,
        "description": null,
        "due_days": null,
        "tag_list": [],
        "contact": {}
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 753
          }
        },
        "bill_to": {
          "data": null
        }
      }
    }
  ],
  "links": {
    "first": "http://www.example.com/api/v2/widgets?page%5Bnumber%5D=1&page%5Bsize%5D=30",
    "last": "http://www.example.com/api/v2/widgets?page%5Bnumber%5D=1&page%5Bsize%5D=30"
  },
  "meta": {
    "current_page": 1,
    "total_pages": 1,
    "total_count": 3,
    "page_size": 30,
    "max_page_size": 200,
    "organization_features": {
      "custom_fields": {
        "type": "metered",
        "limit": 15,
        "used": 0
      },
      "custom_fields_per_project": {
        "type": "metered",
        "limit": 10,
        "used": 0
      },
      "public_custom_reports": {
        "type": "metered",
        "limit": 30,
        "used": 0
      },
      "private_custom_reports": {
        "type": "metered",
        "limit": 30,
        "used": 0
      },
      "scheduling_placeholders": {
        "type": "metered",
        "limit": 5,
        "used": 0
      },
      "multigrouping": {
        "type": "switch",
        "available": true
      },
      "client_access_to_budgets": {
        "type": "switch",
        "available": true
      },
      "subsidiaries": {
        "type": "switch",
        "available": true
      },
      "time_approvals": {
        "type": "switch",
        "available": true
      },
      "expenses_approvals": {
        "type": "switch",
        "available": true
      },
      "timeoff_approvals": {
        "type": "switch",
        "available": true
      },
      "autotracking": {
        "type": "switch",
        "available": true
      },
      "forecasting": {
        "type": "switch",
        "available": true
      },
      "webhooks": {
        "type": "switch",
        "available": true
      },
      "table_pivoting": {
        "type": "switch",
        "available": true
      },
      "formula_fields": {
        "type": "switch",
        "available": true
      },
      "single_sign_on": {
        "type": "switch",
        "available": true
      },
      "duplicate_tasks": {
        "type": "switch",
        "available": true
      },
      "billable_time_rounding": {
        "type": "switch",
        "available": true
      },
      "payment_sync": {
        "type": "switch",
        "available": true
      },
      "booking_methods": {
        "type": "switch",
        "available": true
      },
      "import_tasks_csv": {
        "type": "switch",
        "available": true
      },
      "reactions": {
        "type": "switch",
        "available": true
      },
      "time_week_view": {
        "type": "switch",
        "available": true
      }
    }
  }
}

Get all widgets
GET/api/v2/widgets


GET /api/v2/widgets/4
Requestsreturns widget

GET  /api/v2/widgets/4

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Responses200
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "4",
    "type": "widgets",
    "attributes": {
      "widget_type_id": 1,
      "default_filter_id": null,
      "width": 2,
      "height": 2,
      "row_position": 0,
      "column_position": 0,
      "report_layout_id": null
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": 754
        }
      },
      "dashboard": {
        "data": {
          "type": "dashboards",
          "id": "20"
        }
      }
    }
  },
  "included": [
    {
      "id": "20",
      "type": "dashboards",
      "attributes": {
        "name": "dashboard_name"
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 754
          }
        },
        "person": {
          "data": {
            "type": "people",
            "id": "2043"
          }
        }
      }
    },
    {
      "id": "2043",
      "type": "people",
      "attributes": {
        "first_name": "test first name",
        "last_name": "test last name",
        "email": "user1993@email.com",
        "title": null,
        "joined_at": "2020-10-21T01:06:56.000+02:00",
        "last_seen_at": "2020-10-21T01:06:56.066+02:00",
        "deactivated_at": null,
        "archived_at": null,
        "role_id": 1,
        "invited_at": null,
        "is_user": true,
        "tag_list": [],
        "avatar_url": null,
        "virtual": false,
        "custom_fields": null,
        "autotracking": false,
        "created_at": "2020-10-21T01:06:56.007+02:00",
        "placeholder": false,
        "color_id": null,
        "private_custom_reports_used": 0
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 754
          }
        },
        "company": {
          "data": {
            "type": "companies",
            "id": "2885"
          }
        },
        "subsidiary": {
          "data": null
        }
      }
    },
    {
      "id": "2885",
      "type": "companies",
      "attributes": {
        "name": "Organization754",
        "billing_name": null,
        "vat": null,
        "default_currency": "USD",
        "created_at": "2020-10-21T01:06:56.005+02:00",
        "archived_at": null,
        "avatar_url": null,
        "invoice_email_recipients": {},
        "custom_fields": null,
        "description": null,
        "due_days": null,
        "tag_list": [],
        "contact": {}
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 754
          }
        },
        "bill_to": {
          "data": null
        }
      }
    }
  ],
  "meta": {
    "organization_features": {
      "custom_fields": {
        "type": "metered",
        "limit": 15,
        "used": 0
      },
      "custom_fields_per_project": {
        "type": "metered",
        "limit": 10,
        "used": 0
      },
      "public_custom_reports": {
        "type": "metered",
        "limit": 30,
        "used": 0
      },
      "private_custom_reports": {
        "type": "metered",
        "limit": 30,
        "used": 0
      },
      "scheduling_placeholders": {
        "type": "metered",
        "limit": 5,
        "used": 0
      },
      "multigrouping": {
        "type": "switch",
        "available": true
      },
      "client_access_to_budgets": {
        "type": "switch",
        "available": true
      },
      "subsidiaries": {
        "type": "switch",
        "available": true
      },
      "time_approvals": {
        "type": "switch",
        "available": true
      },
      "expenses_approvals": {
        "type": "switch",
        "available": true
      },
      "timeoff_approvals": {
        "type": "switch",
        "available": true
      },
      "autotracking": {
        "type": "switch",
        "available": true
      },
      "forecasting": {
        "type": "switch",
        "available": true
      },
      "webhooks": {
        "type": "switch",
        "available": true
      },
      "table_pivoting": {
        "type": "switch",
        "available": true
      },
      "formula_fields": {
        "type": "switch",
        "available": true
      },
      "single_sign_on": {
        "type": "switch",
        "available": true
      },
      "duplicate_tasks": {
        "type": "switch",
        "available": true
      },
      "billable_time_rounding": {
        "type": "switch",
        "available": true
      },
      "payment_sync": {
        "type": "switch",
        "available": true
      },
      "booking_methods": {
        "type": "switch",
        "available": true
      },
      "import_tasks_csv": {
        "type": "switch",
        "available": true
      },
      "reactions": {
        "type": "switch",
        "available": true
      },
      "time_week_view": {
        "type": "switch",
        "available": true
      }
    }
  }
}

Get a widget
GET/api/v2/widgets/{id}

URI Parameters
HideShow
id
number (required) Example: 4

POST /api/v2/widgets
Requestscreates a widgetcreates a widgetreturns error

POST  /api/v2/widgets

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "data": {
    "type": "widgets",
    "attributes": {
      "width": 2,
      "height": 2,
      "row_position": 2,
      "column_position": 2,
      "widget_type_id": 1
    },
    "relationships": {
      "dashboard": {
        "data": {
          "type": "dashboards",
          "id": "21"
        }
      }
    }
  }
}
Responses201
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "6",
    "type": "widgets",
    "attributes": {
      "widget_type_id": 1,
      "default_filter_id": null,
      "width": 2,
      "height": 2,
      "row_position": 2,
      "column_position": 2,
      "report_layout_id": null
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": 755
        }
      },
      "dashboard": {
        "data": {
          "type": "dashboards",
          "id": "21"
        }
      }
    }
  },
  "included": [
    {
      "id": "21",
      "type": "dashboards",
      "attributes": {
        "name": "dashboard_name"
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 755
          }
        },
        "person": {
          "data": {
            "type": "people",
            "id": "2044"
          }
        }
      }
    },
    {
      "id": "2044",
      "type": "people",
      "attributes": {
        "first_name": "test first name",
        "last_name": "test last name",
        "email": "user1994@email.com",
        "title": null,
        "joined_at": "2020-10-21T01:06:56.000+02:00",
        "last_seen_at": "2020-10-21T01:06:56.220+02:00",
        "deactivated_at": null,
        "archived_at": null,
        "role_id": 1,
        "invited_at": null,
        "is_user": true,
        "tag_list": [],
        "avatar_url": null,
        "virtual": false,
        "custom_fields": null,
        "autotracking": false,
        "created_at": "2020-10-21T01:06:56.167+02:00",
        "placeholder": false,
        "color_id": null,
        "private_custom_reports_used": 0
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 755
          }
        },
        "company": {
          "data": {
            "type": "companies",
            "id": "2886"
          }
        },
        "subsidiary": {
          "data": null
        }
      }
    },
    {
      "id": "2886",
      "type": "companies",
      "attributes": {
        "name": "Organization755",
        "billing_name": null,
        "vat": null,
        "default_currency": "USD",
        "created_at": "2020-10-21T01:06:56.165+02:00",
        "archived_at": null,
        "avatar_url": null,
        "invoice_email_recipients": {},
        "custom_fields": null,
        "description": null,
        "due_days": null,
        "tag_list": [],
        "contact": {}
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 755
          }
        },
        "bill_to": {
          "data": null
        }
      }
    }
  ],
  "meta": {
    "organization_features": {
      "custom_fields": {
        "type": "metered",
        "limit": 15,
        "used": 0
      },
      "custom_fields_per_project": {
        "type": "metered",
        "limit": 10,
        "used": 0
      },
      "public_custom_reports": {
        "type": "metered",
        "limit": 30,
        "used": 0
      },
      "private_custom_reports": {
        "type": "metered",
        "limit": 30,
        "used": 0
      },
      "scheduling_placeholders": {
        "type": "metered",
        "limit": 5,
        "used": 0
      },
      "multigrouping": {
        "type": "switch",
        "available": true
      },
      "client_access_to_budgets": {
        "type": "switch",
        "available": true
      },
      "subsidiaries": {
        "type": "switch",
        "available": true
      },
      "time_approvals": {
        "type": "switch",
        "available": true
      },
      "expenses_approvals": {
        "type": "switch",
        "available": true
      },
      "timeoff_approvals": {
        "type": "switch",
        "available": true
      },
      "autotracking": {
        "type": "switch",
        "available": true
      },
      "forecasting": {
        "type": "switch",
        "available": true
      },
      "webhooks": {
        "type": "switch",
        "available": true
      },
      "table_pivoting": {
        "type": "switch",
        "available": true
      },
      "formula_fields": {
        "type": "switch",
        "available": true
      },
      "single_sign_on": {
        "type": "switch",
        "available": true
      },
      "duplicate_tasks": {
        "type": "switch",
        "available": true
      },
      "billable_time_rounding": {
        "type": "switch",
        "available": true
      },
      "payment_sync": {
        "type": "switch",
        "available": true
      },
      "booking_methods": {
        "type": "switch",
        "available": true
      },
      "import_tasks_csv": {
        "type": "switch",
        "available": true
      },
      "reactions": {
        "type": "switch",
        "available": true
      },
      "time_week_view": {
        "type": "switch",
        "available": true
      }
    }
  }
}

POST  /api/v2/widgets

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "data": {
    "type": "widgets",
    "attributes": {
      "width": 2,
      "height": 2,
      "row_position": 2,
      "column_position": 2,
      "widget_type_id": 1
    },
    "relationships": {
      "dashboard": {
        "data": {
          "type": "dashboards",
          "id": "0"
        }
      }
    }
  }
}
Responses422
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "errors": [
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "attribute is invalid",
      "source": {
        "pointer": "data/attributes/dashboard"
      }
    }
  ]
}

POST  /api/v2/widgets

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "type": "widgets",
  "attributes": {
    "width": "",
    "height": ""
  }
}
Responses422
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "errors": [
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "can't be blank",
      "source": {
        "pointer": "data/attributes/height"
      }
    },
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "is not a number",
      "source": {
        "pointer": "data/attributes/height"
      }
    },
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "can't be blank",
      "source": {
        "pointer": "data/attributes/width"
      }
    },
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "is not a number",
      "source": {
        "pointer": "data/attributes/width"
      }
    },
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "can't be blank",
      "source": {
        "pointer": "data/attributes/widget_type"
      }
    },
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "can't be blank",
      "source": {
        "pointer": "data/attributes/dashboard"
      }
    }
  ]
}

Create a widget
POST/api/v2/widgets

URI Parameters
HideShow
column
number (required) Example: 1

column

row
number (required) Example: 1

row

height
number (required) Example: 1

height

width
number (required) Example: 1

width

widget_type_id
number (required) Example: 1

widget type id

dashboard_id
number (required) Example: 1

dashboard id


PATCH /api/v2/widgets/1
Requestsupdates widgetreturns error

PATCH  /api/v2/widgets/9

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "data": {
    "type": "widgets",
    "attributes": {
      "row_position": 5
    }
  }
}
Responses200
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "9",
    "type": "widgets",
    "attributes": {
      "widget_type_id": 1,
      "default_filter_id": null,
      "width": 2,
      "height": 2,
      "row_position": 5,
      "column_position": 0,
      "report_layout_id": null
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": 758
        }
      },
      "dashboard": {
        "data": {
          "type": "dashboards",
          "id": "24"
        }
      }
    }
  },
  "included": [
    {
      "id": "24",
      "type": "dashboards",
      "attributes": {
        "name": "dashboard_name"
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 758
          }
        },
        "person": {
          "data": {
            "type": "people",
            "id": "2047"
          }
        }
      }
    },
    {
      "id": "2047",
      "type": "people",
      "attributes": {
        "first_name": "test first name",
        "last_name": "test last name",
        "email": "user1997@email.com",
        "title": null,
        "joined_at": "2020-10-21T01:06:56.000+02:00",
        "last_seen_at": "2020-10-21T01:06:56.612+02:00",
        "deactivated_at": null,
        "archived_at": null,
        "role_id": 1,
        "invited_at": null,
        "is_user": true,
        "tag_list": [],
        "avatar_url": null,
        "virtual": false,
        "custom_fields": null,
        "autotracking": false,
        "created_at": "2020-10-21T01:06:56.561+02:00",
        "placeholder": false,
        "color_id": null,
        "private_custom_reports_used": 0
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 758
          }
        },
        "company": {
          "data": {
            "type": "companies",
            "id": "2889"
          }
        },
        "subsidiary": {
          "data": null
        }
      }
    },
    {
      "id": "2889",
      "type": "companies",
      "attributes": {
        "name": "Organization758",
        "billing_name": null,
        "vat": null,
        "default_currency": "USD",
        "created_at": "2020-10-21T01:06:56.559+02:00",
        "archived_at": null,
        "avatar_url": null,
        "invoice_email_recipients": {},
        "custom_fields": null,
        "description": null,
        "due_days": null,
        "tag_list": [],
        "contact": {}
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": 758
          }
        },
        "bill_to": {
          "data": null
        }
      }
    }
  ],
  "meta": {
    "organization_features": {
      "custom_fields": {
        "type": "metered",
        "limit": 15,
        "used": 0
      },
      "custom_fields_per_project": {
        "type": "metered",
        "limit": 10,
        "used": 0
      },
      "public_custom_reports": {
        "type": "metered",
        "limit": 30,
        "used": 0
      },
      "private_custom_reports": {
        "type": "metered",
        "limit": 30,
        "used": 0
      },
      "scheduling_placeholders": {
        "type": "metered",
        "limit": 5,
        "used": 0
      },
      "multigrouping": {
        "type": "switch",
        "available": true
      },
      "client_access_to_budgets": {
        "type": "switch",
        "available": true
      },
      "subsidiaries": {
        "type": "switch",
        "available": true
      },
      "time_approvals": {
        "type": "switch",
        "available": true
      },
      "expenses_approvals": {
        "type": "switch",
        "available": true
      },
      "timeoff_approvals": {
        "type": "switch",
        "available": true
      },
      "autotracking": {
        "type": "switch",
        "available": true
      },
      "forecasting": {
        "type": "switch",
        "available": true
      },
      "webhooks": {
        "type": "switch",
        "available": true
      },
      "table_pivoting": {
        "type": "switch",
        "available": true
      },
      "formula_fields": {
        "type": "switch",
        "available": true
      },
      "single_sign_on": {
        "type": "switch",
        "available": true
      },
      "duplicate_tasks": {
        "type": "switch",
        "available": true
      },
      "billable_time_rounding": {
        "type": "switch",
        "available": true
      },
      "payment_sync": {
        "type": "switch",
        "available": true
      },
      "booking_methods": {
        "type": "switch",
        "available": true
      },
      "import_tasks_csv": {
        "type": "switch",
        "available": true
      },
      "reactions": {
        "type": "switch",
        "available": true
      },
      "time_week_view": {
        "type": "switch",
        "available": true
      }
    }
  }
}

PATCH  /api/v2/widgets/10

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "data": {
    "type": "widgets",
    "attributes": {
      "row_position": ""
    }
  }
}
Responses422
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "errors": [
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "can't be blank",
      "source": {
        "pointer": "data/attributes/row_position"
      }
    }
  ]
}

Update a widget
PATCH/api/v2/widgets/{id}

URI Parameters
HideShow
id
number (required) Example: 1

widget id


DELETE /api/v2/widgets/1
Requestsdeletes widget

DELETE  /api/v2/widgets/11

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Responses204
This response has no content.

Deletes a widget
DELETE/api/v2/widgets/{id}

URI Parameters
HideShow
id
number (required) Example: 1

widget id


Generated by aglio on 20 Oct 2020