Аутентификация

Для использования REST API в каждом запросе необходимо передавать HTTP-заголовок с ключом:

'Devprom-Auth-Key': 'a806f6e2af139ea856db981c20278865'

Для получения ключа необходимо перейти в настройки пользователя:

Примеры использования

Из консоли

# curl -X POST -H "Devprom-Auth-Key: a806f6e2af139ea856db981c20278865" -H "Content-Type:application/json" https://demo.myalm.ru/pm/support/api/v1/issues -d '{"Caption":"test123"}'

Под Windows:

# curl -X POST -H "Devprom-Auth-Key: a806f6e2af139ea856db981c20278865" -H "Content-Type:application/json" https://demo.myalm.ru/pm/support/api/v1/issues -d "{\"Caption\":\"test123\"}"

JavaScript

Если вы хотите отправлять заявки пользователей при помощи собственной Web-формы, то вам пригодится следующий пример, который отправляет тестовую заявку в проект поддержки. Перед использованием этого примера вам необходимо:

  1. Создать проект поддержки (или использовать любой существующий проект), из адресной строки браузера скопировать путь к разделам проекта, например, https://demo.myalm.ru/pm/support
  2. Получить ключ для использования API, позволяющий только сохранять заявки, но не разрешающий читать остальные заявки. Для этого нужно перейти по ссылке аналогичной для вашего проекта, например, https://demo.myalm.ru/pm/support/api/key-writeonly Полученный ключ необходимо подставить в заголовок Devprom-Auth-Key.
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <script src="https://code.jquery.com/jquery-1.11.3.min.js" type="text/javascript"></script>
 </head>
 <body>
 <script type="text/javascript">
     $(document).ready(function() {
         $.ajax({
             dataType: 'json',
             type: 'POST',
             url: 'https://demo.myalm.ru/pm/support/api/latest/issues',
             data: JSON.stringify({
                 'Caption':'Test',
                 'Author': 'somebody@mail.ru'
             }),
             headers: {
                 'Devprom-Auth-Key': 'a806f6e2af139ea856db981c20278865',
             },
             success: function(data) {
                 $('body').append('div').html('Issue id = ' + data.Id);
             }
         });
     });
 </script>
 </body>
 </html>

PHP

<?php
 $appUrl = 'https://demo.myalm.ru';
 $projectCode = 'kanban';
 $authKey = '974ccef5dd367cc448b8c1d1a9bdb2fd';
 
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
 curl_setopt($curl, CURLOPT_HEADER, false);
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($curl, CURLOPT_TIMEOUT, 60);
 curl_setopt($curl, CURLOPT_HTTPHEADER,
 	array(
 		"Content-Type: application/json",
 		"Devprom-Auth-Key: ".$authKey
 	)
 );
 
 // get all issues
 curl_setopt($curl, CURLOPT_URL, $appUrl.'/pm/'.$projectCode.'/api/latest/issues');
 curl_setopt($curl, CURLOPT_HTTPGET, true);
 $result = curl_exec($curl);
 var_export(json_decode($result, true));
 
 // create a new issue
 curl_setopt($curl, CURLOPT_URL, $appUrl.'/pm/'.$projectCode.'/api/latest/issues');
 curl_setopt($curl, CURLOPT_POST, true);
 curl_setopt($curl, CURLOPT_HTTPGET, false);
 curl_setopt($curl, CURLOPT_POSTFIELDS, 
 	json_encode(
 		array(
 			'Caption' => 'Issue title',
 			'Description' => 'Issue description'
 		)
 	)
 );
 $result = curl_exec($curl);
 var_export(json_decode($result, true));
 
 curl_close($curl);

C#

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Net;
 using System.IO;
 using System.Web.Script.Serialization;
 
 class DevpromRestService
 {
 	public void updateIssue()
 	{
 		// Получим список пожеланий в проекте
 		List<Issue> wasIssues = new JavaScriptSerializer().Deserialize<List<Issue>>(
 				makeRequest("GET", "issues")
 		);
 		
 		// Создаем новое пожелание
 		Issue newIssue = new JavaScriptSerializer().Deserialize<Issue>(
 				makeRequest("POST", "issues", new JavaScriptSerializer().Serialize(
 						new Issue
 						{
 							Caption = "Название нового пожелания",
 							Description = "Описание нового пожелания",
 							Priority = "2"
 						}
 				))
 		);
 
 		// Редактируем ранее созданное пожелание
 		makeRequest("PUT", "issues/" + newIssue.Id, new JavaScriptSerializer().Serialize(
 				new Issue
 				{
 					Description = "Изменненное название пожелания",
 					Priority = "1"
 				}
 		));
 
 		// Удалим созданное пожелание
 		makeRequest("DELETE", "issues/" + newIssue.Id);
 	}
 
 	public string makeRequest(string method, string route, string data = "")
 	{
 		HttpWebRequest request = (HttpWebRequest) WebRequest.Create(
 				TestHelper.appHostUrl + "/pm/<project-code>/api/v1/" + route
 		);
 
 		request.Method = method;
 
 		request.ContentLength = 0;
 		request.ContentType = "application/json";
 
 		request.Headers.Add(
 				"Authorization", 
 				"Basic " + Convert.ToBase64String(
 								Encoding.ASCII.GetBytes(
 										<логин-пользователя> + ":" + <пароль-пользователя>
 								)
 						   )
 		);
 
 		var bytes = Encoding.GetEncoding("windows-1251").GetBytes(data);
 
 		request.ContentLength = bytes.Length;
 
 		if (!String.IsNullOrEmpty(data))
 		{
 			using (var writeStream = request.GetRequestStream())
 			{
 				writeStream.Write(bytes, 0, bytes.Length);
 			}
 		}
 
 		HttpWebResponse response = (HttpWebResponse) request.GetResponse();
 		
 		if (response.StatusCode != HttpStatusCode.OK)
 		{
 			throw new ApplicationException(
 					String.Format("Request failed. Received HTTP {0}", response.StatusCode)
 			);
 		}
 
 		return (new StreamReader(response.GetResponseStream(), Encoding.UTF8)).ReadToEnd();
 	}
 }

Сущности

/*
 * Общие фильтры, который можно использовать для любой сущности
 * Filters:
 *    state - получить записи со статусами, системные имена которых перечислены через запятую, например, /pm/my/api/latest/issues?state=planned
 *    in - получить записи с идентификаторами, перечисленными через запятую, например, /pm/my/api/latest/issues?in=1,2,3
 *    updatedAfter - получить записи измененные после updatedAfter (формат: YYYY-MM-DD HH:MM:SS, временная зона UTC+0)
 *    updatedBefore - получить записи измененные до updatedBefore (формат: YYYY-MM-DD HH:MM:SS, временная зона UTC+0)
 *    createdAfter - получить записи созданные после createdAfter (формат: YYYY-MM-DD HH:MM:SS, временная зона UTC+0)
 *    createdBefore - получить записи созданные до createdBefore (формат: YYYY-MM-DD HH:MM:SS, временная зона UTC+0)
 *    extended - преобразовать ссылки в json-объекты, например, чтобы узнать Email автора пожелания
 */
 
 /* 
  * Routes: /pm/<project-code>/api/latest/issues, /pm/<project-code>/api/latest/issues/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  * Filters: 
  *    executor - email пользователя, на которого назначены пожелания или iam для фильтрации по авторизованному пользователю, например, /pm/my/api/latest/issues?executor=iam
  */
 public class Issue
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Название пожелания */
 	public string Caption;
 	/* Описание пожелания */
 	public string Description;
 	/* Идентификатор типа пожелания */
 	public string Type;
 	/* Приоритет пожелания {1,2,3,4,5} */
 	public string Priority;
 	/* Оценка трудоемкости */
 	public string Estimation;
 	/* Идентификатор функции */
 	public string Function;
 	/* Исполнитель пожелания (при отключенных задачах), идентификатор пользователя в системе */
 	public string Owner;
 	/* Идентификатор релиза */
 	public string PlannedRelease;
 	/* Автор пожелания, идентификатор пользователя в системе */
 	public string Author;
 	/* Дата начала работы над пожеланием [YYYY-MM-DD hh:mm:ss] */
 	public string StartDate;
 	/* Дата окончания работы над пожеланием [YYYY-MM-DD hh:mm:ss] */
 	public string FinishDate;
 	/* Номер версии, в которой обнаружена ошибка */
 	public string SubmittedVersion;
 	/* Номер версии, в которой выполнено пожелание */
 	public string ClosedInVersion;
 	/* Порядковый номер пожелания */
 	public string OrderNum;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 	/* Ссылочное имя состояния, в котором находится пожелание (readonly) */
 	public string State;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/issues/{issue-id}/attachments, /pm/<project-code>/api/latest/issues/{issue-id}/attachments/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class IssueAttachment
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* MIME-тип приложения */
 	public string FileMime;
 	/* Имя файла приложения */
 	public string FileExt;
 	/* Содержимое файла в кодировке Base64 */
 	public string File;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/issues/{issue-id}/comments, /pm/<project-code>/api/latest/issues/{issue-id}/comments/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class IssueComment
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Текст комментария */
 	public string Caption;
 	/* Ид пользователя, автора комментария */
 	public string AuthorId;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/issues/{issue-id}/hours, /pm/<project-code>/api/latest/issues/{issue-id}/hours/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class IssueHour
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Пояснения к списанному времени */
 	public string Description;
 	/* Ид пожелания, по которому списано время */
 	public string Task;
 	/* Дата, к которой относится списанное время */
 	public string ReportDate;
 	/* Количество списанных часов */
 	public string Capacity;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/features, /pm/<project-code>/api/latest/features/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class Feature
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Название функции */
 	public string Caption;
 	/* Описание функции */
 	public string Description;
 	/* Важность функции */
 	public string Importance;
 	/* Тип (уровень) функции */
 	public string Type;
 	/* Дата начала работы над реализацией функции (только чтение) [YYYY-MM-DD hh:mm:ss] */
 	public string StartDate;
 	/* Оценка даты окончания реализации функции (только чтение) [YYYY-MM-DD hh:mm:ss] */
 	public string DeliveryDate;
 	/* Порядковый номер функции */
 	public string OrderNum;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 	/* Родительская функция */
 	public string ParentFeature;
 	/* Дочерние функции */
 	public string Children;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/tasks, /pm/<project-code>/api/latest/tasks/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  * Filters: 
  *    executor - email пользователя, на которого назначены пожелания или iam для фильтрации по авторизованному пользователю, например, /pm/my/api/latest/issues?executor=iam
  */
 public class Task
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Краткое описание задачи */
 	public string Caption;
 	/* Идентификатор итерации */
 	public string Release;
 	/* Идентификатор связанного пожелания */
 	public string ChangeRequest;
 	/* Идентификатор типа задачи */
 	public string TaskType;
 	/* Приоритет пожелания {1,...} */
 	public string Priority;
 	/* Плановая трудоемкость, ч. */
 	public string Planned;
 	/* Фактическая трудоемкость, ч. */
 	public string Fact;
 	/* Оставшаяся трудоемкость, ч. */
 	public string LeftWork;
 	/* Исполнитель задачи, идентификатор пользователя в системе */
 	public string Assignee;
 	/* Дата начала работы над задачей [YYYY-MM-DD hh:mm:ss] */
 	public string StartDate;
 	/* Дата окончания работы над задачей [YYYY-MM-DD hh:mm:ss] */
 	public string FinishDate;
 	/* Порядковый номер задачи */
 	public string OrderNum;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 	/* Ссылочное имя состояния, в котором находится задача (readonly) */
 	public string State;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/tasks/{task-id}/attachments, /pm/<project-code>/api/latest/tasks/{task-id}/attachments/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class TaskAttachment
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* MIME-тип приложения */
 	public string FileMime;
 	/* Имя файла приложения */
 	public string FileExt;
 	/* Содержимое файла в кодировке Base64 */
 	public string File;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/tasks/{task-id}/comments, /pm/<project-code>/api/latest/tasks/{task-id}/comments/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class TaskComment
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Текст комментария */
 	public string Caption;
 	/* Ид пользователя, автора комментария */
 	public string AuthorId;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/tasks/{task-id}/hours, /pm/<project-code>/api/latest/tasks/{task-id}/hours/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class TaskHour
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Пояснения к списанному времени */
 	public string Description;
 	/* Ид задачи, по которой списано время */
 	public string Task;
 	/* Дата, к которой относится списанное время */
 	public string ReportDate;
 	/* Количество списанных часов */
 	public string Capacity;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/builds, /pm/<project-code>/api/latest/builds/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class Build
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Номер версии сборки */
 	public string Caption;
 	/* Описание сборки */
 	public string Description;
 	/* Состояние сборки {inprogress,ready,failed,deployed} */
 	public string State;
 	/* Идентификатор релиза */
 	public string Release;
 	/* Номер коммита для автоматического обновления поля "Выполнено в версии" у пожеланий */
 	public string BuildRevision;
 	/* Название приложения, к которому относится сборка */
 	public string Application;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Route: /pm/<project-code>/api/latest/iterations, /pm/<project-code>/api/latest/iterations/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  * Filters: 
  *     filter - укажите current чтобы получить текущие итерации
  */
 public class Iteration
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Номер итерации */
 	public string ReleaseNumber;
 	/* Принадлежность к релизу */
 	public string Version;
 	/* Скорость итерации (readonly) */
 	public string Velocity;
 	/* Плановая дата начала итерации [YYYY-MM-DD hh:mm:ss] */
 	public string StartDate;
 	/* Плановая дата окончания итерации [YYYY-MM-DD hh:mm:ss] */
 	public string FinishDate;
 	/* Оценка даты начала итерации [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string EstimatedStartDate;
 	/* Оценка даты окончания итерации [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string EstimatedFinishDate;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Route: /pm/<project-code>/api/latest/releases, /pm/<project-code>/api/latest/releases/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class Release
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Номер релиза */
 	public string Caption;
 	/* Описание релиза */
 	public string Description;
 	/* Начальная скорость релиза */
 	public string InitialVelocity;
 	/* Скорость релиза (readonly) */
 	public string Velocity;
 	/* Плановая дата начала итерации [YYYY-MM-DD hh:mm:ss] */
 	public string StartDate;
 	/* Плановая дата окончания итерации [YYYY-MM-DD hh:mm:ss] */
 	public string FinishDate;
 	/* Оценка даты начала итерации [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string EstimatedStartDate;
 	/* Оценка даты окончания итерации [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string EstimatedFinishDate;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/changes?class={classes}&date={YYYY-MM-DD}&granularity={day|hour}, /pm/<project-code>/api/latest/changes/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  * Filters: 
  *     class - получить изменения по сущностям, классы которых перечислены через запятую в строке classes,
  *     date - получить изменения на дату,
  *     granularity - получить изменения с указанной гранулярностью
  */
 public class Change
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Вид изменения: added, modified, deleted, commented */
 	public string ChangeKind;
 	/* Название измененного объекта */
 	public string Caption;
 	/* Идентификатор измененного объекта */
 	public string ObjectId;
 	/* Название класса измененного объекта */
 	public string ClassName;
 	/* Список изменившихся атрибутов через запятую */
 	public string Attributes;
 	/* Содержание изменения в виде текстового описания*/
 	public string Content;
 	/* Автор изменения, идентификатор пользователя в системе */
 	public string SystemUser;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/bugs, /pm/<project-code>/api/latest/issues/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class Bug
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Название пожелания */
 	public string Caption;
 	/* Описание пожелания */
 	public string Description;
 	/* Приоритет пожелания {1,2,3,4,5} */
 	public string Priority;
 	/* Идентификатор функции */
 	public string Function;
 	/* Номер версии, в которой обнаружена ошибка */
 	public string SubmittedVersion;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/requirements, /pm/<project-code>/api/latest/requirements/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class Requirement
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Название требования */
 	public string Caption;
 	/* Содержание требования */
 	public string Content;
 	/* Идентификатор родительского требования (для объединения в документ) */
 	public string ParentPage;
 	/* Автор требования (идентификатор или объект типа Пользователь) */
 	public string Author;
 	/* Состояние требования */
 	public string State;
 	/* Тип требования (идентификатор или объект)*/
 	public string PageType;
 	/* Затраченное время, ч. */
 	public string Fact;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/requirements/{requirement-id}/attachments, /pm/<project-code>/api/latest/requirements/{requirement-id}/attachments/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class RequirementAttachment
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* MIME-тип приложения */
 	public string ContentMime;
 	/* Имя файла приложения */
 	public string ContentExt;
 	/* Содержимое файла в кодировке Base64 */
 	public string Content;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/testplans, /pm/<project-code>/api/latest/testplans/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class TestPlan
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Название тест-плана */
 	public string Caption;
 	/* Автор (идентификатор или объект типа Пользователь) */
 	public string Author;
 	/* Состояние */
 	public string State;
 	/* Тип тестовой документации (идентификатор или объект)*/
 	public string PageType;
 	/* Оценка трудоемкости, ч. */
 	public string Estimation;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/testscenarios, /pm/<project-code>/api/latest/testscenarios/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class TestScenario
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Название тестового сценария */
 	public string Caption;
 	/* Содержание */
 	public string Content;
 	/* Ссылка на тест-план или родительский сценарий */
 	public string ParentPage;
 	/* Автор (идентификатор или объект типа Пользователь) */
 	public string Author;
 	/* Состояние */
 	public string State;
 	/* Тип тестовой документации (идентификатор или объект)*/
 	public string PageType;
 	/* Оценка трудоемкости, ч. */
 	public string Estimation;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/tests, /pm/<project-code>/api/latest/tests/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class Test
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Название теста */
 	public string Caption;
 	/* Окружение (идентификатор или объект типа Окружение) */
 	public string Environment;
 	/* Версия тестируемого ПО (идентификатор или объект типа Сборка) */
 	public string Version;
 	/* Результат тестирования (идентификатор, кодовое название или объект типа Результат тестирования) */
 	public string Result;
 	/* Продолжительность выполнения теста, в часах */
 	public string Duration;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }
 
 /* 
  * Routes: /pm/<project-code>/api/latest/testitems, /pm/<project-code>/api/latest/testitems/{id}
  * Methods: GET, POST, PUT, DELETE
  * Formats: json
  */
 public class TestItem
 {
 	/* Идентификатор объекта */
 	public string Id;
 	/* Название теста */
 	public string Caption;
 	/* Содержимое теста */
 	public string Content;
 	/* Тест (идентификатор или объект типа Тест) */
 	public string Test;
 	/* Тестовый сценарий (идентификатор или объект типа Тестовый сценарий) */
 	public string TestCase;
 	/* Тестировщик (идентификатор или объект типа Пользователь) */
 	public string Tester;
 	/* Результат тестирования (идентификатор, кодовое название или объект типа Результат тестирования) */
 	public string Result;
 	/* Продолжительность выполнения теста, в часах */
 	public string Duration;
 	/* Дата создания записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordCreated;
 	/* Дата последнего изменения записи [YYYY-MM-DD hh:mm:ss] (readonly) */
 	public string RecordModified;
 }