API Documentation
Resource Representation ¶
Response format
The response format is JSON API. It is a JSON object with:
-
a required
datakey, which contains the requested resources -
an optional
metakey, which contains information about the response -
an optional
linkskey, which contains links for pagination -
an optional
includedkey, 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
relationshipssection of the resource. -
Include the requested relationship data in the
includedsection 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 25 Oct 2025