API Documentation
Resource Representation ¶
Response format
The response format is JSON API. It is a JSON object with:
-
a required
data
key, which contains the requested resources -
an optional
meta
key, which contains information about the response -
an optional
links
key, which contains links for pagination -
an optional
included
key, which contains data of related resources
The data
key can contain a single resource or an array of resources.
Example:
{
"data": {},
"meta": {},
"links": {},
"included": {}
}
Resource
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
Attributes are the properties of a resource that are not relationships. They can be any valid JSON value.
Relationships
Relationships are references to other resources that are associated with the current resource. By default, information about these relationships is not included.
Example:
{
"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 },
}
}
}
}
Including relationships
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:
-
Include the identifier data (ID and type) to the
relationships
section of the resource. -
Include the requested relationship data in the
included
section of the response. -
If a dot notation is used, it will include the data of the related relationship as well.
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
.
Sparse fields
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.
Generated by aglio on 02 Aug 2025