The response format is JSON API. It is a JSON object with:
data key, which contains the requested resourcesmeta key, which contains information about the responselinks key, which contains links for paginationincluded key, which contains data of related resourcesThe data key can contain a single resource or an array of resources.
Example:
{
"data": {},
"meta": {},
"links": {},
"included": {}
}
A resource is an object representing a single entity in the system. It is identified by its type and ID and contains attributes and relationships.
Attributes are the properties of a resource that are not relationships. They can be any valid JSON value.
Relationships are references to other resources that are associated with the current resource. By default, information about these relationships is not included.
{
"data": {
"id": "1",
"type": "tasks",
"attributes": {
"name": "Task 1",
"description": "This is a task",
"due_date": "2023-01-01"
},
"relationships": {
"creator": {
"meta": { "included": false },
},
"project": {
"meta": { "included": false },
},
"parent_task": {
"meta": { "included": false },
}
}
}
}
To include relationships in the response, you must pass an include query parameter which contains a comma-separated list of the desired related resources: ?include=creator,project.project_manager. This will:
relationships section of the resource.included section of the response.If requested resources does not exist, Unsupported Include error (with status 400) will be raised:
{
"errors": [
{
"status": 400,
"title": "Unsupported Include",
"detail": "Include 'userz' is not supported on this endpoint"
}
]
}
If include query parameter is not provided, the response will not include included section.
Example:
GET http://api.productive.io/api/v2/tasks?include=creator,project.project_manager
{
"data": {
"id": "1",
"type": "tasks",
"attributes": {
"name": "Task 1",
"description": "This is a task",
"due_date": "2023-01-01"
},
"relationships": {
"creator": {
"data": {
"id": "1",
"type": "people"
}
},
"project": {
"data": {
"id": "1",
"type": "projects"
}
},
"parent_task": {
"meta": { "included": false }
}
}
},
"included": [
{
"id": "1",
"type": "people",
"attributes": {
"name": "John Doe",
"email": "john@doe.com"
}
},
{
"id": "1",
"type": "projects",
"attributes": {
"name": "Project 1",
"description": "This is a project"
},
"relationships": {
"project_manager": {
"data": {
"id": "1",
"type": "people"
}
},
"workflow": {
"meta": { "included": false }
}
}
}
]
}
In the example above, the request asked for the creator and project.project_manager relationships. The included section contains just one "person" because the same person is the creator of the task and also the project_manager of the project and is only included once. Since parent_task was not requested, its data is not included.
Also note that to get the workflow relationship, the include query parameter must contain project.workflow, as workflow is a relationship of the project and not of the task.
To return a subset of fields of a resource in the response, you must pass an fields query parameter which contains an hash of resource types with a comma separated list of wanted fields: ?fields[people]=name,last,company.
The wanted fields can be any attribute or relationship of a resource.
Fields can also be attributes of a relationship resource, not just the main resource.
If requested field does not exist, backend will ignore that non-existing fields, but will work with others existing fields.
It can also be used with include query parameter.
For example:
GET http://api.productive.io/api/v2/tasks?fields[tasks]=title,creator&fields[people]=first_name,date&include=creator
results in:
{
"data": {
"id": "1",
"type": "tasks",
"attributes": {
"title": "Task 1"
},
"relationships": {
"creator": {
"data": {
"id": "1",
"type": "people"
}
}
}
},
"included": [
{
"id": "1",
"type": "people",
"attributes": {
"first_name": "John"
}
}
]
}
NOTE:
If include query contains a relationship that is not present in the fields query, the response will include the relationship in the included section, but you will not be able to link it to the right resource.