---
schema: rendered-html/v1
title: "Article | Developer Portal for YouTrack and Hub Documentation"
source_url: https://www.jetbrains.com/help/youtrack/devportal/v1-Article.html
generated_at: 2026-06-11T15:14:59.253633+00:00
---

Feedback

Thanks for your feedback!

Was this page helpful?

YesNo

Developer Portal for YouTrack and Hub

- Developer Portal
- Apps
- MCP Tools
- YouTrack Workflows
- JavaScript Workflow Quick Start Guide
- Create a Workflow
- Edit a Workflow
- Workflow Rule Types
- Transactions
- Use Cases for Workflows
- Web-based Workflow Editor
- Using an External Code Editor
- Default Workflows
- Custom Workflow Repository
- JavaScript Workflow Reference
- Rule-specific Properties
- Context
- Requirements
- Using the Workflow API
- Building Integrations with Slack
- Using REST API Methods in JavaScript Workflows
- Working with Dates and Times
- Working with Periods
- Localized Workflow Messages
- Troubleshooting Workflows
- Remote Debugger
- YouTrack Workflow API
- Change Log
- date-time
- entities
- [AbstractVcsItem](jetbrains__com__help__youtrack__devportal__v1-abstractvcsitem.md)
- [Agile](jetbrains__com__help__youtrack__devportal__v1-agile.md)
- [AppGlobalStorage](jetbrains__com__help__youtrack__devportal__v1-appglobalstorage.md)
- [Article](v1-Article.html)
- [ArticleAttachment](jetbrains__com__help__youtrack__devportal__v1-articleattachment.md)
- [ArticleComment](jetbrains__com__help__youtrack__devportal__v1-articlecomment.md)
- [BaseArticle](jetbrains__com__help__youtrack__devportal__v1-basearticle.md)
- [BaseArticleAttachment](jetbrains__com__help__youtrack__devportal__v1-basearticleattachment.md)
- [BaseArticleComment](jetbrains__com__help__youtrack__devportal__v1-basearticlecomment.md)
- [BaseComment](jetbrains__com__help__youtrack__devportal__v1-basecomment.md)
- [BaseEntity](jetbrains__com__help__youtrack__devportal__v1-baseentity.md)
- [BaseWorkItem](jetbrains__com__help__youtrack__devportal__v1-baseworkitem.md)
- Build
- BundleElementCondition
- BundleProjectCustomField
- Calendar
- Calendar24x7
- ChangesProcessor
- Channel
- EnumField
- FeedbackForm
- Field
- FieldBasedBundleValuesCondition
- FieldBasedUserValuesCondition
- FieldBasedValuesCondition
- Fields
- Gantt
- GroupProjectCustomField
- Issue
- IssueAttachment
- IssueComment
- IssueLinkPrototype
- IssueTag
- IssueWorkItem
- Iterator
- JsonForArticleAddAttachment
- JsonForArticleAddComment
- JsonForArticleConstructor
- JsonForIssueAddAttachment
- JsonForIssueAddComment
- JsonForIssueAddWorkItem
- JsonForIssueCommentAddAttachment
- JsonForIssueConstructor
- JsonForUserNotify
- MailboxChannel
- OwnedField
- PeriodProjectCustomField
- PersistentFile
- Project
- ProjectCustomField
- ProjectTeam
- ProjectType
- ProjectVersion
- PullRequest
- PullRequestState
- Requirement
- Requirements
- SavedQuery
- Set
- SimpleCalendar
- SimpleProjectCustomField
- Sprint
- State
- Tag
- TextProjectCustomField
- User
- UserAttributes
- UserCondition
- UserGroup
- UserProjectCustomField
- UserType
- VcsChange
- VcsServer
- WatchFolder
- WorkItemAttributeValue
- WorkItemAttributes
- WorkItemProjectAttribute
- WorkItemType
- http
- license
- notifications
- search
- strings
- workflow
- YouTrack Import Scripts
- YouTrack Form API
- YouTrack REST API
- Hub REST API

1. YouTrack Workflows
2. JavaScript Workflow Reference
3. YouTrack Workflow API
4. entities
5. [Article](#0)

# Article﻿

Last modified: 07 May 2026

Represents an article in YouTrack.

Extends [BaseArticle](jetbrains__com__help__youtrack__devportal__v1-basearticle.md).

Available since 2021.4.23500

## Properties﻿

| Name | Type | Description |
| --- | --- | --- |
| attachments | Set.<BaseArticleAttachment> | Read-only.   The set of attachments that are attached to the article. |
| author | User | Read-only.   The user who created the article. |
| becomesRemoved | Boolean | Read-only.   When `true`, the entity is removed in the current transaction. Otherwise, `false`. This property can become `true` only in on-change rules when the rule is triggered on the removal of an issue or an article. In the rule code, the `runOn` rule property must contain the `removal` parameter set to `true`.    Available since 2017.4.37915  ``` runOn: {removal: true} ``` |
| childArticles | Set.<Article> | The set of sub-articles of the current one.    Available since 2024.4 |
| comments | Set.<ArticleComment> | Read-only.   A list of comments for the article. |
| content | String | The text that is entered as the article content. |
| created | Number | Read-only.   The date when the article was created. |
| editedComments | Set.<ArticleComment> | Read-only.   The set of comments that are edited in the current transaction. Comments that are added and removed are not considered to be edited. Instead, these are represented by the `article.comments.added` and `article.comments.removed` properties. |
| extensionProperties | Object | The object containing extension properties for this entity and their values. Extension properties are custom properties that might be added to core YouTrack entities by an app. For details about extension properties, see <https://www.jetbrains.com/help/youtrack/devportal/apps-extension-properties.html>.    Available since 2024.3  ``` const entities = require('@jetbrains/youtrack-scripting-api/entities');  exports.rule = entities.Issue.action({     command: 'test',     action: function (ctx) {         const printValues = () => {             return 'stringProp:' + ctx.issue.extensionProperties.stringProp + ';'                 + 'integerProp:' + ctx.issue.extensionProperties.integerProp + ';'                 + 'booleanProp:' + ctx.issue.extensionProperties.booleanProp + ';'                 + 'issueProp:' + ctx.issue.extensionProperties.issueProp?.id + ';'                 + 'issuesProp:' + ctx.issue.extensionProperties.issuesProp?.first()?.id + ';'         }         ctx.issue.addComment(printValues());     } }); ``` |
| id | String | Read-only.   The article ID. |
| isNew | Boolean | Read-only.   When `true`, the entity is created in the current transaction. Otherwise, `false`.    Available since 2018.2.42351 |
| isStarred | Boolean | Read-only.   If the current user has added the 'Star' tag to watch the article, this property is `true`.    Available since 2023.1 |
| numberInProject | Number | Read-only.   The article number in the project. |
| originalArticle | Article | Read-only.   The original article from which the current article draft was created. Returns `null` if the current article is not an article draft.    Available since 2026.1 |
| parentArticle | Article | The parent article of the current one.    Available since 2024.4 |
| permittedGroups | Set.<UserGroup> | The groups for which the article is visible when the visibility is restricted to multiple groups.    Available since 2026.1 |
| permittedUsers | Set.<User> | The list of users for whom the article is visible.    Available since 2026.1 |
| pinnedComments | Set.<ArticleComment> | Read-only.   The set of comments that are pinned in the article.    Available since 2024.1 |
| project | Project | The project to which the article is assigned. |
| summary | String | The article title. |
| tags | Set.<Tag> | The list of tags that are attached to the article.    Available since 2023.1 |
| updated | Number | Read-only.   The date when the article was last updated. |
| updatedBy | User | Read-only.   The user who last updated the article. |
| url | String | Read-only.   The absolute URL that points to the article.    Available since 2025.1 |

>

## Constructors﻿

### Article﻿

Article(author, project, summary)

Available since 2021.4.23500

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| author | User, JsonForArticleConstructor | The author of the article. Alternatively, pass a JSON specified by JsonForArticleConstructor |
| project | Project | The project where the new article is created. |
| summary | String | The article title. |

## Methods﻿

### action﻿

static action(ruleProperties, ruleProperties.title, ruleProperties.userInput, ruleProperties.userInput.type, ruleProperties.userInput.description, ruleProperties.guard, ruleProperties.action, ruleProperties.requirements)

Creates a declaration of a rule that a user can apply to an article using a menu option. The object that is returned by this method is normally exported to the `rule` property, otherwise it is not treated as a rule.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| ruleProperties | Object | A JSON object that defines the properties for the rule. |
| ruleProperties.title | string | The human-readable name of the rule. Displayed in the administrative UI in YouTrack. |
| ruleProperties.userInput | Object | An object that defines the properties for information that will be requested from the user who triggers the action rule. |
| ruleProperties.userInput.type | string, Object | The data type for the value that is requested from the user. The following types are supported: \* entities.Field.dateTimeType \* entities.Field.dateType \* entities.Field.integerType \* entities.Field.floatType \* entities.Field.periodType \* entities.Field.stringType \* entities.Build \* entities.EnumField \* entities.Issue \* entities.IssueTag \* entities.OwnedField \* entities.Project \* entities.ProjectVersion \* entities.UserGroup \* entities.User |
| ruleProperties.userInput.description | string | The label for the control that is used to collect additional information from the user. |
| ruleProperties.guard | Article~guardFunction | A function that is invoked to determine whether the action is applicable to an article. |
| ruleProperties.action | Article~actionFunction | The function that is invoked when a user triggers this action. |
| ruleProperties.requirements | Requirements | The set of entities that must be present for the script to work as expected. |

**Return Value**

| Type | Description |
| --- | --- |
| Object | The object representation of the rule. |

**Example**

var entities = require('@jetbrains/youtrack-scripting-api/entities');
exports.rule = entities.Article.action({
  title: 'Log article comments',
  command: 'log',
  guard: function(ctx) {
    return ctx.article.comments.isEmpty();
  },
  action: function(ctx) {
    ctx.article.comments.forEach(function(comment) {
      console.log(comment.text);
    });
  }
});

### createDraft﻿

static createDraft(project, author)

Creates a new article draft.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| project | Project | The project where the new article is created. |
| author | User | The author of the article. |

**Return Value**

| Type | Description |
| --- | --- |
| ArticleDraft | Newly created article draft. |

### findByExtensionProperties﻿

static findByExtensionProperties(extensionPropertiesQuery)

Searches for Article entities with extension properties that match the specified query.

Available since 2024.3.43260

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| extensionPropertiesQuery | Object | The extension properties query, defined as a set of key-value pairs representing properties and their corresponding values. |

**Return Value**

| Type | Description |
| --- | --- |
| Set.<Article> | The set of Article entities that contain the specified extension properties. |

**Example**

{
   property1: "value1",
   property2: "value2"
}

### findById﻿

static findById(id)

Finds an article by its visible ID.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| id | String | The article ID. |

**Return Value**

| Type | Description |
| --- | --- |
| Article | The article that is assigned the specified ID. |

### onChange﻿

static onChange(ruleProperties, ruleProperties.title, ruleProperties.guard, ruleProperties.action, ruleProperties.requirements, ruleProperties.runOn, ruleProperties.runOn.change, ruleProperties.runOn.removal)

Creates a declaration of a rule that is triggered when a change is applied to an article. The object that is returned by this method is normally exported to the `rule` property, otherwise it is not treated as a rule.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| ruleProperties | Object | A JSON object that defines the properties for the rule. |
| ruleProperties.title | string | The human-readable name of the rule. Displayed in the administrative UI in YouTrack. |
| ruleProperties.guard | Article~guardFunction | A function that determines the conditions for executing the rule. If the guard condition is not met, the action specified in the rule is not applied to the article. |
| ruleProperties.action | Article~actionFunction | The function that is invoked on an article change. |
| ruleProperties.requirements | Requirements | The set of entities that must be present for the script to work as expected. |
| ruleProperties.runOn | Object | Determines which article events trigger the on-change rule. When not specified, the rule is triggered on an article change. |
| ruleProperties.runOn.change | boolean | When `true`, the rule is triggered on an article change. |
| ruleProperties.runOn.removal | boolean | When `true`, the rule is triggered when an article is logically deleted. |

**Return Value**

| Type | Description |
| --- | --- |
| Object | The object representation of the rule. |

**Example**

var entities = require('@jetbrains/youtrack-scripting-api/entities');
exports.rule = entities.Article.onChange({
  title: 'On article change, log its ID',
  action: function(ctx) {
    console.log(ctx.article.id);
  }
});

### addAttachment﻿

addAttachment(content, name, charset, mimeType)

Attaches a file to the article. Makes `article.attachments.isChanged` return `true` for the current transaction.

Available since 2020.2

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| content | InputStream, String, JsonForArticleAddAttachment | The content of the file in binary or base64 form. Alternatively, pass a JSON specified by JsonForArticleAddAttachment |
| name | String | The name of the file. |
| charset | String | The charset of the file. Only applicable to text files. |
| mimeType | String | The MIME type of the file. |

**Return Value**

| Type | Description |
| --- | --- |
| ArticleAttachment | The attachment that is added to the article. |

### addComment﻿

addComment(text, author)

Adds a comment to the article.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| text | String, JsonForArticleAddComment | The text to add to the article as a comment. Alternatively, pass a JSON specified by JsonForArticleAddComment |
| author | User | The author of the comment. |

**Return Value**

| Type | Description |
| --- | --- |
| ArticleComment | A newly created comment. |

### addTag﻿

addTag(name)

Adds a tag with the specified name to an article. YouTrack adds the first matching tag that is visible to the current user. If a match is not found, a new private tag is created for the current user.

Available since 2023.1

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| name | String | The name of the tag to add to the article. |

**Return Value**

| Type | Description |
| --- | --- |
| Tag | The tag that has been added to the article. |

**Example**

article.addTag('review');

### becomes﻿

becomes(fieldName, expected)

Checks whether a field is set to an expected value in the current transaction.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| fieldName | string | The name of the field to check. |
| expected | string | The expected value. |

**Return Value**

| Type | Description |
| --- | --- |
| boolean | If the field is set to the expected value, returns `true`. |

### canBeReadBy﻿

canBeReadBy(fieldName, user)

Checks whether a user has permission to read the field.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| fieldName | string | The name of the field. |
| user | User | The user for whom the permission to read the field is checked. |

**Return Value**

| Type | Description |
| --- | --- |
| boolean | If the user can read the field, returns `true`. |

### canBeWrittenBy﻿

canBeWrittenBy(fieldName, user)

Checks whether a user has permission to update the field.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| fieldName | string | The name of the field. |
| user | User | The user for whom the permission to update the field is checked. |

**Return Value**

| Type | Description |
| --- | --- |
| boolean | If the user can update the field, returns `true`. |

### hasTag﻿

hasTag(tagName)

Checks whether the specified tag is attached to the article.

Available since 2023.1

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| tagName | String | The name of the tag to check for the article. |

**Return Value**

| Type | Description |
| --- | --- |
| Boolean | If the specified tag is attached to the article, returns `true`. |

### is﻿

is(fieldName, expected)

Checks whether a field is equal to an expected value.

Available since 2019.2.55603

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| fieldName | string | The name of the field to check. |
| expected | string | The expected value. |

**Return Value**

| Type | Description |
| --- | --- |
| boolean | If the field is equal to the expected value, returns `true`. |

### isChanged﻿

isChanged(fieldName)

Checks whether the value of a field is changed in the current transaction.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| fieldName | string | The name of the field to check. |

**Return Value**

| Type | Description |
| --- | --- |
| boolean | If the value of the field is changed in the current transaction, returns `true`. |

### oldValue﻿

oldValue(fieldName)

Returns the previous value of a single-value field before an update was applied. If the field is not changed in the transaction, returns null.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| fieldName | string | The name of the field. |

**Return Value**

| Type | Description |
| --- | --- |
| Object | If the field is changed in the current transaction, the previous value of the field. Otherwise, null. |

### removeTag﻿

removeTag(name)

Removes a tag with the specified name from an article. If the specified tag is not attached to the article, nothing happens. This method first searches through tags owned by the current user, then through all other visible tags.

Available since 2023.1

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| name | String | The name of the tag to remove from the article. |

**Return Value**

| Type | Description |
| --- | --- |
| Tag | The tag that has been removed from the article. |

**Example**

article.removeTag('waiting for review');

### required﻿

required(fieldName, message)

Asserts that a value is set for a field. If a value for the required field is not set, the specified message is displayed in the user interface.

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| fieldName | string | The name of the field to check. |
| message | string | The message that is displayed to the user that describes the field requirement. |

### was﻿

was(fieldName, expected)

Checks whether a field was equal to an expected value prior to the current transaction.

Available since 2019.2.55603

**Parameters**

| Name | Type | Description |
| --- | --- | --- |
| fieldName | string | The name of the field to check. |
| expected | string | The expected value. |

**Return Value**

| Type | Description |
| --- | --- |
| boolean | If the field was equal to the expected value, returns `true`. |

- [Article](/help/youtrack/devportal/v1-Article.html)
- [Properties](/help/youtrack/devportal/v1-Article.html#properties)
- [Constructors](/help/youtrack/devportal/v1-Article.html#constructors)
- [Article](/help/youtrack/devportal/v1-Article.html#Article)
- [Methods](/help/youtrack/devportal/v1-Article.html#methods)
- [action](/help/youtrack/devportal/v1-Article.html#action)
- [createDraft](/help/youtrack/devportal/v1-Article.html#createDraft)
- [findByExtensionProperties](/help/youtrack/devportal/v1-Article.html#findByExtensionProperties)
- [findById](/help/youtrack/devportal/v1-Article.html#findById)
- [onChange](/help/youtrack/devportal/v1-Article.html#onChange)
- [addAttachment](/help/youtrack/devportal/v1-Article.html#addAttachment)
- [addComment](/help/youtrack/devportal/v1-Article.html#addComment)
- [addTag](/help/youtrack/devportal/v1-Article.html#addTag)
- [becomes](/help/youtrack/devportal/v1-Article.html#becomes)
- [canBeReadBy](/help/youtrack/devportal/v1-Article.html#canBeReadBy)
- [canBeWrittenBy](/help/youtrack/devportal/v1-Article.html#canBeWrittenBy)
- [hasTag](/help/youtrack/devportal/v1-Article.html#hasTag)
- [is](/help/youtrack/devportal/v1-Article.html#is)
- [isChanged](/help/youtrack/devportal/v1-Article.html#isChanged)
- [oldValue](/help/youtrack/devportal/v1-Article.html#oldValue)
- [removeTag](/help/youtrack/devportal/v1-Article.html#removeTag)
- [required](/help/youtrack/devportal/v1-Article.html#required)
- [was](/help/youtrack/devportal/v1-Article.html#was)

[AppGlobalStorage](jetbrains__com__help__youtrack__devportal__v1-appglobalstorage.md)[ArticleAttachment](jetbrains__com__help__youtrack__devportal__v1-articleattachment.md)

- Privacy & Security
- Terms Of Use
- Trademarks
- Legal

Copyright © 2000–2026 JetBrains s.r.o.
