diff --git a/.github/workflows/Test.yml b/.github/workflows/Test.yml index b489e3f..24af43d 100644 --- a/.github/workflows/Test.yml +++ b/.github/workflows/Test.yml @@ -1,3 +1,16 @@ +# Copyright 2026 Peanut Butter Unicorn LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. name: Test on: pull_request: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ab0c18d..bd156e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,3 +1,16 @@ +# Copyright 2026 Peanut Butter Unicorn LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. name: Release on: @@ -32,4 +45,4 @@ jobs: GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} GPG_FILE: ${{ secrets.GPG_FILE }} GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }} - run: ./gradlew publishToMavenCentral --info \ No newline at end of file + run: ./gradlew publishToMavenCentral --info diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1133129 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8f40fd4..94e9acc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -259,7 +259,7 @@ A good way to summarize the 'testing commandments' is "If it's documented, [test ```java /** - * {@summary List Locales} + *
You must specify a category name and locale. + * Though the Zendesk Api states you can create multiple translations at this time, in practice this doesn't work.
+ *You must specify a category name and locale. + * Though the Zendesk Api states you can create multiple translations at this time, in practice this doesn't work.
+ *WARNING: Every section and all articles in the category will also be deleted.
+ *WARNING: Every section and all articles in the category will also be deleted.
+ *No content
(status code 204) + */ + @Delete("/api/v2/help_center/categories/{category_id}") + MonoThe response will list only the categories that the agent, end user, or anonymous user can view in the help center.
+ *Translations are embedded within the category because they're not shared between resources.
+ *The response will list only the categories that the agent can view in the help center.
+ * + * @param sortBy {@link SortCategoryBy} (optional) + * @param sortOrder {@link SortOrder} (optional) + * @return status code 200 + */ + @Get("/api/v2/help_center/categories") + Mono<@Valid CategoriesResponse> listCategoriesNoLocale( + @QueryValue("sort_by") @Nullable SortCategoryBy sortBy, + @QueryValue("sort_order") @Nullable SortOrder sortOrder + ); + + /** + *Translations are embedded within the category because they're not shared between resources.
+ *This only updates category-level metadata such as the sorting position. This doesn't update category translations.
+ *This only updates category-level metadata such as the sorting position. This doesn't update category translations.
+ *The endpoint updates the category source_locale property
OK Response
(status code 200) + */ + @Put("/api/v2/help_center/categories/{category_id}/source_locale") + Mono<@Valid CategoryResponse> updateCategorySourceLocale(@PathVariable("category_id") @NotNull Long categoryId); +} diff --git a/src/main/java/lol/pbu/z4j/client/LocaleClient.java b/src/main/java/lol/pbu/z4j/client/LocaleClient.java new file mode 100644 index 0000000..ff5942e --- /dev/null +++ b/src/main/java/lol/pbu/z4j/client/LocaleClient.java @@ -0,0 +1,46 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.client; + +import io.micronaut.http.annotation.Get; +import io.micronaut.http.client.annotation.Client; +import io.micronaut.retry.annotation.Retryable; +import jakarta.validation.Valid; +import lol.pbu.z4j.model.LocalesResponse; +import reactor.core.publisher.Mono; + +/** + *Exports a set of results. See Query syntax for the syntax of the {@code query} parameter.
Use this endpoint for search queries that will return more than 1000 results. The result set is ordered only by the {@code created_at} attribute.
The search only returns results of a single object type. The following object types are supported: ticket, organization, user, or group.
You must specify the type in the {@code filter[type]} parameter. Searches with type in the query string will result in an error.
Allowed for AgentsSee Pagination.
Returns a maximum of 1000 records per page. The number of results shown in a page is determined by the {@code page[size]} parameter.
Note: You may experience a speed reduction or a timeout if you request 1000 results per page and you have many archived tickets in the results. Try reducing the number of results per page. We recommend 100 results per page.
The cursor specified by the {@code after_cursor} property in a response expires after one hour.
For more information on cursor-based pagination, see the following articles:
This API endpoint is rate-limited to 100 requests per minute per account. The limit also counts towards the global API rate limit.
+ * + * @param query Returns the search results. See Query syntax for details on the {@code query} parameter. For details on the query syntax, see the Zendesk Support search reference. (required) + * @param pageSize The number of results shown in a page. (required) + * @param pageAfter The cursor token for fetching the next page of results. (required) + * @param filterType The object type returned by the export query. Can be `ticket`, `organization`, `user`, or `group`. (required) + * @param include Sideloads to include in the response. Accepts a comma-separated list of values. The available sideloads depend on the search result types. (optional) + * @return Success response (status code 200) + * or Error response (status code 400) + */ + @Get("/api/v2/search/export") + Mono<@Valid SearchResponse> export( + @QueryValue("query") @NotNull String query, + @QueryValue("page[size]") @NotNull Integer pageSize, + @QueryValue("page[after]") @NotNull String pageAfter, + @QueryValue("filter[type]") @NotNull SearchExportType filterType, + @QueryValue("include") @Nullable String include + ); + + /** + *Returns the search results. See Query syntax for details on the {@code query} parameter.
Use the ampersand character (&) to append the {@code sort_by} or {@code sort_order} parameters to the URL.
For examples, see Searching with Zendesk API.
This endpoint has its own rate limit. The rate limit counts towards the global API rate limit. See Limits.
Offset pagination may result in duplicate results when paging. You can also use the Export Search Results endpoint, which uses cursor-based pagination and doesn't return duplicate results. See Using cursor pagination for more information.
+ * + * @param query Returns the search results. See Query syntax for details on the {@code query} parameter. For details on the query syntax, see the Zendesk Support search reference. (required) + * @param sortBy One of {@code updated_at}, {@code created_at}, {@code priority}, {@code status}, or {@code ticket_type}. Defaults to sorting by relevance (optional) + * @param sortOrder Defaults to descending (optional) + * @param include Sideloads to include in the response. Accepts a comma-separated list of values. The available sideloads depend on the search result types. (optional) + * @return Success response (status code 200) + * or Error response (status code 400) + */ + @Get("/api/v2/search") + Mono<@Valid SearchResponse> list( + @QueryValue("query") @NotNull String query, + @QueryValue("sort_by") @Nullable SortBy sortBy, + @QueryValue("sort_order") @Nullable SortOrder sortOrder, + @QueryValue("include") @Nullable String include + ); +} diff --git a/src/main/java/lol/pbu/z4j/client/TicketClient.java b/src/main/java/lol/pbu/z4j/client/TicketClient.java new file mode 100644 index 0000000..63e2955 --- /dev/null +++ b/src/main/java/lol/pbu/z4j/client/TicketClient.java @@ -0,0 +1,123 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.client; + +import io.micronaut.core.annotation.Nullable; +import io.micronaut.http.annotation.*; +import io.micronaut.http.annotation.Post; +import io.micronaut.http.client.annotation.Client; +import io.micronaut.retry.annotation.Retryable; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lol.pbu.z4j.model.*; +import reactor.core.publisher.Mono; + +/** + *See About custom field types in the Zendesk Help + * Center.
We recommend the following best practices for ticket fields limits. + * Creating more than these amounts can affect performance.
+ *Returns a list of all system and custom ticket fields in your account.
For end users, only the ticket fields with visible_in_portal set to true are returned.
Consider caching this resource to use with the{@link TicketClient}.
Returns a number of ticket properties though not the ticket comments. To get the comments, use List Comments
Lists the topics that use the specified user segment.
+ * + * Pagination is not currently supported. Open an issue with us to let us know you'd like this supported! + *Some user segments can only be applied to sections and topics on certain Guide plans.
+ * For instance, user segments with a user_type of "staff" cannot be applied to sections and topics on accounts on the Guide Lite plan or the Suite Team plan.
+ *
+ *
HTML body of the article. Unsafe tags and attributes may be removed before display. For a list of safe tags and attributes, see Allowing unsafe HTML in Help Center articles in Zendesk help
+ */ + @Nullable + @JsonProperty(JSON_PROPERTY_BODY) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String body; + + /** + * True if comments are disabled; false otherwise + */ + @Nullable + @JsonProperty(JSON_PROPERTY_COMMENTS_DISABLED) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Boolean commentsDisabled; + + /** + * The list of content tags attached to the article + */ + @Nullable + @JsonProperty(JSON_PROPERTY_CONTENT_TAG_IDS) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private List<@NotNull String> contentTagIds; + + /** + * The time the article was created + */ + @Nullable + @JsonProperty(JSON_PROPERTY_CREATED_AT) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String createdAt; + + /** + * True if the translation for the current locale is a draft; false otherwise. false by default. Can be set when creating but not when updating. For updating, see Translations + */ + @Nullable + @JsonProperty(JSON_PROPERTY_DRAFT) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Boolean draft; + + /** + * The time the article was last edited in its displayed locale + */ + @Nullable + @JsonProperty(JSON_PROPERTY_EDITED_AT) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String editedAt; + + /** + * The url of the article in Help Center + */ + @Nullable + @JsonProperty(JSON_PROPERTY_HTML_URL) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String htmlUrl; + + /** + * Automatically assigned when the article is created + */ + @Nullable + @JsonProperty(JSON_PROPERTY_ID) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long id; + + /** + * An array of label names associated with this article. By default, no label names are used. Only available on certain plans + */ + @Nullable + @JsonProperty(JSON_PROPERTY_LABEL_NAMES) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private List<@NotNull String> labelNames; + + /** + * Deprecated. Always false because the source translation is always the most up-to-date translation + */ + @Nullable + @JsonProperty(JSON_PROPERTY_OUTDATED) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Boolean outdated; + + /** + * Locales in which the article was marked as outdated + */ + @Nullable + @JsonProperty(JSON_PROPERTY_OUTDATED_LOCALES) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private List<@NotNull String> outdatedLocales; + + /** + * The position of this article in the article list. 0 by default + */ + @Nullable + @JsonProperty(JSON_PROPERTY_POSITION) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long position; + + /** + * True if this article is promoted; false otherwise. false by default + */ + @Nullable + @JsonProperty(JSON_PROPERTY_PROMOTED) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Boolean promoted; + + /** + * The id of the section to which this article belongs + */ + @Nullable + @JsonProperty(JSON_PROPERTY_SECTION_ID) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long sectionId; + + /** + * The source (default) locale of the article + */ + @Nullable + @JsonProperty(JSON_PROPERTY_SOURCE_LOCALE) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String sourceLocale; + + /** + * The time the article was last updated + */ + @Nullable + @JsonProperty(JSON_PROPERTY_UPDATED_AT) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String updatedAt; + + /** + * The API url of the article + */ + @Nullable + @JsonProperty(JSON_PROPERTY_URL) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String url; + + /** + * The id of the user segment which defines who can see this article. Set to null to make it accessible to everyone. Either user_segment_id or user_segment_ids must be specified + */ + @Nullable + @JsonProperty(JSON_PROPERTY_USER_SEGMENT_ID) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long userSegmentId; + + /** + * List of user segment ids which define who can view this article. Set to an empty list to make it accessible to everyone. For Enterprise plans only this may contain more than one user_segment_id. Either user_segment_id or user_segment_ids must be specified + */ + @Nullable + @JsonProperty(JSON_PROPERTY_USER_SEGMENT_IDS) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private List<@NotNull String> userSegmentIds; + + /** + * The total number of upvotes and downvotes + */ + @Nullable + @JsonProperty(JSON_PROPERTY_VOTE_COUNT) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long voteCount; + + /** + * The sum of upvotes (+1) and downvotes (-1), which may be positive or negative + */ + @Nullable + @JsonProperty(JSON_PROPERTY_VOTE_SUM) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long voteSum; + + + /** + * Add an item to the contentTagIds property in a chainable fashion. + * + * @return The same instance of Article for chaining. + */ + public Article addContentTagIdsItem(String contentTagIdsItem) { + if (contentTagIds == null) { + contentTagIds = new ArrayList<>(); + } + contentTagIds.add(contentTagIdsItem); + return this; + } + + /** + * Add an item to the labelNames property in a chainable fashion. + * + * @return The same instance of Article for chaining. + */ + public Article addLabelNamesItem(String labelNamesItem) { + if (labelNames == null) { + labelNames = new ArrayList<>(); + } + labelNames.add(labelNamesItem); + return this; + } + + /** + * Add an item to the userSegmentIds property in a chainable fashion. + * + * @return The same instance of Article for chaining. + */ + public Article addUserSegmentIdsItem(String userSegmentIdsItem) { + if (userSegmentIds == null) { + userSegmentIds = new ArrayList<>(); + } + userSegmentIds.add(userSegmentIdsItem); + return this; + } + +} diff --git a/src/main/java/lol/pbu/z4j/model/ArticleAttachment.java b/src/main/java/lol/pbu/z4j/model/ArticleAttachment.java new file mode 100644 index 0000000..4ec4b10 --- /dev/null +++ b/src/main/java/lol/pbu/z4j/model/ArticleAttachment.java @@ -0,0 +1,174 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.micronaut.core.annotation.Nullable; +import io.micronaut.serde.annotation.Serdeable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * ArticleAttachment + * + * @author Jonathan-Zollinger + * @since 0.1.1 + */ +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Data +@JsonPropertyOrder({ + ArticleAttachment.JSON_PROPERTY_ARTICLE_ID, + ArticleAttachment.JSON_PROPERTY_CONTENT_TYPE, + ArticleAttachment.JSON_PROPERTY_CONTENT_URL, + ArticleAttachment.JSON_PROPERTY_CREATED_AT, + ArticleAttachment.JSON_PROPERTY_FILE, + ArticleAttachment.JSON_PROPERTY_FILE_NAME, + ArticleAttachment.JSON_PROPERTY_GUIDE_MEDIA_ID, + ArticleAttachment.JSON_PROPERTY_ID, + ArticleAttachment.JSON_PROPERTY_INLINE, + ArticleAttachment.JSON_PROPERTY_LOCALE, + ArticleAttachment.JSON_PROPERTY_SIZE, + ArticleAttachment.JSON_PROPERTY_UPDATED_AT, + ArticleAttachment.JSON_PROPERTY_URL, +}) +@Serdeable +public class ArticleAttachment { + + public static final String JSON_PROPERTY_ARTICLE_ID = "article_id"; + public static final String JSON_PROPERTY_CONTENT_TYPE = "content_type"; + public static final String JSON_PROPERTY_CONTENT_URL = "content_url"; + public static final String JSON_PROPERTY_CREATED_AT = "created_at"; + public static final String JSON_PROPERTY_FILE = "file"; + public static final String JSON_PROPERTY_FILE_NAME = "file_name"; + public static final String JSON_PROPERTY_GUIDE_MEDIA_ID = "guide_media_id"; + public static final String JSON_PROPERTY_ID = "id"; + public static final String JSON_PROPERTY_INLINE = "inline"; + public static final String JSON_PROPERTY_LOCALE = "locale"; + public static final String JSON_PROPERTY_SIZE = "size"; + public static final String JSON_PROPERTY_UPDATED_AT = "updated_at"; + public static final String JSON_PROPERTY_URL = "url"; + + /** + * The associated article, if present + */ + @Nullable + @JsonProperty(JSON_PROPERTY_ARTICLE_ID) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long articleId; + + /** + * The file type. Example: image/png + */ + @Nullable + @JsonProperty(JSON_PROPERTY_CONTENT_TYPE) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String contentType; + + /** + * URL where the attachment file can be downloaded + */ + @Nullable + @JsonProperty(JSON_PROPERTY_CONTENT_URL) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String contentUrl; + + /** + * The time the article attachment was created + */ + @Nullable + @JsonProperty(JSON_PROPERTY_CREATED_AT) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String createdAt; + + /** + * File to upload, applicable only during creation. + */ + @Nullable + @JsonProperty(JSON_PROPERTY_FILE) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Object file; + + /** + * The file name + */ + @Nullable + @JsonProperty(JSON_PROPERTY_FILE_NAME) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String fileName; + + /** + * Unique identifier for the guide-media to associate with this attachment, applicable only during creation. + */ + @Nullable + @JsonProperty(JSON_PROPERTY_GUIDE_MEDIA_ID) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String guideMediaId; + + /** + * Assigned ID when the article attachment is created + */ + @Nullable + @JsonProperty(JSON_PROPERTY_ID) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long id; + + /** + * The attached file is shown in the admin interface for inline attachments. Its URL can be referenced in the article's HTML body. Inline attachments are image files directly embedded in the article body. If false, the attachment is listed in the list of attachments. The default value is false + */ + @Nullable + @JsonProperty(JSON_PROPERTY_INLINE) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Boolean inline; + + /** + * The locale of translation that the attachment will be attached to and can only be set on inline attachments + */ + @Nullable + @JsonProperty(JSON_PROPERTY_LOCALE) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private LocaleAbbreviation localeAbbreviation; + + /** + * The attachment file size in bytes + */ + @Nullable + @JsonProperty(JSON_PROPERTY_SIZE) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Long size; + + /** + * The time the article attachment was last updated + */ + @Nullable + @JsonProperty(JSON_PROPERTY_UPDATED_AT) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String updatedAt; + + /** + * The URL of the article attachment + */ + @Nullable + @JsonProperty(JSON_PROPERTY_URL) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String url; + +} diff --git a/src/main/java/lol/pbu/z4j/model/ArticleAttachmentResponse.java b/src/main/java/lol/pbu/z4j/model/ArticleAttachmentResponse.java new file mode 100644 index 0000000..393cc1e --- /dev/null +++ b/src/main/java/lol/pbu/z4j/model/ArticleAttachmentResponse.java @@ -0,0 +1,50 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.micronaut.core.annotation.Nullable; +import io.micronaut.serde.annotation.Serdeable; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * ArticleAttachmentResponse + * @author Jonathan-Zollinger + * @since 0.1.1 + */ +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Data +@JsonPropertyOrder(ArticleAttachmentResponse.JSON_PROPERTY_ARTICLE_ATTACHMENT) +@Serdeable +public class ArticleAttachmentResponse { + + public static final String JSON_PROPERTY_ARTICLE_ATTACHMENT = "article_attachment"; + + @Nullable + @Valid + @JsonProperty(JSON_PROPERTY_ARTICLE_ATTACHMENT) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private ArticleAttachment articleAttachment; + +} diff --git a/src/main/java/lol/pbu/z4j/model/ArticleAttachmentsResponse.java b/src/main/java/lol/pbu/z4j/model/ArticleAttachmentsResponse.java new file mode 100644 index 0000000..446816e --- /dev/null +++ b/src/main/java/lol/pbu/z4j/model/ArticleAttachmentsResponse.java @@ -0,0 +1,65 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.micronaut.core.annotation.Nullable; +import io.micronaut.serde.annotation.Serdeable; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +/** + * ArticleAttachmentsResponse + * @author Jonathan-Zollinger + * @since 0.1.1 + */ +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Data +@JsonPropertyOrder(ArticleAttachmentsResponse.JSON_PROPERTY_ARTICLE_ATTACHMENTS) +@Serdeable +public class ArticleAttachmentsResponse { + + public static final String JSON_PROPERTY_ARTICLE_ATTACHMENTS = "article_attachments"; + + @Nullable + @JsonProperty(JSON_PROPERTY_ARTICLE_ATTACHMENTS) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private List<@Valid ArticleAttachment> articleAttachments; + + /** + * Add an item to the articleAttachments property in a chainable fashion. + * + * @return The same instance of ArticleAttachmentsResponse for chaining. + */ + public ArticleAttachmentsResponse addArticleAttachmentsItem(ArticleAttachment articleAttachmentsItem) { + if (articleAttachments == null) { + articleAttachments = new ArrayList<>(); + } + articleAttachments.add(articleAttachmentsItem); + return this; + } + +} diff --git a/src/main/java/lol/pbu/z4j/model/ArticleRequest.java b/src/main/java/lol/pbu/z4j/model/ArticleRequest.java new file mode 100644 index 0000000..2993866 --- /dev/null +++ b/src/main/java/lol/pbu/z4j/model/ArticleRequest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.micronaut.core.annotation.Nullable; +import io.micronaut.serde.annotation.Serdeable; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * ArticleRequest + * @author Jonathan-Zollinger + * @since 0.1.1 + */ +@Accessors(chain = true) +@EqualsAndHashCode +@ToString +@Getter +@Setter +@JsonPropertyOrder({ + ArticleRequest.JSON_PROPERTY_ARTICLE, + ArticleRequest.JSON_PROPERTY_NOTIFY_SUBSCRIBERS, +}) +@Serdeable +public class ArticleRequest { + + public static final String JSON_PROPERTY_ARTICLE = "article"; + public static final String JSON_PROPERTY_NOTIFY_SUBSCRIBERS = "notify_subscribers"; + + @NotNull + @Valid + @JsonProperty(JSON_PROPERTY_ARTICLE) + private ArticleRequestArticle article; + + @Nullable + @JsonProperty(JSON_PROPERTY_NOTIFY_SUBSCRIBERS) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Boolean notifySubscribers; + + public ArticleRequest(ArticleRequestArticle article) { + this.article = article; + } + +} diff --git a/src/main/java/lol/pbu/z4j/model/ArticleRequestArticle.java b/src/main/java/lol/pbu/z4j/model/ArticleRequestArticle.java new file mode 100644 index 0000000..6561894 --- /dev/null +++ b/src/main/java/lol/pbu/z4j/model/ArticleRequestArticle.java @@ -0,0 +1,76 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.micronaut.core.annotation.Nullable; +import io.micronaut.serde.annotation.Serdeable; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import lombok.experimental.Accessors; + +/** + * ArticleRequestArticle + * @author Jonathan-Zollinger + * @since 0.1.1 + */ +@Accessors(chain = true) +@EqualsAndHashCode +@ToString +@Getter +@Setter +@AllArgsConstructor +@JsonPropertyOrder({ + ArticleRequestArticle.JSON_PROPERTY_LOCALE, + ArticleRequestArticle.JSON_PROPERTY_PERMISSION_GROUP_ID, + ArticleRequestArticle.JSON_PROPERTY_TITLE, + ArticleRequestArticle.JSON_PROPERTY_USER_SEGMENT_ID, + ArticleRequestArticle.JSON_PROPERTY_BODY, +}) +@Serdeable +public class ArticleRequestArticle { + + public static final String JSON_PROPERTY_LOCALE = "locale"; + public static final String JSON_PROPERTY_PERMISSION_GROUP_ID = "permission_group_id"; + public static final String JSON_PROPERTY_TITLE = "title"; + public static final String JSON_PROPERTY_USER_SEGMENT_ID = "user_segment_id"; + public static final String JSON_PROPERTY_BODY = "body"; + + @NotNull + @JsonProperty(JSON_PROPERTY_LOCALE) + private LocaleAbbreviation localeAbbreviation; + + @NotNull + @JsonProperty(JSON_PROPERTY_PERMISSION_GROUP_ID) + private Long permissionGroupId = 0L; + + @NotNull + @JsonProperty(JSON_PROPERTY_TITLE) + private String title; + + @NotNull + @JsonProperty(JSON_PROPERTY_USER_SEGMENT_ID) + private Long userSegmentId; + + @Nullable + @JsonProperty(JSON_PROPERTY_BODY) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private String body; + + +} diff --git a/src/main/java/lol/pbu/z4j/model/ArticleResponse.java b/src/main/java/lol/pbu/z4j/model/ArticleResponse.java new file mode 100644 index 0000000..3ec0a59 --- /dev/null +++ b/src/main/java/lol/pbu/z4j/model/ArticleResponse.java @@ -0,0 +1,50 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.micronaut.core.annotation.Nullable; +import io.micronaut.serde.annotation.Serdeable; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * ArticleResponse + * @author Jonathan-Zollinger + * @since 0.1.1 + */ +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Data +@JsonPropertyOrder(ArticleResponse.JSON_PROPERTY_ARTICLE) +@Serdeable +public class ArticleResponse { + + public static final String JSON_PROPERTY_ARTICLE = "article"; + + @Nullable + @Valid + @JsonProperty(JSON_PROPERTY_ARTICLE) + @JsonInclude(JsonInclude.Include.USE_DEFAULTS) + private Article article; + +} diff --git a/src/main/java/lol/pbu/z4j/model/ArticleSearchResponse.java b/src/main/java/lol/pbu/z4j/model/ArticleSearchResponse.java new file mode 100644 index 0000000..9d19941 --- /dev/null +++ b/src/main/java/lol/pbu/z4j/model/ArticleSearchResponse.java @@ -0,0 +1,87 @@ +/* + * Copyright 2026 Peanut Butter Unicorn, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package lol.pbu.z4j.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.micronaut.core.annotation.Nullable; +import io.micronaut.serde.annotation.Serdeable; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +/** + * ArticleSearchResponse + * @author Jonathan-Zollinger + * @since 0.1.1 + */ +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Data +@JsonPropertyOrder({ + ArticleSearchResponse.JSON_PROPERTY_RESULT_TYPE, + ArticleSearchResponse.JSON_PROPERTY_RESULTS, + ArticleSearchResponse.JSON_PROPERTY_SNIPPET, +}) +@Serdeable +public class ArticleSearchResponse { + + public static final String JSON_PROPERTY_RESULT_TYPE = "result_type"; + public static final String JSON_PROPERTY_RESULTS = "results"; + public static final String JSON_PROPERTY_SNIPPET = "snippet"; + + /** + * For articles, always the stringarticle
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RESULT_TYPE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String resultType = "article";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RESULTS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@Valid Article> results;
+
+ /**
+ * The portion of an article that is relevant to the search query, with matching words or phrases delimited by <em></em> tags. Example: a query for carrot potato might return the snippet ...don't confuse <em>carrots</em> with <em>potatoes</em>...
body or
+ * author_id. Note that only edits made after May 17, 2021, will be reflected in this field.
+ * If no non-author edits have occurred since May 17, 2021, then this field will benull.
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_NON_AUTHOR_EDITOR_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long nonAuthorEditorId;
+
+ /**
+ * When the comment was last edited by a non-author user
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_NON_AUTHOR_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private ZonedDateTime nonAuthorUpdatedAt;
+
+ /**
+ * The id of the item on which this comment was made
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SOURCE_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long sourceId;
+
+ /**
+ * The type of the item on which this comment was made. Currently only supports 'Article'
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SOURCE_TYPE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String sourceType;
+
+ /**
+ * The time at which the comment was last updated
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String updatedAt;
+
+ /**
+ * The API url of this comment
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_URL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String url;
+
+ /**
+ * The total number of upvotes and downvotes
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VOTE_COUNT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long voteCount;
+
+ /**
+ * The sum of upvotes (+1) and downvotes (-1), which may be positive or negative
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VOTE_SUM)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long voteSum;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CommentResponse.java b/src/main/java/lol/pbu/z4j/model/CommentResponse.java
new file mode 100644
index 0000000..e49f17d
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CommentResponse.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * CommentResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(CommentResponse.JSON_PROPERTY_COMMENT)
+@Serdeable
+public class CommentResponse {
+
+ public static final String JSON_PROPERTY_COMMENT = "comment";
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_COMMENT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Comment comment;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CommentsResponse.java b/src/main/java/lol/pbu/z4j/model/CommentsResponse.java
new file mode 100644
index 0000000..546f8bf
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CommentsResponse.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * CommentsResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(CommentsResponse.JSON_PROPERTY_COMMENTS)
+@Serdeable
+public class CommentsResponse {
+
+ public static final String JSON_PROPERTY_COMMENTS = "comments";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_COMMENTS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@Valid Comment> comments;
+
+ /**
+ * Add an item to the comments property in a chainable fashion.
+ *
+ * @return The same instance of CommentsResponse for chaining.
+ */
+ public CommentsResponse addCommentsItem(Comment commentsItem) {
+ if (comments == null) {
+ comments = new ArrayList<>();
+ }
+ comments.add(commentsItem);
+ return this;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CommunityPostSearchResponse.java b/src/main/java/lol/pbu/z4j/model/CommunityPostSearchResponse.java
new file mode 100644
index 0000000..290eef5
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CommunityPostSearchResponse.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * CommunityPostSearchResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(CommunityPostSearchResponse.JSON_PROPERTY_RESULTS)
+@Serdeable
+public class CommunityPostSearchResponse {
+
+ public static final String JSON_PROPERTY_RESULTS = "results";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RESULTS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@Valid Post> results;
+
+ /**
+ * Add an item to the results property in a chainable fashion.
+ *
+ * @return The same instance of CommunityPostSearchResponse for chaining.
+ */
+ public CommunityPostSearchResponse addResultsItem(Post resultsItem) {
+ if (results == null) {
+ results = new ArrayList<>();
+ }
+ results.add(resultsItem);
+ return this;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/ContentSubscription.java b/src/main/java/lol/pbu/z4j/model/ContentSubscription.java
new file mode 100644
index 0000000..f8976da
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/ContentSubscription.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * ContentSubscription
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder({
+ ContentSubscription.JSON_PROPERTY_LOCALE,
+ ContentSubscription.JSON_PROPERTY_CONTENT_ID,
+ ContentSubscription.JSON_PROPERTY_CONTENT_TYPE,
+ ContentSubscription.JSON_PROPERTY_CREATED_AT,
+ ContentSubscription.JSON_PROPERTY_ID,
+ ContentSubscription.JSON_PROPERTY_INCLUDE_COMMENTS,
+ ContentSubscription.JSON_PROPERTY_SOURCE_LOCALE,
+ ContentSubscription.JSON_PROPERTY_UPDATED_AT,
+ ContentSubscription.JSON_PROPERTY_URL,
+ ContentSubscription.JSON_PROPERTY_USER_ID,
+})
+@Serdeable
+public class ContentSubscription {
+
+ public static final String JSON_PROPERTY_LOCALE = "locale";
+ public static final String JSON_PROPERTY_CONTENT_ID = "content_id";
+ public static final String JSON_PROPERTY_CONTENT_TYPE = "content_type";
+ public static final String JSON_PROPERTY_CREATED_AT = "created_at";
+ public static final String JSON_PROPERTY_ID = "id";
+ public static final String JSON_PROPERTY_INCLUDE_COMMENTS = "include_comments";
+ public static final String JSON_PROPERTY_SOURCE_LOCALE = "source_locale";
+ public static final String JSON_PROPERTY_UPDATED_AT = "updated_at";
+ public static final String JSON_PROPERTY_URL = "url";
+ public static final String JSON_PROPERTY_USER_ID = "user_id";
+
+ /**
+ * The locale of the subscribed item
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_LOCALE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private LocaleAbbreviation localeAbbreviation;
+
+ /**
+ * The id of the subscribed item
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_CONTENT_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long contentId;
+
+ /**
+ * The type of the subscribed item
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_CONTENT_TYPE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String contentType;
+
+ /**
+ * The time at which the subscription was created
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_CREATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String createdAt;
+
+ /**
+ * Automatically assigned when the subscription is created
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long id;
+
+ /**
+ * Subscribe also to article comments / post comments. Only for section / topic subscriptions.
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_INCLUDE_COMMENTS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean includeComments;
+
+ /**
+ * Used only for Create Section Subscription and Create Article Subscription, where it's mandatory. Selects the locale of the content to be subscribed
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SOURCE_LOCALE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String sourceLocale;
+
+ /**
+ * The time at which the subscription was last updated
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String updatedAt;
+
+ /**
+ * The API url of the subscription
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_URL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String url;
+
+ /**
+ * The id of the user who has this subscription
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_USER_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long userId;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/ContentSubscriptionsResponse.java b/src/main/java/lol/pbu/z4j/model/ContentSubscriptionsResponse.java
new file mode 100644
index 0000000..1e081a1
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/ContentSubscriptionsResponse.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ContentSubscriptionsResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(ContentSubscriptionsResponse.JSON_PROPERTY_SUBSCRIPTIONS)
+@Serdeable
+public class ContentSubscriptionsResponse {
+
+ public static final String JSON_PROPERTY_SUBSCRIPTIONS = "subscriptions";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SUBSCRIPTIONS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@Valid ContentSubscription> subscriptions;
+
+ /**
+ * Add an item to the subscriptions property in a chainable fashion.
+ *
+ * @return The same instance of ContentSubscriptionsResponse for chaining.
+ */
+ public ContentSubscriptionsResponse addSubscriptionsItem(ContentSubscription subscriptionsItem) {
+ if (subscriptions == null) {
+ subscriptions = new ArrayList<>();
+ }
+ subscriptions.add(subscriptionsItem);
+ return this;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CreateCategoryRequest.java b/src/main/java/lol/pbu/z4j/model/CreateCategoryRequest.java
new file mode 100644
index 0000000..2417be2
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CreateCategoryRequest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * CreateCategoryRequest
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(CreateCategoryRequest.JSON_PROPERTY_CATEGORY)
+@Serdeable
+public class CreateCategoryRequest {
+
+ public static final String JSON_PROPERTY_CATEGORY = "category";
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_CATEGORY)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Category category;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CreateUserImageResponse.java b/src/main/java/lol/pbu/z4j/model/CreateUserImageResponse.java
new file mode 100644
index 0000000..66ad7ff
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CreateUserImageResponse.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * CreateUserImageResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(CreateUserImageResponse.JSON_PROPERTY_USER_IMAGE)
+@Serdeable
+public class CreateUserImageResponse {
+
+ public static final String JSON_PROPERTY_USER_IMAGE = "user_image";
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_USER_IMAGE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private CreateUserImageResponseUserImage userImage;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CreateUserImageResponseUserImage.java b/src/main/java/lol/pbu/z4j/model/CreateUserImageResponseUserImage.java
new file mode 100644
index 0000000..72851b9
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CreateUserImageResponseUserImage.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * CreateUserImageResponseUserImage
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder({
+ CreateUserImageResponseUserImage.JSON_PROPERTY_CONTENT_TYPE,
+ CreateUserImageResponseUserImage.JSON_PROPERTY_PATH,
+ CreateUserImageResponseUserImage.JSON_PROPERTY_SIZE,
+})
+@Serdeable
+public class CreateUserImageResponseUserImage {
+
+ public static final String JSON_PROPERTY_CONTENT_TYPE = "content_type";
+ public static final String JSON_PROPERTY_PATH = "path";
+ public static final String JSON_PROPERTY_SIZE = "size";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_CONTENT_TYPE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String contentType;
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_PATH)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String path;
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SIZE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private BigDecimal size;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CreateUserSegmentRequest.java b/src/main/java/lol/pbu/z4j/model/CreateUserSegmentRequest.java
new file mode 100644
index 0000000..a174df9
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CreateUserSegmentRequest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * CreateUserSegmentRequest
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(CreateUserSegmentRequest.JSON_PROPERTY_USER_SEGMENT)
+@Serdeable
+public class CreateUserSegmentRequest {
+
+ public static final String JSON_PROPERTY_USER_SEGMENT = "user_segment";
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_USER_SEGMENT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private UserSegment userSegment;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CustomField.java b/src/main/java/lol/pbu/z4j/model/CustomField.java
new file mode 100644
index 0000000..99658dd
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CustomField.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * CustomField
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(CustomField.JSON_PROPERTY_PROPERTIES)
+@Serdeable
+public class CustomField {
+
+ public static final String JSON_PROPERTY_PROPERTIES = "properties";
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_PROPERTIES)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private CustomFieldProperties properties;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CustomFieldOption.java b/src/main/java/lol/pbu/z4j/model/CustomFieldOption.java
new file mode 100644
index 0000000..38b36d2
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CustomFieldOption.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.constraints.NotNull;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * CustomFieldOptionObject
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@EqualsAndHashCode
+@ToString
+@Getter
+@Setter
+@JsonPropertyOrder({
+ CustomFieldOption.JSON_PROPERTY_NAME,
+ CustomFieldOption.JSON_PROPERTY_VALUE,
+ CustomFieldOption.JSON_PROPERTY_ID,
+ CustomFieldOption.JSON_PROPERTY_POSITION,
+ CustomFieldOption.JSON_PROPERTY_RAW_NAME,
+ CustomFieldOption.JSON_PROPERTY_URL,
+})
+@Serdeable
+public class CustomFieldOption {
+
+ public static final String JSON_PROPERTY_NAME = "name";
+ public static final String JSON_PROPERTY_VALUE = "value";
+ public static final String JSON_PROPERTY_ID = "id";
+ public static final String JSON_PROPERTY_POSITION = "position";
+ public static final String JSON_PROPERTY_RAW_NAME = "raw_name";
+ public static final String JSON_PROPERTY_URL = "url";
+
+ /**
+ * Name of the dropdown option
+ */
+ @NotNull
+ @JsonProperty(JSON_PROPERTY_NAME)
+ private String name;
+
+ /**
+ * Value of the dropdown option
+ */
+ @NotNull
+ @JsonProperty(JSON_PROPERTY_VALUE)
+ private String value;
+
+ /**
+ * Automatically assigned upon creation
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long id;
+
+ /**
+ * Position of the dropdown option
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_POSITION)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Integer position;
+
+ /**
+ * Raw name of the dropdown option
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RAW_NAME)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String rawName;
+
+ /**
+ * URL of the dropdown option
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_URL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String url;
+
+ public CustomFieldOption(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/CustomFieldProperties.java b/src/main/java/lol/pbu/z4j/model/CustomFieldProperties.java
new file mode 100644
index 0000000..5383a89
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/CustomFieldProperties.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * A set of properties which describe the standard::name field's autonumbering and uniqueness behavior. Autonumbering and uniqueness can't be used together
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder({
+ CustomFieldProperties.JSON_PROPERTY_AUTOINCREMENT_ENABLED,
+ CustomFieldProperties.JSON_PROPERTY_AUTOINCREMENT_NEXT_SEQUENCE,
+ CustomFieldProperties.JSON_PROPERTY_AUTOINCREMENT_PADDING,
+ CustomFieldProperties.JSON_PROPERTY_AUTOINCREMENT_PREFIX,
+ CustomFieldProperties.JSON_PROPERTY_IS_UNIQUE,
+})
+@Serdeable
+public class CustomFieldProperties {
+
+ public static final String JSON_PROPERTY_AUTOINCREMENT_ENABLED = "autoincrement_enabled";
+ public static final String JSON_PROPERTY_AUTOINCREMENT_NEXT_SEQUENCE = "autoincrement_next_sequence";
+ public static final String JSON_PROPERTY_AUTOINCREMENT_PADDING = "autoincrement_padding";
+ public static final String JSON_PROPERTY_AUTOINCREMENT_PREFIX = "autoincrement_prefix";
+ public static final String JSON_PROPERTY_IS_UNIQUE = "is_unique";
+
+ /**
+ * Turns autonumbering on or off
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_AUTOINCREMENT_ENABLED)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean autoincrementEnabled;
+
+ /**
+ * The next number in the autonumbering sequence. It can't be negative or less than the current autonumbering value
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_AUTOINCREMENT_NEXT_SEQUENCE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Integer autoincrementNextSequence;
+
+ /**
+ * Sets the number of digits for autogenerated numbers. Valid values are 0-9
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_AUTOINCREMENT_PADDING)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Integer autoincrementPadding;
+
+ /**
+ * A prefix to autogenerated numbers that can't exceed 30 characters
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_AUTOINCREMENT_PREFIX)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String autoincrementPrefix;
+
+ /**
+ * Turns uniqueness on or off
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_IS_UNIQUE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean isUnique;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/EmailCC.java b/src/main/java/lol/pbu/z4j/model/EmailCC.java
new file mode 100644
index 0000000..02ede69
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/EmailCC.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * EmailCC
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder({
+ EmailCC.JSON_PROPERTY_ACTION,
+ EmailCC.JSON_PROPERTY_USER_EMAIL,
+ EmailCC.JSON_PROPERTY_USER_ID,
+ EmailCC.JSON_PROPERTY_USER_NAME,
+})
+@Serdeable
+public class EmailCC {
+
+ public static final String JSON_PROPERTY_ACTION = "action";
+ public static final String JSON_PROPERTY_USER_EMAIL = "user_email";
+ public static final String JSON_PROPERTY_USER_ID = "user_id";
+ public static final String JSON_PROPERTY_USER_NAME = "user_name";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_ACTION)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private EmailCCAllOfAction action;
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_USER_EMAIL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String userEmail;
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_USER_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String userId;
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_USER_NAME)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String userName;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/EmailCCAllOfAction.java b/src/main/java/lol/pbu/z4j/model/EmailCCAllOfAction.java
new file mode 100644
index 0000000..35f65ec
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/EmailCCAllOfAction.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonValue;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Gets or Sets EmailCC_allOf_action
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@RequiredArgsConstructor
+@Getter(onMethod_ = {@JsonValue})
+@Serdeable
+public enum EmailCCAllOfAction {
+
+ @JsonProperty("put")
+ PUT("put"),
+
+ @JsonProperty("delete")
+ DELETE("delete"),
+ ;
+
+ public static final Maptitle or details. Note that only edits made after May 17, 2021 will be reflected in this field. If no non-author edits have occured since May 17, 2021, then this field will be null.
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_NON_AUTHOR_EDITOR_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long nonAuthorEditorId;
+
+ /**
+ * When the post was last edited by a non-author user
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_NON_AUTHOR_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private ZonedDateTime nonAuthorUpdatedAt;
+
+ /**
+ * When true, pins the post to the top of its topic
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_PINNED)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean pinned;
+
+ /**
+ * The status of the post. Possible values: \"planned\", \"not_planned\" , \"answered\", or \"completed\"
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_STATUS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String status;
+
+ /**
+ * The id of the topic that the post belongs to
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_TOPIC_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long topicId;
+
+ /**
+ * When the post was last updated
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private ZonedDateTime updatedAt;
+
+ /**
+ * The API url of the post
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_URL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String url;
+
+ /**
+ * The total number of upvotes and downvotes
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VOTE_COUNT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long voteCount;
+
+ /**
+ * The sum of upvotes (+1) and downvotes (-1), which may be positive or negative
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VOTE_SUM)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long voteSum;
+
+ public Post(String title) {
+ this.title = title;
+ }
+
+ /**
+ * Add an item to the contentTagIds property in a chainable fashion.
+ *
+ * @return The same instance of Post for chaining.
+ */
+ public Post addContentTagIdsItem(Long contentTagIdsItem) {
+ if (contentTagIds == null) {
+ contentTagIds = new ArrayList<>();
+ }
+ contentTagIds.add(contentTagIdsItem);
+ return this;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/PostComment.java b/src/main/java/lol/pbu/z4j/model/PostComment.java
new file mode 100644
index 0000000..7843a38
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/PostComment.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.constraints.NotNull;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.time.ZonedDateTime;
+
+/**
+ * PostComment
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@EqualsAndHashCode
+@ToString
+@Getter
+@Setter
+@JsonPropertyOrder({
+ PostComment.JSON_PROPERTY_BODY,
+ PostComment.JSON_PROPERTY_AUTHOR_ID,
+ PostComment.JSON_PROPERTY_CREATED_AT,
+ PostComment.JSON_PROPERTY_HTML_URL,
+ PostComment.JSON_PROPERTY_ID,
+ PostComment.JSON_PROPERTY_NON_AUTHOR_EDITOR_ID,
+ PostComment.JSON_PROPERTY_NON_AUTHOR_UPDATED_AT,
+ PostComment.JSON_PROPERTY_OFFICIAL,
+ PostComment.JSON_PROPERTY_POST_ID,
+ PostComment.JSON_PROPERTY_UPDATED_AT,
+ PostComment.JSON_PROPERTY_URL,
+ PostComment.JSON_PROPERTY_VOTE_COUNT,
+ PostComment.JSON_PROPERTY_VOTE_SUM,
+})
+@Serdeable
+public class PostComment implements SearchResultsInner {
+
+ public static final String JSON_PROPERTY_BODY = "body";
+ public static final String JSON_PROPERTY_AUTHOR_ID = "author_id";
+ public static final String JSON_PROPERTY_CREATED_AT = "created_at";
+ public static final String JSON_PROPERTY_HTML_URL = "html_url";
+ public static final String JSON_PROPERTY_ID = "id";
+ public static final String JSON_PROPERTY_NON_AUTHOR_EDITOR_ID = "non_author_editor_id";
+ public static final String JSON_PROPERTY_NON_AUTHOR_UPDATED_AT = "non_author_updated_at";
+ public static final String JSON_PROPERTY_OFFICIAL = "official";
+ public static final String JSON_PROPERTY_POST_ID = "post_id";
+ public static final String JSON_PROPERTY_UPDATED_AT = "updated_at";
+ public static final String JSON_PROPERTY_URL = "url";
+ public static final String JSON_PROPERTY_VOTE_COUNT = "vote_count";
+ public static final String JSON_PROPERTY_VOTE_SUM = "vote_sum";
+
+ /**
+ * The comment made by the author. See User content
+ */
+ @NotNull
+ @JsonProperty(JSON_PROPERTY_BODY)
+ private String body;
+
+ /**
+ * The id of the author of the comment. Writable on create by Help Center managers. See Create Post Comment
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_AUTHOR_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long authorId;
+
+ /**
+ * When the comment was created. Writable on create by Help Center managers. See Create Post Comment
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_CREATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String createdAt;
+
+ /**
+ * The community url of the comment
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_HTML_URL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String htmlUrl;
+
+ /**
+ * Automatically assigned when the comment is created
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long id;
+
+ /**
+ * The user id of whoever performed the most recent (if any) non-author edit. A non-author edit consists of an edit make by a user other than the author that creates or updates the body. Note that only edits made after May 17, 2021 will be reflected in this field. If no non-author edits have occured since May 17, 2021, then this field will be null.
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_NON_AUTHOR_EDITOR_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long nonAuthorEditorId;
+
+ /**
+ * When the comment was last edited by a non-author user
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_NON_AUTHOR_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private ZonedDateTime nonAuthorUpdatedAt;
+
+ /**
+ * Whether the comment is marked as official
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_OFFICIAL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean official;
+
+ /**
+ * The id of the post on which the comment was made
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_POST_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long postId;
+
+ /**
+ * When the comment was last updated
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String updatedAt;
+
+ /**
+ * The API url of the comment
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_URL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String url;
+
+ /**
+ * The total number of upvotes and downvotes
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VOTE_COUNT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long voteCount;
+
+ /**
+ * The sum of upvotes (+1) and downvotes (-1), which may be positive or negative
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VOTE_SUM)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long voteSum;
+
+ public PostComment(String body) {
+ this.body = body;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/PostCommentResponse.java b/src/main/java/lol/pbu/z4j/model/PostCommentResponse.java
new file mode 100644
index 0000000..a237a65
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/PostCommentResponse.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * PostCommentResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(PostCommentResponse.JSON_PROPERTY_COMMENT)
+@Serdeable
+public class PostCommentResponse {
+
+ public static final String JSON_PROPERTY_COMMENT = "comment";
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_COMMENT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private PostComment comment;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/PostCommentsResponse.java b/src/main/java/lol/pbu/z4j/model/PostCommentsResponse.java
new file mode 100644
index 0000000..ba84ea4
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/PostCommentsResponse.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * PostCommentsResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(PostCommentsResponse.JSON_PROPERTY_COMMENTS)
+@Serdeable
+public class PostCommentsResponse {
+
+ public static final String JSON_PROPERTY_COMMENTS = "comments";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_COMMENTS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@Valid PostComment> comments;
+
+ /**
+ * Add an item to the comments property in a chainable fashion.
+ *
+ * @return The same instance of PostCommentsResponse for chaining.
+ */
+ public PostCommentsResponse addCommentsItem(PostComment commentsItem) {
+ if (comments == null) {
+ comments = new ArrayList<>();
+ }
+ comments.add(commentsItem);
+ return this;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/PostResponse.java b/src/main/java/lol/pbu/z4j/model/PostResponse.java
new file mode 100644
index 0000000..63ec90f
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/PostResponse.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * PostResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(PostResponse.JSON_PROPERTY_POST)
+@Serdeable
+public class PostResponse {
+
+ public static final String JSON_PROPERTY_POST = "post";
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_POST)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Post post;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/PostsResponse.java b/src/main/java/lol/pbu/z4j/model/PostsResponse.java
new file mode 100644
index 0000000..2c8ed07
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/PostsResponse.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * PostsResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(PostsResponse.JSON_PROPERTY_POSTS)
+@Serdeable
+public class PostsResponse {
+
+ public static final String JSON_PROPERTY_POSTS = "posts";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_POSTS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@Valid Post> posts;
+
+ /**
+ * Add an item to the posts property in a chainable fashion.
+ *
+ * @return The same instance of PostsResponse for chaining.
+ */
+ public PostsResponse addPostsItem(Post postsItem) {
+ if (posts == null) {
+ posts = new ArrayList<>();
+ }
+ posts.add(postsItem);
+ return this;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/RequestUserImageUploadResponse.java b/src/main/java/lol/pbu/z4j/model/RequestUserImageUploadResponse.java
new file mode 100644
index 0000000..12ada04
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/RequestUserImageUploadResponse.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * RequestUserImageUploadResponse
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder(RequestUserImageUploadResponse.JSON_PROPERTY_UPLOAD)
+@Serdeable
+public class RequestUserImageUploadResponse {
+
+ public static final String JSON_PROPERTY_UPLOAD = "upload";
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_UPLOAD)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private RequestUserImageUploadResponseUpload upload;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/RequestUserImageUploadResponseUpload.java b/src/main/java/lol/pbu/z4j/model/RequestUserImageUploadResponseUpload.java
new file mode 100644
index 0000000..c8dde7e
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/RequestUserImageUploadResponseUpload.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * RequestUserImageUploadResponseUpload
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder({
+ RequestUserImageUploadResponseUpload.JSON_PROPERTY_HEADERS,
+ RequestUserImageUploadResponseUpload.JSON_PROPERTY_TOKEN,
+ RequestUserImageUploadResponseUpload.JSON_PROPERTY_URL,
+})
+@Serdeable
+public class RequestUserImageUploadResponseUpload {
+
+ public static final String JSON_PROPERTY_HEADERS = "headers";
+ public static final String JSON_PROPERTY_TOKEN = "token";
+ public static final String JSON_PROPERTY_URL = "url";
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_HEADERS)
+ @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS)
+ private MapDefault order if no other order is selected
+ */ + POSITION("position"), + /** + * Order alphabetically by title. Must specify a locale in associated query + */ + TITLE("title"), + /** + * Order by creation time + */ + CREATED_AT("created_at"), + /** + * Order by update time + */ + UPDATED_AT("updated_at"), + /** + * Order by the last time the title or body was edited. Must specify a locale in associated query + */ + EDITED_AT("edited_at"), + ; + + public static final Mapcomment to set the description. See Description and first comment
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_DESCRIPTION)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String description;
+
+ /**
+ * If this is a ticket of type \"task\" it has a due date. Due date format uses ISO 8601 format
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_DUE_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private ZonedDateTime dueAt;
+
+ /**
+ * The ids of agents or end users currently CC'ed on the ticket. Ignored when CCs and followers is not enabled
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_EMAIL_CC_IDS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@NotNull Long> emailCcIds;
+
+ /**
+ * Write only. An array of objects that represents agent or end users email CCs to add or delete from the ticket. See Setting email CCs. Ignored when CCs and followers is not enabled
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_EMAIL_CCS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Object emailCcs;
+
+ /**
+ * An id you can use to link Zendesk Support tickets to local records
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_EXTERNAL_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String externalId;
+
+ /**
+ * The ids of agents currently following the ticket. Ignored when CCs and followers is not enabled
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_FOLLOWER_IDS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@NotNull Long> followerIds;
+
+ /**
+ * Write only. An array of objects that represents agent followers to add or delete from the ticket. See Setting followers. Ignored when CCs and followers is not enabled
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_FOLLOWERS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Object followers;
+
+ /**
+ * The ids of the followups created from this ticket. Ids are only visible once the ticket is closed
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_FOLLOWUP_IDS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@NotNull Long> followupIds;
+
+ /**
+ * The topic in the Zendesk Web portal this ticket originated from, if any. The Web portal is deprecated
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_FORUM_TOPIC_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long forumTopicId;
+
+ /**
+ * If true, the ticket's via type is a messaging channel.
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_FROM_MESSAGING_CHANNEL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean fromMessagingChannel;
+
+ /**
+ * A Unix timestamp that represents the most accurate reading of when this record was last updated. It is updated for all ticket updates, including system updates
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_GENERATED_TIMESTAMP)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long generatedTimestamp;
+
+ /**
+ * The group this ticket is assigned to
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_GROUP_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long groupId;
+
+ /**
+ * Is true if a ticket is a problem type and has one or more incidents linked to it. Otherwise, the value is false.
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_HAS_INCIDENTS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean hasIncidents;
+
+ /**
+ * Automatically assigned when the ticket is created
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long id;
+
+ /**
+ * Is true if any comments are public, false otherwise
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_IS_PUBLIC)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean isPublic;
+
+ /**
+ * Write only. A macro ID to be recorded in the ticket audit
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_MACRO_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long macroId;
+
+ /**
+ * POST requests only. List of macro IDs to be recorded in the ticket audit
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_MACRO_IDS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@NotNull Long> macroIds;
+
+ /**
+ * Write only. Metadata for the audit. In the audit object, the data is specified in the custom property of the metadata object. See Setting Metadata
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_METADATA)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Object metadata;
+
+ /**
+ * The organization of the requester. You can only specify the ID of an organization associated with the requester. See Organization Memberships
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_ORGANIZATION_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long organizationId;
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_PRIORITY)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private TicketPriority priority;
+
+ /**
+ * For tickets of type \"incident\", the ID of the problem the incident is linked to
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_PROBLEM_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long problemId;
+
+ /**
+ * The dynamic content placeholder, if present, or the \"subject\" value, if not. See Dynamic Content Items
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RAW_SUBJECT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String rawSubject;
+
+ /**
+ * The original recipient e-mail address of the ticket. Notification emails for the ticket are sent from this address
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RECIPIENT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String recipient;
+
+ /**
+ * Write only. See Creating a ticket with a new requester
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_REQUESTER)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Object requester;
+
+ /**
+ * Write only. Optional boolean. When true and an update_stamp date is included, protects against ticket update collisions and returns a message to let you know if one occurs. See Protecting against ticket update collisions. A value of false has the same effect as true. Omit the property to force the updates to not be safe
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SAFE_UPDATE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean safeUpdate;
+
+ /**
+ * The satisfaction rating of the ticket, if it exists, or the state of satisfaction, \"offered\" or \"unoffered\". The value is null for plan types that don't support CSAT
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SATISFACTION_RATING)
+ @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS)
+ private Mapsafe_update property
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_UPDATED_STAMP)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String updatedStamp;
+
+ /**
+ * The API url of this ticket
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_URL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String url;
+
+ @Nullable
+ @Valid
+ @JsonProperty(JSON_PROPERTY_VIA)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private TicketVia via;
+
+ /**
+ * POST requests only. The id of a closed ticket when creating a follow-up ticket. See Creating a follow-up ticket
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VIA_FOLLOWUP_SOURCE_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long viaFollowupSourceId;
+
+ /**
+ * Write only. For more information, see the Via object reference
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VIA_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long viaId;
+
+ /**
+ * Write only. See Creating voicemail ticket
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VOICE_COMMENT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Object voiceComment;
+
+ public Ticket(Long requesterId) {
+ this.requesterId = requesterId;
+ }
+
+ /**
+ * Add an item to the attributeValueIds property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addAttributeValueIdsItem(Long attributeValueIdsItem) {
+ if (attributeValueIds == null) {
+ attributeValueIds = new ArrayList<>();
+ }
+ attributeValueIds.add(attributeValueIdsItem);
+ return this;
+ }
+
+ /**
+ * Add an item to the collaboratorIds property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addCollaboratorIdsItem(Long collaboratorIdsItem) {
+ if (collaboratorIds == null) {
+ collaboratorIds = new ArrayList<>();
+ }
+ collaboratorIds.add(collaboratorIdsItem);
+ return this;
+ }
+
+ /**
+ * Add an item to the collaborators property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addCollaboratorsItem(Collaborator collaboratorsItem) {
+ if (collaborators == null) {
+ collaborators = new ArrayList<>();
+ }
+ collaborators.add(collaboratorsItem);
+ return this;
+ }
+
+ /**
+ * Add an item to the customFields property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addCustomFieldsItem(TicketCustomFieldsInner customFieldsItem) {
+ if (customFields == null) {
+ customFields = new ArrayList<>();
+ }
+ customFields.add(customFieldsItem);
+ return this;
+ }
+
+ /**
+ * Add an item to the emailCcIds property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addEmailCcIdsItem(Long emailCcIdsItem) {
+ if (emailCcIds == null) {
+ emailCcIds = new ArrayList<>();
+ }
+ emailCcIds.add(emailCcIdsItem);
+ return this;
+ }
+
+ /**
+ * Add an item to the followerIds property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addFollowerIdsItem(Long followerIdsItem) {
+ if (followerIds == null) {
+ followerIds = new ArrayList<>();
+ }
+ followerIds.add(followerIdsItem);
+ return this;
+ }
+
+ /**
+ * Add an item to the macroIds property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addMacroIdsItem(Long macroIdsItem) {
+ if (macroIds == null) {
+ macroIds = new ArrayList<>();
+ }
+ macroIds.add(macroIdsItem);
+ return this;
+ }
+
+ /**
+ * Add an item to the sharingAgreementIds property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addSharingAgreementIdsItem(Long sharingAgreementIdsItem) {
+ if (sharingAgreementIds == null) {
+ sharingAgreementIds = new ArrayList<>();
+ }
+ sharingAgreementIds.add(sharingAgreementIdsItem);
+ return this;
+ }
+
+ /**
+ * Add an item to the tags property in a chainable fashion.
+ *
+ * @return The same instance of Ticket for chaining.
+ */
+ public Ticket addTagsItem(String tagsItem) {
+ if (tags == null) {
+ tags = new ArrayList<>();
+ }
+ tags.add(tagsItem);
+ return this;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/TicketAuditVia.java b/src/main/java/lol/pbu/z4j/model/TicketAuditVia.java
new file mode 100644
index 0000000..ae9d644
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/TicketAuditVia.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.Map;
+
+/**
+ * Describes how the object was created. See the Via object reference
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder({
+ TicketAuditVia.JSON_PROPERTY_CHANNEL,
+ TicketAuditVia.JSON_PROPERTY_SOURCE,
+})
+@Serdeable
+public class TicketAuditVia {
+
+ public static final String JSON_PROPERTY_CHANNEL = "channel";
+ public static final String JSON_PROPERTY_SOURCE = "source";
+
+ /**
+ * This tells you how the ticket or event was created. Examples: \"web\", \"mobile\", \"rule\", \"system\"
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_CHANNEL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String channel;
+
+ /**
+ * For some channels a source object gives more information about how or why the ticket or event was created
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SOURCE)
+ @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS)
+ private Mapdescription value if not. See Dynamic Content
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RAW_DESCRIPTION)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String rawDescription;
+
+ /**
+ * The dynamic content placeholder if present, or the title value if not. See Dynamic Content
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RAW_TITLE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String rawTitle;
+
+ /**
+ * The dynamic content placeholder if present, or the \"title_in_portal\" value if not. See Dynamic Content
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RAW_TITLE_IN_PORTAL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String rawTitleInPortal;
+
+ /**
+ * For \"regexp\" fields only. The validation pattern for a field value to be deemed valid
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_REGEXP_FOR_VALIDATION)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String regexpForValidation;
+
+ /**
+ * A filter definition that allows your autocomplete to filter down results
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RELATIONSHIP_FILTER)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Object relationshipFilter;
+
+ /**
+ * A representation of what type of object the field references. Options are \"zen:user\", \"zen:organization\", \"zen:ticket\", or \"zen:custom_object:{key}\" where key is a custom object key. For example \"zen:custom_object:apartment\".
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_RELATIONSHIP_TARGET_TYPE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String relationshipTargetType;
+
+ /**
+ * If false, this field is a system field that must be present on all tickets
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_REMOVABLE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean removable;
+
+ /**
+ * If true, agents must enter a value in the field to change the ticket status to solved
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_REQUIRED)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean required;
+
+ /**
+ * If true, end users must enter a value in the field to create the request
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_REQUIRED_IN_PORTAL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean requiredInPortal;
+
+ /**
+ * For system ticket fields of type \"priority\" and \"status\". Defaults to 0. A \"priority\" sub type of 1 removes the \"Low\" and \"Urgent\" options. A \"status\" sub type of 1 adds the \"On-Hold\" option
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SUB_TYPE_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Integer subTypeId;
+
+ /**
+ * Presented for a system ticket field of type \"tickettype\", \"priority\" or \"status\"
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_SYSTEM_FIELD_OPTIONS)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private List<@Valid SystemFieldOptionObject> systemFieldOptions;
+
+ /**
+ * For \"checkbox\" fields only. A tag added to tickets when the checkbox field is selected
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_TAG)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String tag;
+
+ /**
+ * The title of the ticket field for end users in Help Center
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_TITLE_IN_PORTAL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String titleInPortal;
+
+ /**
+ * The time the custom ticket field was last updated
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private ZonedDateTime updatedAt;
+
+ /**
+ * The URL for this resource
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_URL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String url;
+
+ /**
+ * Whether this field is visible to end users in Help Center
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_VISIBLE_IN_PORTAL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean visibleInPortal;
+
+ public TicketField(String title, String type) {
+ this.title = title;
+ this.type = type;
+ }
+
+ /**
+ * Add an item to the customFieldOptions property in a chainable fashion.
+ *
+ * @return The same instance of TicketFieldObject for chaining.
+ */
+ public TicketField addCustomFieldOptionsItem(CustomFieldOption customFieldOptionsItem) {
+ if (customFieldOptions == null) {
+ customFieldOptions = new ArrayList<>();
+ }
+ customFieldOptions.add(customFieldOptionsItem);
+ return this;
+ }
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/TicketFieldCreateRequest.java b/src/main/java/lol/pbu/z4j/model/TicketFieldCreateRequest.java
new file mode 100644
index 0000000..6365d4b
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/TicketFieldCreateRequest.java
@@ -0,0 +1,16 @@
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+import lombok.experimental.Accessors;
+
+@Accessors(chain = true)
+@EqualsAndHashCode
+@ToString
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class TicketFieldCreateRequest {
+ @JsonProperty("ticket_field")
+ private TicketField ticketField;
+}
diff --git a/src/main/java/lol/pbu/z4j/model/TicketFieldCustomStatusObject.java b/src/main/java/lol/pbu/z4j/model/TicketFieldCustomStatusObject.java
new file mode 100644
index 0000000..adfb061
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/TicketFieldCustomStatusObject.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.time.ZonedDateTime;
+
+/**
+ * TicketFieldCustomStatusObject
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@JsonPropertyOrder({
+ TicketFieldCustomStatusObject.JSON_PROPERTY_ACTIVE,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_AGENT_LABEL,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_CREATED_AT,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_DEFAULT,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_DESCRIPTION,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_END_USER_DESCRIPTION,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_END_USER_LABEL,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_ID,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_STATUS_CATEGORY,
+ TicketFieldCustomStatusObject.JSON_PROPERTY_UPDATED_AT,
+})
+@Serdeable
+public class TicketFieldCustomStatusObject {
+
+ public static final String JSON_PROPERTY_ACTIVE = "active";
+ public static final String JSON_PROPERTY_AGENT_LABEL = "agent_label";
+ public static final String JSON_PROPERTY_CREATED_AT = "created_at";
+ public static final String JSON_PROPERTY_DEFAULT = "default";
+ public static final String JSON_PROPERTY_DESCRIPTION = "description";
+ public static final String JSON_PROPERTY_END_USER_DESCRIPTION = "end_user_description";
+ public static final String JSON_PROPERTY_END_USER_LABEL = "end_user_label";
+ public static final String JSON_PROPERTY_ID = "id";
+ public static final String JSON_PROPERTY_STATUS_CATEGORY = "status_category";
+ public static final String JSON_PROPERTY_UPDATED_AT = "updated_at";
+
+ /**
+ * If true, if the custom status is set to active. If false, the custom status is set to inactive
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_ACTIVE)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean active;
+
+ /**
+ * The label displayed to agents
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_AGENT_LABEL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String agentLabel;
+
+ /**
+ * The date and time at which the custom ticket status was created
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_CREATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private ZonedDateTime createdAt;
+
+ /**
+ * If true, the custom status is set to default. If false, the custom status is set to non-default
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_DEFAULT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Boolean isDefault;
+
+ /**
+ * The description of when the user should select this custom ticket status
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_DESCRIPTION)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String description;
+
+ /**
+ * The description displayed to end users
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_END_USER_DESCRIPTION)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String endUserDescription;
+
+ /**
+ * The label displayed to end users
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_END_USER_LABEL)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private String endUserLabel;
+
+ /**
+ * Automatically assigned when the custom ticket status is created
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_ID)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private Long id;
+
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_STATUS_CATEGORY)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private TicketFieldCustomStatusObjectStatusCategory statusCategory;
+
+ /**
+ * The date and time at which the custom ticket status was last updated
+ */
+ @Nullable
+ @JsonProperty(JSON_PROPERTY_UPDATED_AT)
+ @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
+ private ZonedDateTime updatedAt;
+
+}
diff --git a/src/main/java/lol/pbu/z4j/model/TicketFieldCustomStatusObjectStatusCategory.java b/src/main/java/lol/pbu/z4j/model/TicketFieldCustomStatusObjectStatusCategory.java
new file mode 100644
index 0000000..b457f9c
--- /dev/null
+++ b/src/main/java/lol/pbu/z4j/model/TicketFieldCustomStatusObjectStatusCategory.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package lol.pbu.z4j.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonValue;
+import io.micronaut.serde.annotation.Serdeable;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * The status category the custom ticket status belongs to
+ *
+ * @author Jonathan-Zollinger
+ * @since 0.1.1
+ */
+@RequiredArgsConstructor
+@Getter(onMethod_ = {@JsonValue})
+@Serdeable
+public enum TicketFieldCustomStatusObjectStatusCategory {
+
+ @JsonProperty("new")
+ NEW("new"),
+
+ @JsonProperty("open")
+ OPEN("open"),
+
+ @JsonProperty("pending")
+ PENDING("pending"),
+
+ @JsonProperty("hold")
+ HOLD("hold"),
+
+ @JsonProperty("solved")
+ SOLVED("solved"),
+ ;
+
+ public static final MapNote: Tags can't be re-used across custom ticket fields. For example, if you configure + * a tag for a checkbox field, you can't use that tag value for a dropdown (tagger) field option. The use of tags + * isn't validated and can prevent editing in the future.
+ * + * @author Jonathan-Zollinger + * @since 0.1.1 + */ +@RequiredArgsConstructor +@Getter(onMethod_ = {@JsonValue}) +@Serdeable +public enum TicketFieldTypeEnum { + + /** + *Default custom field type when type is not specified.
For multi-line text.
+ */ + @JsonProperty("textarea") TEXT_AREA("textarea"), + + /** + *To capture a boolean value. Allowed values are true or false.
+ *Optionally, you can specify a tag to be added to the ticket when the value is true.
+ */ + @JsonProperty("checkbox") CHECKBOX("checkbox"), + + /** + *String composed of numbers.
+ */ + @JsonProperty("integer") INTEGER("integer"), + + /** + *For numbers containing decimals.
+ */ + @JsonProperty("decimal") DECIMAL("decimal"), + + /** + *Matches the Regex pattern found in the custom field settings.
A credit card number. Only the last 4 digits are retained.
+ */ + @JsonProperty("partial_credit_card") PARTIAL_CREDIT_CARD("partial_credit_card"), + + /** + *It contains one or more tag values belonging to the field's options. {@see #TAGGER}
+ */ + @JsonProperty("multi-select") MULTI_SELECT("multi-select"), + + /** + *It contains one or more tag values belonging to the field's options. {@see #MULTI_SELECT}
+ *A field to create a relationship (see lookup relationships) to + * another object such as a user, ticket, or organization.
+ *The manageable_by attribute takes one of the following values:
| Value | Users |
|---|---|
| staff | agents and managers |
| managers | only Help Center managers |
Note that manageable_by is only displayed to users who can manage the topic.
The user_type attribute takes one of the following values:
| Value | Users |
|---|---|
| signed_in_users | only authenticated users |
| staff | only agents and Help Center managers |
For group_ids, organization_ids, tags, and or_tags, an empty array means that access is not restricted by the attribute. For example, if no group ids are specified, then users don't have to be in any specific group to have access.
For tags, a user must have all the listed tags to have access. For or_tags, a user must have at least one of the listed tags to have access.
Conversation with wp native
+ +URL: None
This is a new private comment
+ id: 2127301148 + public: false + type: Comment + - field_name: status + id: 2127301163 + previous_value: new + type: Change + value: open + via: + channel: rule + source: + from: + id: 22472716 + title: Assign to first responder + rel: trigger + to: { } + - field_name: custom_status_id + id: 2127301164 + previous_value: 1 + type: Change + value: 123 + via: + channel: rule + source: + from: + id: 22472716 + title: Assign to first responder + rel: trigger + to: { } + id: 2127301143 + metadata: + custom: { } + system: + client: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1 + ip_address: 76.218.201.212 + location: San Francisco, CA, United States + ticket_id: 666 + via: + channel: web + TicketAuditsCountResponseExample: + value: + count: + refreshed_at: "2020-04-06T02:18:17Z" + value: 18 + TicketAuditsForTicketResponseExample: + value: + audits: + - author_id: 5246746 + created_at: "2011-09-25T22:35:44Z" + events: + - attachments: [ ] + body: This is a new private comment + html_body:This is a new private comment
+ id: 2127301148 + public: false + type: Comment + - field_name: status + id: 2127301163 + previous_value: new + type: Change + value: open + via: + channel: rule + source: + from: + id: 35079792 + title: Assign to first responder + rel: trigger + to: { } + - field_name: custom_status_id + id: 2127301164 + previous_value: 1 + type: Change + value: 123 + via: + channel: rule + source: + from: + id: 22472716 + title: Assign to first responder + rel: trigger + to: { } + id: 2127301143 + metadata: + custom: { } + system: + client: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1 + ip_address: 76.218.201.212 + location: San Francisco, CA, United States + ticket_id: 666 + via: + channel: web + count: 1 + next_page: null + previous_page: null + TicketAuditsResponseExample: + value: + after_cursor: MTUwMTYwNzUyMi4wfHwxMzQ3NTMxNjcxfA== + after_url: https://subdomain.zendesk.com/api/v2/ticket_audits?cursor=MTUwMTYwNzUyMi4wfHwxMzQ3NTMxNjcxfA%3D%3D&limit=1000 + audits: + - author_id: 35436 + created_at: "2011-09-25T22:35:44Z" + events: + - attachments: [ ] + body: Thanks for your help! + id: 1564245 + public: true + type: Comment + - body: 'Ticket #47 has been updated' + id: 1564246 + subject: Your ticket has been updated + type: Notification + - field_name: status + id: 1564247 + previous_value: new + type: Change + value: open + - field_name: custom_status_id + id: 1564248 + previous_value: 1 + type: Change + value: 123 + id: 2127301143 + metadata: + custom: + time_spent: 3m22s + system: + ip_address: 184.106.40.75 + ticket_id: 123 + via: + channel: web + before_cursor: fDE1MDE1NzUxMjIuMHx8MTM0NzM0MzAxMQ== + before_url: https://subdomain.zendesk.com/api/v2/ticket_audits?cursor=fDE1MDE1NzUxMjIuMHx8MTM0NzM0MzAxMQ%3D%3D&limit=1000 + TicketBulkImportRequestExample: + value: + tickets: + - assignee_id: 19 + comments: + - author_id: 827 + created_at: "2009-06-25T10:15:18Z" + value: This is a comment + - author_id: 19 + public: false + value: This is a private comment + description: A description + requester_id: 827 + subject: Help + tags: + - foo + - bar + - assignee_id: 21 + comments: + - author_id: 830 + created_at: "2009-06-25T10:15:18Z" + value: This is a comment + - author_id: 21 + public: false + value: This is a private comment + description: A description + requester_id: 830 + subject: Missing Item + tags: + - foo + - bar + TicketChatCommentAttachmentRedactionResponseExample: + value: + chat_event: + id: 1932802680168 + type: ChatStartedEvent + value: + chat_id: 2109.10502823.Sjuj2YrBpXwei + history: + - chat_index: 0 + filename: redacted.txt + type: ChatFileAttachment + - chat_index: 1 + filename: redacted.txt + type: ChatFileAttachment + visitor_id: 10502823-16EkM3T6VNq7KMd + TicketChatCommentRedactionResponseExample: + value: + chat_event: + id: 1932802680168 + type: ChatStartedEvent + value: + chat_id: 2109.10502823.Sjuj2YrBpXwei + history: + - chat_index: 0 + message: My ID number is ▇▇▇▇! + type: ChatMessage + visitor_id: 10502823-16EkM3T6VNq7KMd + TicketCommentStringRedactResponseExample: + value: + comment: + author_id: 1 + id: 35436 + plain_body: My social security number is ▇▇▇▇! + type: Comment + TicketCommentsCountResponseExample: + value: + count: + refreshed_at: "2020-04-06T02:18:17Z" + value: 12 + TicketCommentsRedactionInAgentWorkspaceResponseExample: + value: + comment: + attachments: [ ] + author_id: 123 + id: 100 + plain_body: My ID number is ▇▇▇▇! + public: true + type: Comment + TicketCommentsResponseExample: + value: + comments: + - attachments: + - content_type: text/plain + content_url: https://company.zendesk.com/attachments/crash.log + file_name: crash.log + id: 498483 + size: 2532 + thumbnails: [ ] + audit_id: 432567 + author_id: 123123 + body: Thanks for your help! + created_at: "2009-07-20T22:55:29Z" + id: 1274 + metadata: + system: + client: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 + ip_address: 1.1.1.1 + latitude: -37.000000000001 + location: Melbourne, 07, Australia + longitude: 144.0000000000002 + via: + channel: web + source: + from: { } + rel: web_widget + to: { } + public: true + type: Comment + TicketContentPinExample: + value: + account_id: "124125123" + content_id: 01H04XB9F7XSYKNCCJ5BKBA1SM + content_type: external_content + created_at: "2009-07-20T22:55:29Z" + id: 01H04XAA433S53SRVPN0KKCTCZ + locale: en_US + ticket_id: "5" + url: https://{subdomain}.zendesk.com/hc/en-us/articles/34613040902417-how-to-reset-your-password + TicketContentPinsExample: + value: + count: 1 + ticket_content_pins: + - account_id: "124125123" + content_id: 01H04XB9F7XSYKNCCJ5BKBA1SM + content_type: external_content + created_at: "2009-07-20T22:55:29Z" + id: 01H04XAA433S53SRVPN0KKCTCZ + locale: en_US + ticket_id: "5" + url: https://{subdomain}.zendesk.com/hc/en-us/articles/34613040902417-how-to-reset-your-password + TicketCreateRequestExample: + value: + ticket: + comment: + body: The smoke is very colorful. + priority: urgent + subject: My printer is on fire! + TicketCreateTicketViaTalkRequestExample: + value: + display_to_agent: 1234 + ticket: + comment: + body: My printer is on fire! + priority: urgent + via_id: 46 + voice_comment: + answered_by_id: 28 + call_duration: 40 + from: "+16617480240" + location: Dublin, Ireland + recording_url: http://yourdomain.com/recordings/1.mp3 + started_at: "2019-04-16T09:14:57Z" + to: "+16617480123" + transcription_text: The transcription of the call + TicketFieldCountResponseExample: + value: + count: + refreshed_at: "2020-04-06T02:18:17Z" + value: 102 + TicketFieldResponseExample: + value: + ticket_field: + active: true + agent_description: Agent only description + collapsed_for_agents: false + created_at: "2012-04-02T22:55:29Z" + description: Age + editable_in_portal: false + id: 89 + position: 9999 + raw_description: Age + raw_title: Age + raw_title_in_portal: Age + regexp_for_validation: null + required: true + required_in_portal: false + tag: null + title: Age + title_in_portal: Age + type: text + updated_at: "2012-04-02T22:55:29Z" + url: https://company.zendesk.com/api/v2/ticket_fields/89 + visible_in_portal: false + TicketFieldUpdateResponseExample: + value: + ticket_field: + active: true + agent_description: Agent only description + collapsed_for_agents: false + created_at: "2012-04-02T22:55:29Z" + description: Your age + editable_in_portal: false + id: 89 + position: 9999 + raw_description: Your age + raw_title: Your age + raw_title_in_portal: Your age + regexp_for_validation: null + required: true + required_in_portal: false + tag: null + title: Your age + title_in_portal: Your age + type: text + updated_at: "2012-04-02T23:11:23Z" + url: https://company.zendesk.com/api/v2/ticket_fields/89 + visible_in_portal: false + TicketFieldsResponseExample: + value: + ticket_fields: + - active: true + agent_description: Agent only description + collapsed_for_agents: false + created_at: "2009-07-20T22:55:29Z" + description: This is the subject field of a ticket + editable_in_portal: true + id: 34 + position: 21 + raw_description: This is the subject field of a ticket + raw_title: '{{dc.my_title}}' + raw_title_in_portal: '{{dc.my_title_in_portal}}' + regexp_for_validation: null + required: true + required_in_portal: true + tag: null + title: Subject + title_in_portal: Subject + type: subject + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/ticket_fields/34 + visible_in_portal: true + TicketFieldsShowManyResponseExample: + value: + count: 2 + next_page: null + previous_page: null + ticket_fields: + - active: true + agent_description: Agent only description + collapsed_for_agents: false + created_at: "2009-07-20T22:55:29Z" + description: This is the subject field of a ticket + editable_in_portal: true + id: 34 + position: 21 + raw_description: This is the subject field of a ticket + raw_title: '{{dc.my_title}}' + raw_title_in_portal: '{{dc.my_title_in_portal}}' + regexp_for_validation: null + required: true + required_in_portal: true + tag: null + title: Subject + title_in_portal: Subject + type: subject + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/ticket_fields/34 + visible_in_portal: true + - active: true + agent_description: "" + collapsed_for_agents: false + created_at: "2009-07-20T22:55:29Z" + description: Request priority + editable_in_portal: false + id: 35 + position: 22 + raw_description: Request priority + raw_title: Priority + raw_title_in_portal: Priority + regexp_for_validation: null + required: false + required_in_portal: false + tag: null + title: Priority + title_in_portal: Priority + type: priority + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/ticket_fields/35 + visible_in_portal: true + TicketFormCreateResponseExample: + value: + ticket_form: + active: true + agent_conditions: + - child_fields: + - id: 44 + is_required: false + required_on_statuses: + statuses: + - new + - open + - pending + - hold + type: SOME_STATUSES + - id: 32 + is_required: true + required_on_statuses: + statuses: + - solved + type: SOME_STATUSES + parent_field_id: 5 + value: matching_value_1 + - child_fields: + - id: 44 + is_required: true + required_on_statuses: + type: ALL_STATUSES + - id: 32 + is_required: false + required_on_statuses: + type: NO_STATUSES + parent_field_id: 32 + value: matching_value_2 + created_at: "2012-04-02T22:55:29Z" + default: false + deleted_at: "2012-05-02T22:55:29Z" + display_name: Snowboard Damage + end_user_conditions: + - child_fields: + - id: 32 + is_required: true + parent_field_id: 5 + value: matching_value_1 + - child_fields: + - id: 44 + is_required: false + parent_field_id: 32 + value: matching_value_2 + end_user_visible: true + id: 47 + in_all_brands: false + name: Snowboard Problem + position: 9999 + raw_display_name: Snowboard Damage + raw_name: Snowboard Problem + restricted_brand_ids: + - 1 + - 4 + - 6 + - 12 + - 34 + ticket_field_ids: + - 2 + - 4 + - 5 + - 32 + - 44 + updated_at: "2012-04-02T22:55:29Z" + url: https://company.zendesk.com/api/v2/ticket_forms/47 + TicketFormResponseExample: + value: + ticket_form: + active: true + agent_conditions: + - child_fields: + - id: 44 + is_required: false + required_on_statuses: + statuses: + - new + - open + - pending + - hold + type: SOME_STATUSES + - id: 32 + is_required: true + required_on_statuses: + statuses: + - solved + type: SOME_STATUSES + parent_field_id: 5 + value: matching_value_1 + - child_fields: + - id: 44 + is_required: true + required_on_statuses: + type: ALL_STATUSES + - id: 32 + is_required: false + required_on_statuses: + type: NO_STATUSES + parent_field_id: 32 + value: matching_value_2 + created_at: "2012-04-02T22:55:29Z" + default: true + deleted_at: "2012-05-02T22:55:29Z" + display_name: Snowboard Damage + end_user_conditions: + - child_fields: + - id: 32 + is_required: true + parent_field_id: 5 + value: matching_value_1 + - child_fields: + - id: 44 + is_required: false + parent_field_id: 32 + value: matching_value_2 + end_user_visible: true + id: 47 + in_all_brands: false + name: Snowboard Problem + position: 9999 + raw_display_name: '{{dc.my_display_name}}' + raw_name: Snowboard Problem + restricted_brand_ids: + - 1 + - 4 + - 6 + - 12 + - 34 + ticket_field_ids: + - 2 + - 4 + - 5 + - 32 + - 44 + updated_at: "2012-04-02T22:55:29Z" + url: https://company.zendesk.com/api/v2/ticket_forms/47 + TicketFormStatusesResponseExample: + value: + ticket_form_statuses: + - custom_status_id: 7485541848574 + id: 01HFD81Y01D65FJ7EPNNM58GPK + ticket_form_id: 7485506877054 + TicketFormUpdateResponseExample: + value: + ticket_form: + active: true + agent_conditions: [ ] + created_at: "2012-04-02T22:55:29Z" + default: true + deleted_at: "2012-05-02T22:55:29Z" + display_name: Snowboard has been fixed + end_user_conditions: [ ] + end_user_visible: true + id: 47 + in_all_brands: true + name: Snowboard Fixed + position: 9999 + raw_display_name: Snowboard has been fixed + raw_name: Snowboard Fixed + restricted_brand_ids: [ ] + ticket_field_ids: + - 2 + - 4 + - 5 + - 32 + - 44 + updated_at: "2012-04-02T22:55:29Z" + url: https://company.zendesk.com/api/v2/ticket_forms/47 + TicketFormsResponseExample: + value: + ticket_forms: + - active: true + agent_conditions: + - child_fields: + - id: 44 + is_required: false + required_on_statuses: + statuses: + - new + - open + - pending + - hold + type: SOME_STATUSES + - id: 32 + is_required: true + required_on_statuses: + statuses: + - solved + type: SOME_STATUSES + parent_field_id: 5 + value: matching_value_1 + - child_fields: + - id: 44 + is_required: true + required_on_statuses: + type: ALL_STATUSES + - id: 32 + is_required: false + required_on_statuses: + type: NO_STATUSES + parent_field_id: 32 + value: matching_value_2 + created_at: "2012-04-02T22:55:29Z" + default: true + deleted_at: "2012-05-02T22:55:29Z" + display_name: Snowboard Damage + end_user_conditions: + - child_fields: + - id: 32 + is_required: true + parent_field_id: 5 + value: matching_value_1 + - child_fields: + - id: 44 + is_required: false + parent_field_id: 32 + value: matching_value_2 + end_user_visible: true + id: 47 + in_all_brands: false + name: Snowboard Problem + position: 9999 + raw_display_name: '{{dc.my_display_name}}' + raw_name: Snowboard Problem + restricted_brand_ids: + - 1 + - 4 + - 6 + - 12 + - 34 + ticket_field_ids: + - 2 + - 4 + - 5 + - 32 + - 44 + updated_at: "2012-04-02T22:55:29Z" + url: https://company.zendesk.com/api/v2/ticket_forms/47 + TicketImportRequestExample: + value: + ticket: + assignee_id: 19 + comments: + - author_id: 827 + created_at: "2009-06-25T10:15:18Z" + value: This is a comment + - author_id: 19 + public: false + value: This is a private comment + description: A description + requester_id: 827 + subject: Help + tags: + - foo + - bar + TicketMergeInputExample: + value: + ids: + - 123 + - 456 + - 789 + source_comment: 'Closing in favor of #111' + target_comment: 'Combining with #123, #456, #789' + TicketMetricEventsResponseExample: + value: + count: 3 + end_time: 1603716792 + next_page: https://company.zendesk.com/api/v2/incremental/ticket_metric_events?start_time=1603716792 + ticket_metric_events: + - id: 926232157301 + instance_id: 0 + metric: agent_work_time + ticket_id: 155 + time: "2020-10-26T12:53:12Z" + type: measure + - id: 926232757371 + instance_id: 1 + metric: agent_work_time + ticket_id: 155 + time: "2020-10-26T12:53:12Z" + type: activate + - id: 926232927415 + instance_id: 0 + metric: pausable_update_time + ticket_id: 155 + time: "2020-10-26T12:53:12Z" + type: measure + TicketMetricResponseExample: + value: + ticket_metric: + - agent_wait_time_in_minutes: + business: 0 + calendar: 0 + assigned_at: "2020-07-20T06:21:26Z" + assignee_stations: 0 + assignee_updated_at: "2020-07-20T06:21:26Z" + created_at: "2020-07-21T01:01:42Z" + first_resolution_time_in_minutes: + business: 0 + calendar: 0 + full_resolution_time_in_minutes: + business: 0 + calendar: 0 + group_stations: 0 + id: 33 + initially_assigned_at: "2020-07-20T06:21:26Z" + latest_comment_added_at: "2020-07-21T01:17:16Z" + on_hold_time_in_minutes: + business: 0 + calendar: 0 + reopens: 0 + replies: 1 + reply_time_in_minutes: + business: 16 + calendar: 16 + reply_time_in_seconds: + calendar: 960 + requester_updated_at: "2020-07-21T01:17:16Z" + requester_wait_time_in_minutes: + business: 0 + calendar: 0 + solved_at: "2020-07-20T06:21:26Z" + status_updated_at: "2020-07-21T01:01:41Z" + ticket_id: 1517 + updated_at: "2020-07-21T01:17:16Z" + url: https://example.zendesk.com/api/v2/ticket_metrics/33 + TicketMetricsResponseExample: + value: + ticket_metrics: + - agent_wait_time_in_minutes: + business: 0 + calendar: 0 + assigned_at: "2020-07-20T06:21:26Z" + assignee_stations: 0 + assignee_updated_at: "2020-07-20T06:21:26Z" + created_at: "2020-07-21T01:01:42Z" + first_resolution_time_in_minutes: + business: 0 + calendar: 0 + full_resolution_time_in_minutes: + business: 0 + calendar: 0 + group_stations: 0 + id: 33 + initially_assigned_at: "2020-07-20T06:21:26Z" + latest_comment_added_at: "2020-07-21T01:17:16Z" + on_hold_time_in_minutes: + business: 0 + calendar: 0 + reopens: 0 + replies: 1 + reply_time_in_minutes: + business: 16 + calendar: 16 + reply_time_in_seconds: + calendar: 960 + requester_updated_at: "2020-07-21T01:17:16Z" + requester_wait_time_in_minutes: + business: 0 + calendar: 0 + solved_at: "2020-07-20T06:21:26Z" + status_updated_at: "2020-07-21T01:01:41Z" + ticket_id: 1517 + updated_at: "2020-07-21T01:17:16Z" + url: https://example.zendesk.com/api/v2/ticket_metrics/33 + - agent_wait_time_in_minutes: + business: 0 + calendar: 0 + assigned_at: "2020-07-20T06:21:26Z" + assignee_stations: 0 + assignee_updated_at: "2020-07-20T06:21:26Z" + created_at: "2020-07-20T06:21:27Z" + first_resolution_time_in_minutes: + business: 0 + calendar: 0 + full_resolution_time_in_minutes: + business: 0 + calendar: 0 + group_stations: 0 + id: 34 + initially_assigned_at: "2020-07-20T06:21:26Z" + latest_comment_added_at: "2020-07-20T06:21:26Z" + on_hold_time_in_minutes: + business: 0 + calendar: 0 + reopens: 0 + replies: 0 + reply_time_in_minutes: + business: 0 + calendar: 0 + reply_time_in_seconds: + calendar: 0 + requester_updated_at: "2020-07-20T06:21:26Z" + requester_wait_time_in_minutes: + business: 0 + calendar: 0 + solved_at: "2020-07-20T06:21:26Z" + status_updated_at: "2020-07-20T06:21:26Z" + ticket_id: 1511 + updated_at: "2020-07-20T06:21:27Z" + url: https://example.zendesk.com/api/v2/ticket_metrics/34 + TicketRelatedInformationExample: + value: + followup_source_ids: [ ] + from_archive: false + incidents: 7 + jira_issue_ids: [ ] + topic_id: null + TicketResponseExample: + value: + ticket: + assignee_id: 235323 + collaborator_ids: + - 35334 + - 234 + created_at: "2009-07-20T22:55:29Z" + custom_fields: + - id: 27642 + value: "745" + - id: 27648 + value: "yes" + custom_status_id: 123 + description: The fire is very colorful. + due_at: null + external_id: ahg35h3jh + follower_ids: + - 35334 + - 234 + from_messaging_channel: false + generated_timestamp: 1304553600 + group_id: 98738 + has_incidents: false + id: 35436 + organization_id: 509974 + priority: high + problem_id: 9873764 + raw_subject: '{{dc.printer_on_fire}}' + recipient: support@company.com + requester_id: 20978392 + satisfaction_rating: + comment: Great support! + id: 1234 + score: good + sharing_agreement_ids: + - 84432 + status: open + subject: Help, my printer is on fire! + submitter_id: 76872 + tags: + - enterprise + - other_tag + type: incident + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/tickets/35436 + via: + channel: web + TicketSkipCreationExample: + value: + skip: + created_at: "2015-09-30T21:44:03Z" + id: 1 + reason: I have no idea. + ticket: + assignee_id: 235323 + collaborator_ids: + - 35334 + - 234 + created_at: "2009-07-20T22:55:29Z" + custom_fields: + - id: 27642 + value: "745" + - id: 27648 + value: "yes" + description: The fire is very colorful. + due_at: null + external_id: ahg35h3jh + follower_ids: + - 35334 + - 234 + from_messaging_channel: false + generated_timestamp: 1443575048 + group_id: 98738 + has_incidents: false + id: 123 + organization_id: 509974 + priority: high + problem_id: 9873764 + raw_subject: '{{dc.printer_on_fire}}' + recipient: support@company.com + requester_id: 20978392 + satisfaction_rating: + comment: Great support! + id: 1234 + score: good + sharing_agreement_ids: + - 84432 + status: open + subject: Help, my printer is on fire! + submitter_id: 76872 + tags: + - enterprise + - other_tag + type: incident + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/tickets/35436 + via: + channel: web + ticket_id: 123 + updated_at: "2015-09-30T21:44:03Z" + user_id: 456 + TicketSkipResponseExample: + value: + skips: + - created_at: "2015-09-30T21:44:03Z" + id: 1 + reason: I have no idea. + ticket: + assignee_id: 235323 + collaborator_ids: + - 35334 + - 234 + created_at: "2009-07-20T22:55:29Z" + custom_fields: + - id: 27642 + value: "745" + - id: 27648 + value: "yes" + description: The fire is very colorful. + due_at: null + external_id: ahg35h3jh + follower_ids: + - 35334 + - 234 + from_messaging_channel: false + generated_timestamp: 1304553600 + group_id: 98738 + has_incidents: false + id: 123 + organization_id: 509974 + priority: high + problem_id: 9873764 + raw_subject: '{{dc.printer_on_fire}}' + recipient: support@company.com + requester_id: 20978392 + satisfaction_rating: + comment: Great support! + id: 1234 + score: good + sharing_agreement_ids: + - 84432 + status: open + subject: Help, my printer is on fire! + submitter_id: 76872 + tags: + - enterprise + - other_tag + type: incident + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/tickets/35436 + via: + channel: web + ticket_id: 123 + updated_at: "2015-09-30T21:44:03Z" + user_id: 456 + - created_at: "2015-10-01T21:44:03Z" + id: 2 + reason: I am lost. + ticket: + assignee_id: 235323 + collaborator_ids: + - 35334 + - 234 + created_at: "2009-07-20T22:55:29Z" + custom_fields: + - id: 27642 + value: "745" + - id: 27648 + value: "yes" + description: The fire is very colorful. + due_at: null + external_id: ahg35h3jh + follower_ids: + - 35334 + - 234 + from_messaging_channel: false + generated_timestamp: 1304553600 + group_id: 98738 + has_incidents: false + id: 321 + organization_id: 509974 + priority: high + problem_id: 9873764 + raw_subject: '{{dc.printer_on_fire}}' + recipient: support@company.com + requester_id: 20978392 + satisfaction_rating: + comment: Great support! + id: 1234 + score: good + sharing_agreement_ids: + - 84432 + status: open + subject: Help, my printer is on fire! + submitter_id: 76872 + tags: + - enterprise + - other_tag + type: incident + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/tickets/35436 + via: + channel: web + ticket_id: 321 + updated_at: "2015-10-01T21:44:03Z" + user_id: 654 + TicketUpdateRequestExample: + value: + ticket: + comment: + body: Thanks for choosing Acme Jet Motors. + public: true + custom_status_id: 321 + status: solved + TicketUpdateResponseExample: + value: + audit: + events: + - field_name: subject + id: 206091192546 + type: Create + value: My printer is on fire! + - body: The smoke is very colorful. + id: 206091192547 + type: Comment + - field_name: status + id: 206091192548 + type: Create + value: open + - field_name: custom_status_id + id: 206091192549 + type: Create + value: 123 + ticket: + custom_status_id: 123 + id: 35436 + requester_id: 123453 + status: open + subject: My printer is on fire! + TicketsCreateRequestExample: + value: + tickets: + - comment: + body: The smoke is very colorful. + priority: urgent + subject: My printer is on fire! + - comment: + body: This is a comment + priority: normal + subject: Help + TicketsResponseExample: + value: + tickets: + - assignee_id: 235323 + collaborator_ids: + - 35334 + - 234 + created_at: "2009-07-20T22:55:29Z" + custom_fields: + - id: 27642 + value: "745" + - id: 27648 + value: "yes" + custom_status_id: 123 + description: The fire is very colorful. + due_at: null + external_id: ahg35h3jh + follower_ids: + - 35334 + - 234 + from_messaging_channel: false + generated_timestamp: 1304553600 + group_id: 98738 + has_incidents: false + id: 35436 + organization_id: 509974 + priority: high + problem_id: 9873764 + raw_subject: '{{dc.printer_on_fire}}' + recipient: support@company.com + requester_id: 20978392 + satisfaction_rating: + comment: Great support! + id: 1234 + score: good + sharing_agreement_ids: + - 84432 + status: open + subject: Help, my printer is on fire! + submitter_id: 76872 + tags: + - enterprise + - other_tag + type: incident + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/tickets/35436 + via: + channel: web + TicketsUpdateRequestBatchUpdateExample: + summary: Batch update - different changes to different tickets + description: Updates each ticket with its own set of changes + value: + tickets: + - id: 1 + priority: low + status: solved + - assignee_id: 12345 + id: 2 + status: pending + TicketsUpdateRequestBulkUpdateTagsExample: + summary: Bulk update with tag management + description: Add or remove tags without overwriting existing ones + value: + ticket: + additional_tags: + - urgent + - escalated + remove_tags: + - pending_review + TicketsUpdateRequestDefaultExample: + summary: Bulk update - same change to multiple tickets + description: Updates all tickets specified in the ids query parameter with the same values + value: + ticket: + comment: + body: This issue has been resolved + status: solved + TimeBasedExportIncrementalTicketsResponseExample: + value: + count: 2 + end_of_stream: true + end_time: 1390362485 + next_page: https://{subdomain}.zendesk.com/api/v2/incremental/tickets?per_page=3&start_time=1390362485 + tickets: + - assignee_id: 235323 + collaborator_ids: + - 35334 + - 234 + created_at: "2009-07-20T22:55:29Z" + custom_fields: + - id: 27642 + value: "745" + - id: 27648 + value: "yes" + description: The fire is very colorful. + due_at: null + external_id: ahg35h3jh + follower_ids: + - 35334 + - 234 + from_messaging_channel: false + generated_timestamp: 1304553600 + group_id: 98738 + has_incidents: false + id: 35436 + organization_id: 509974 + priority: high + problem_id: 9873764 + raw_subject: '{{dc.printer_on_fire}}' + recipient: support@company.com + requester_id: 20978392 + satisfaction_rating: + comment: Great support! + id: 1234 + score: good + sharing_agreement_ids: + - 84432 + status: open + subject: Help, my printer is on fire! + submitter_id: 76872 + tags: + - enterprise + - other_tag + type: incident + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/tickets/35436 + via: + channel: web + TimeBasedExportIncrementalUsersResponseExample: + value: + count: 1 + end_of_stream: true + end_time: 1601357503 + next_page: https://example.zendesk.com/api/v2/incremental/ticket_events?start_time=1601357503 + users: + - active: true + alias: Mr. Johnny + created_at: "2009-07-20T22:55:29Z" + custom_role_id: 9373643 + details: "" + email: johnny@example.com + external_id: sai989sur98w9 + id: 35436 + last_login_at: "2011-05-05T10:38:52Z" + locale: en-US + locale_id: 1 + moderator: true + name: Johnny Agent + notes: Johnny is a nice guy! + only_private_comments: false + organization_id: 57542 + phone: "+15551234567" + photo: + content_type: image/png + content_url: https://company.zendesk.com/photos/my_funny_profile_pic.png + id: 928374 + name: my_funny_profile_pic.png + size: 166144 + thumbnails: + - content_type: image/png + content_url: https://company.zendesk.com/photos/my_funny_profile_pic_thumb.png + id: 928375 + name: my_funny_profile_pic_thumb.png + size: 58298 + restricted_agent: true + role: agent + role_type: 0 + shared: false + shared_agent: false + signature: Have a nice day, Johnny + suspended: true + tags: + - enterprise + - other_tag + ticket_restriction: assigned + time_zone: Copenhagen + updated_at: "2011-05-05T10:38:52Z" + url: https://company.zendesk.com/api/v2/users/35436 + user_fields: + user_date: "2012-07-23T00:00:00Z" + user_decimal: 5.1 + user_dropdown: option_1 + verified: true + TrialAccountResponseExample: + value: + account: + name: Sample Partner Account + subdomain: partner12345 + url: https://partner12345.zendesk.com + TriggerBulkUpdateRequestExample: + value: + triggers: + - id: 25 + position: 5 + - active: false + id: 26 + - category_id: "10027" + id: 27 + TriggerDefinitionResponseExample: + value: + definitions: + actions: + - group: ticket + nullable: false + repeatable: false + subject: status + title: Status + type: list + values: + - enabled: true + title: Open + value: open + - enabled: true + title: Pending + value: pending + - enabled: true + title: Solved + value: solved + - enabled: true + title: Closed + value: closed + conditions_all: + - group: ticket + nullable: false + operators: + - terminal: false + title: Is + value: is + - terminal: false + title: Is not + value: is_not + - terminal: false + title: Less than + value: less_than + - terminal: false + title: Greater than + value: greater_than + - terminal: true + title: Changed + value: changed + - terminal: false + title: Changed to + value: value + - terminal: false + title: Changed from + value: value_previous + - terminal: true + title: Not changed + value: not_changed + - terminal: false + title: Not changed to + value: not_value + - terminal: false + title: Not changed from + value: not_value_previous + repeatable: false + subject: status + title: Status + type: list + values: + - enabled: true + title: New + value: new + - enabled: true + title: Open + value: open + - enabled: true + title: Pending + value: pending + - enabled: true + title: Solved + value: solved + - enabled: true + title: Closed + value: closed + conditions_any: + - group: ticket + nullable: true + operators: + - terminal: true + title: Present + value: present + - terminal: true + title: Not present + value: not_present + repeatable: false + subject: custom_fields_20513432 + title: Happy Gilmore + type: list + - group: ticket + nullable: true + operators: + - terminal: true + title: Present + value: present + - terminal: true + title: Not present + value: not_present + repeatable: false + subject: custom_fields_86492341 + title: total_time_field + type: list + TriggerResponseExample: + value: + trigger: + actions: [ ] + active: true + category_id: "10026" + conditions: { } + created_at: "2012-09-25T22:50:26Z" + description: Close and save a ticket + id: 25 + position: 8 + raw_title: Close and Save + title: Close and Save + updated_at: "2012-09-25T22:50:26Z" + url: http://{subdomain}.zendesk.com/api/v2/triggers/25 + TriggerRevisionResponseExample: + value: + trigger_revision: + author_id: 3343 + created_at: "2020-05-28T06:41:43Z" + id: 1 + snapshot: + actions: + - field: notification_target + value: + - "510312" + - '{}' + active: true + conditions: + all: [ ] + any: + - field: current_tags + operator: includes + value: fire_bulk_1 + description: null + title: bulk_test_trigger_1 + url: https://example.zendesk.com/api/v2/triggers/261303831/revisions/1 + TriggerRevisionsResponseExample: + value: + after_cursor: MTUwMTYwNzUyMi4wfHwxMzQ3NTMxNjcxfA== + after_url: https://{subdomain}.zendesk.com/api/v2/triggers/{trigger_id}/revisions?cursor=MTUwMTYwNzUyMi4wfHwxMzQ3NTMxNjcxfA%3D%3D&limit=20 + before_cursor: fDE1MDE1NzUxMjIuMHx8MTM0NzM0MzAxMQ== + before_url: https://{subdomain}.zendesk.com/api/v2/triggers/{trigger_id}/revisions?cursor=fDE1MDE1NzUxMjIuMHx8MTM0NzM0MzAxMQ%3D%3D&limit=20 + count: 1 + trigger_revisions: + - author_id: 2 + created_at: "2016-08-15T16:04:06Z" + diff: + actions: [ ] + active: [ ] + conditions: { } + description: [ ] + source_id: 1 + target_id: 2 + title: [ ] + id: 100 + snapshot: + actions: + - field: notification_target + value: + - "510312" + - '{}' + active: true + conditions: + all: [ ] + any: + - field: current_tags + operator: includes + value: fire_bulk_1 + description: Notifies requester that a comment was updated + title: Notify requester of comment update + url: https://{subdomain}.zendesk.com/api/v2/trigger/123/revisions/100 + TriggerWithCategoryRequestExample: + value: + trigger: + actions: + - field: group_id + value: "20455932" + category_id: "10026" + conditions: + all: + - field: status + operator: is + value: open + - field: priority + operator: less_than + value: high + title: Roger Wilco + TriggersActiveResponseExample: + value: + count: 2 + next_page: null + previous_page: null + triggers: + - actions: [ ] + active: true + conditions: { } + created_at: "2012-09-25T22:50:26Z" + description: Close and save a ticket + id: 25 + position: 8 + raw_title: Close and Save + title: Close and Save + updated_at: "2012-09-25T22:50:26Z" + url: http://{subdomain}.zendesk.com/api/v2/triggers/25 + - actions: [ ] + active: true + conditions: + all: + - field: status + operator: less_than + value: solved + - field: assignee_id + operator: is + value: "296220096" + any: + - field: status + operator: less_than + value: solved + created_at: "2012-09-25T22:50:26Z" + description: Assign a ticket with a priority tag + id: 26 + position: 9 + raw_title: '{{dc.assign_priority_tag}}' + title: Assign priority tag + updated_at: "2012-09-25T22:50:26Z" + url: http://{subdomain}.zendesk.com/api/v2/triggers/26 + TriggersResponseExample: + value: + count: 2 + next_page: null + previous_page: null + triggers: + - actions: [ ] + active: true + conditions: { } + created_at: "2012-09-25T22:50:26Z" + description: Close and save a ticket + id: 25 + position: 8 + raw_title: Close and Save + title: Close and Save + updated_at: "2012-09-25T22:50:26Z" + url: http://{subdomain}.zendesk.com/api/v2/triggers/25 + - actions: [ ] + active: false + conditions: + all: + - field: status + operator: less_than + value: solved + - field: assignee_id + operator: is + value: "296220096" + any: + - field: status + operator: less_than + value: solved + - field: custom_status_id + operator: includes + value: + - "1" + - "2" + created_at: "2012-09-25T22:50:26Z" + description: Assign a ticket with a priority tag + id: 26 + position: 9 + raw_title: '{{dc.assign_priority_tag}}' + title: Assign priority tag + updated_at: "2012-09-25T22:50:26Z" + url: http://{subdomain}.zendesk.com/api/v2/triggers/26 + TriggersSearchResponseExample: + value: + count: 2 + next_page: null + previous_page: null + triggers: + - actions: [ ] + active: true + conditions: + all: + - field: status + operator: less_than + value: solved + - field: assignee_id + operator: is + value: "296220096" + any: + - field: status + operator: less_than + value: solved + created_at: "2012-09-25T22:50:26Z" + description: Close and save a ticket + id: 25 + position: 9 + raw_title: Close and Save + title: Close and Save + updated_at: "2012-09-25T22:50:26Z" + - actions: [ ] + active: true + conditions: { } + created_at: "2012-09-25T22:50:26Z" + id: 28 + position: 9 + raw_title: '{{dc.close_and_redirect}}' + title: Close and redirect to topics + updated_at: "2012-09-25T22:50:26Z" + TwitterChannelResponseExample: + value: + monitored_twitter_handle: + created_at: "2010-05-13T22:07:08Z" + id: 431 + screen_name: '@zendeskops' + twitter_user_id: 67923318930 + updated_at: "2011-07-22T00:15:19Z" + TwitterChannelTwicketStatusResponseExample: + value: + statuses: + - favorited: true + id: 834 + retweeted: false + user_followed: true + TwitterChannelsResponseExample: + value: + monitored_twitter_handles: + - created_at: "2009-05-13T00:07:08Z" + id: 211 + screen_name: '@zendesk' + twitter_user_id: 67462376832 + updated_at: "2011-07-22T00:11:12Z" + - created_at: "2010-05-13T22:07:08Z" + id: 431 + screen_name: '@zendeskops' + twitter_user_id: 67923318930 + updated_at: "2011-07-22T00:15:19Z" + UpdateDeletionScheduleRequestExample: + value: + deletion_schedule: + active: true + conditions: + all: + - field: duration_since_last_update + operator: greater_than + value: P1Y + any: [ ] + description: Delete tickets older than 1 year + title: some schedule + UpdateDeletionScheduleResponseExample: + value: + deletion_schedule: + active: true + conditions: + all: + - field: duration_since_last_update + operator: greater_than + value: P1Y + any: [ ] + default: false + description: Delete tickets older than 1 year + id: 7772196094461 + title: some schedule + url: https://{some domain}.zendesk.com/api/v2/deletion_schedules/7772196094461 + UpdateMacroResponseExample: + value: + macro: + actions: + - field: status + value: solved + active: true + description: Sets the ticket status to `solved` + id: 25 + position: 42 + restriction: { } + title: Close and Save + UpdateManyUsersRequestExample: + value: + user: + organization_id: 1 + UpdateOrganizationResponseExample: + value: + organization: + created_at: "2018-11-14T00:14:52Z" + details: caterpillar =) + domain_names: + - remain.com + external_id: null + group_id: 1835962 + id: 4112492 + name: Groablet Enterprises + notes: Something Interesting + organization_fields: + datepudding: "2018-11-04T00:00:00+00:00" + org_field_1: happy happy + org_field_2: teapot_kettle + shared_comments: false + shared_tickets: false + tags: + - smiley + - teapot_kettle + updated_at: "2018-11-14T00:54:22Z" + url: https://example.zendesk.com/api/v2/organizations/4112492 + UpdateUserRequestExample: + value: + user: + name: Roger Wilco II + UpdateUserResponseExample: + value: + user: + id: 9873843 + name: Roger Wilco II + UserCountResponseExample: + value: + count: + refreshed_at: "2020-04-06T02:18:17Z" + value: 102 + UserCreateResponseExample: + value: + user: + custom_role_id: 123456 + email: roge@example.org + id: 9873843 + name: Roger Wilco + organization_id: 57542 + role: agent + role_type: 0 + UserEntitlementsFullResponseExample: + value: + entitlements: + chat: + is_active: true + name: admin + explore: + is_active: true + name: admin + guide: + is_active: true + name: admin + talk: + is_active: true + name: lead + UserFieldCreateResponseExample: + value: + user_field: + active: true + created_at: "2013-02-27T20:35:55Z" + description: This field describes the support plan this user has + id: 75 + key: support_description + position: 0 + raw_description: This field describes the support plan this user has + raw_title: Support description + regexp_for_validation: null + title: Support description + type: text + updated_at: "2013-02-27T20:35:55Z" + url: https://company.zendesk.com/api/v2/user_fields/75 + UserFieldResponseExample: + value: + user_field: + active: true + created_at: "2012-10-16T16:04:06Z" + description: Description of Custom Field + id: 7 + key: custom_field_1 + position: 9999 + raw_description: '{{dc.my_description}}' + raw_title: Custom Field 1 + regexp_for_validation: null + title: Custom Field 1 + type: text + updated_at: "2012-10-16T16:04:06Z" + url: https://company.zendesk.com/api/v2/user_fields/7 + UserFieldUpdateResponseExample: + value: + user_field: + active: true + created_at: "2013-02-27T20:35:55Z" + description: This field describes the support plan this user has + id: 75 + key: support_description + position: 0 + raw_description: This field describes the support plan this user has + raw_title: Support description + regexp_for_validation: null + title: Support description + type: text + updated_at: "2013-02-27T20:35:55Z" + url: https://company.zendesk.com/api/v2/user_fields/75 + UserFieldsResponseExample: + value: + count: 1 + next_page: null + previous_page: null + user_fields: + - active: true + created_at: "2012-10-16T16:04:06Z" + description: Description of Custom Field + id: 7 + key: custom_field_1 + position: 9999 + raw_description: '{{dc.my_description}}' + raw_title: Custom Field 1 + regexp_for_validation: null + title: Custom Field 1 + type: text + updated_at: "2012-10-16T16:04:06Z" + url: https://company.zendesk.com/api/v2/user_fields/7 + UserIdentitiesResponseExample: + value: + identities: + - created_at: "2011-07-20T22:55:29Z" + id: 35436 + primary: true + type: email + updated_at: "2011-07-20T22:55:29Z" + user_id: 135 + value: someone@example.com + verification_method: low + verified: true + - created_at: "2012-02-12T14:25:21Z" + id: 77136 + primary: false + type: twitter + updated_at: "2012-02-12T14:25:21Z" + user_id: 135 + value: didgeridooboy + verification_method: low + verified: true + - created_at: "2012-02-12T14:25:21Z" + id: 88136 + primary: true + type: phone_number + updated_at: "2012-02-12T14:25:21Z" + user_id: 135 + value: +1 555-123-4567 + verification_method: low + verified: true + UserIdentityCreateResponseExample: + value: + identity: + created_at: "2012-02-12T14:25:21Z" + id: 77938 + primary: false + type: twitter + updated_at: "2012-02-12T14:25:21Z" + user_id: 13531 + value: cabanaboy + verification_method: none + verified: false + UserIdentityResponseExample: + value: + identity: + created_at: "2012-02-12T14:25:21Z" + id: 77938 + primary: false + type: twitter + updated_at: "2012-02-12T14:25:21Z" + user_id: 13531 + value: cabanaboy + verified: false + UserIdentityUpdateResponseExample: + value: + identity: + created_at: "2011-07-20T22:55:29Z" + deliverable_state: deliverable + id: 35436 + primary: true + type: email + updated_at: "2011-07-20T22:55:29Z" + user_id: 135 + value: someone@example.com + verification_method: low + verified: true + UserPasswordRequirementsResponseExample: + value: + requirements: + - must be at least 5 characters + - must be different from email address + UserRelatedResponseExample: + value: + user_related: + assigned_tickets: 5 + ccd_tickets: 3 + organization_subscriptions: 1 + requested_tickets: 10 + UserRequestExample: + value: + user: + agent_brand_ids: + - 8119246973690 + - 8119246973691 + - 8119246973692 + custom_role_id: 123456 + email: roge@example.org + identities: + - type: email + value: test@user.com + - type: twitter + value: tester84 + name: Roger Wilco + organization: + name: VIP Customers + role: agent + UserResponseExample: + value: + user: + id: 35436 + name: Johnny Agent + UserSettingsResponseExample: + value: + settings: + admin_center: + has_admin_center_side_nav_open: true + has_seen_admin_center_dark_mode_banner: false + lotus: + agent_workspace_theme_preference: "0" + agent_workspace_theme_preference_for_conversation_panel: "0" + keyboard_shortcuts_enabled: false + macro_shortcuts_enabled: false + show_onboarding_tooltips: true + show_reporting_video_tutorial: true + show_welcome_dialog: true + two_factor_authentication: false + UsersCreateManyRequestExample: + value: + users: + - agent_brand_ids: + - 8119246973690 + - 8119246973691 + - 8119246973692 + email: roge@example.org + name: Roger Wilco + organization_id: 567812345 + role: agent + - email: woge@example.org + name: Woger Rilco + role: admin + UsersRequestExample: + value: + users: + - agent_brand_ids: + - 8119246973690 + - 8119246973691 + - 8119246973692 + custom_role_id: 123456 + email: roge@example.org + identities: + - type: email + value: test@user.com + - type: twitter + value: tester84 + name: Roger Wilco + organization: + name: VIP Customers + role: agent + - email: woge@example.org + external_id: account_54321 + name: Woger Rilco + role: admin + UsersResponseExample: + value: + users: + - id: 223443 + name: Johnny Agent + - id: 8678530 + name: James A. Rosen + ViewCategoriesBadRequestResponseExample.yaml: + value: + errors: + - code: InvalidViewCategory + title: Name cannot be blank + ViewCategoriesForbiddenResponseExample: + value: + errors: + - code: ViewCategoriesNotEnabled + title: View categories are not enabled for your account. + ViewCategoriesResponseExample: + value: + view_categories: + - created_at: "2024-09-12T07:04:15Z" + id: "10001" + name: Your unsolved tickets Updated + parent_id: null + position: 1 + updated_at: "2024-09-12T07:04:15Z" + url: https://{subdomain}.zendesk.com/api/v2/view_categories/10001 + - created_at: "2024-09-12T07:05:21Z" + id: "10002" + name: All unsolved tickets + parent_id: null + position: 2 + updated_at: "2024-09-12T07:05:21Z" + url: https://{subdomain}.zendesk.com/api/v2/view_categories/10002 + ViewCountResponseExample: + value: + view_count: + fresh: true + pretty: ~700 + url: https://company.zendesk.com/api/v2/views/25/count + value: 719 + view_id: 25 + ViewCountsResponseExample: + value: + view_counts: + - fresh: true + pretty: ~700 + url: https://company.zendesk.com/api/v2/views/25/count + value: 719 + view_id: 25 + - fresh: false + pretty: '...' + url: https://company.zendesk.com/api/v2/views/78/count + value: null + view_id: 78 + ViewCreateResponseExample: + value: + view: + active: true + conditions: + all: + - field: status + operator: is + value: open + - field: priority + operator: less_than + value: high + any: + - field: current_tags + operator: includes + value: hello + id: 9873843 + title: Roger Wilco + ViewExecuteResponseExample: + value: + columns: + - id: locale + title: Locale + - id: 5 + title: Account + groups: [ ] + rows: + - group: 1 + locale: en-US + ticket: { } + view: + id: 25 + ViewExportResponseExample: + value: + export: + status: starting + view_id: 25 + ViewListTicketsResponseEXample: + value: + tickets: + - id: 35436 + requester_id: 20978392 + subject: Help I need somebody! + - id: 20057623 + requester_id: 20978392 + subject: Not just anybody! + ViewPreviewResponseExample: + value: + columns: + - id: subject + title: Subject + rows: + - subject: en-US + ticket: { } + ViewResponseExample: + value: + view: + active: true + conditions: { } + description: View for recent tickets + execution: { } + id: 25 + position: 3 + restriction: { } + title: Tickets updated less than 12 Hours + ViewUpdateResponseExample: + value: + view: + active: true + conditions: { } + description: View for recent tickets + execution: { } + id: 25 + position: 3 + restriction: { } + title: Roger Wilco II + ViewsActiveResponseExample: + value: + count: 2 + next_page: null + previous_page: null + views: + - active: true + conditions: { } + description: View for recent tickets + execution: { } + id: 25 + position: 3 + restriction: { } + title: Tickets updated less than 12 Hours + - active: true + conditions: { } + description: View for tickets that are not assigned + execution: { } + id: 23 + position: 7 + restriction: { } + title: Unassigned tickets + ViewsCountResponseExample: + value: + count: + refreshed_at: "2020-04-06T02:18:17Z" + value: 16 + ViewsResponseExample: + value: + count: 2 + next_page: null + previous_page: null + views: + - active: true + conditions: { } + description: View for recent tickets + execution: { } + id: 25 + position: 3 + restriction: { } + title: Tickets updated less than 12 Hours + - active: false + conditions: { } + description: View for tickets that are not assigned + execution: { } + id: 23 + position: 7 + restriction: { } + title: Unassigned tickets + ViewsUpdateManyResponseExample: + value: + views: + - active: true + conditions: { } + description: View for recent tickets + execution: { } + id: 123 + position: 8 + restriction: { } + title: Tickets updated less than 12 Hours + securitySchemes: + basicAuth: + type: http + scheme: basic +security: + - basicAuth: [ ] + diff --git a/src/main/resources/params.txt b/src/main/resources/params.txt new file mode 100644 index 0000000..10f4d55 --- /dev/null +++ b/src/main/resources/params.txt @@ -0,0 +1,120 @@ + +> CursorPaginationSort: + name: sort + in: query + description: | + Field to sort results by. Prefix with `-` for descending order. + + When used with cursor pagination, this determines the cursor ordering. + + Example: `?sort=name` or `?sort=-created_at` + schema: + type: string + example: name + CustomObjectFieldKeyOrId: + name: custom_object_field_key_or_id + in: path + description: The key or id of a custom object field + required: true + schema: + type: string + example: make + CustomObjectKey: +> DualPaginationPage: + name: page + in: query + description: | + Pagination parameter. Supports both traditional offset and cursor-based pagination: + + - Traditional: `?page=2` (integer page number) + - Cursor: `?page[size]=50&page[after]=cursor` (deepObject with size, after, before) + + These are mutually exclusive - use one format or the other, not both. + style: deepObject + explode: true + schema: + oneOf: + - type: integer + description: Traditional offset pagination page number (non-negative integer) + example: 1 + - type: object + description: Cursor pagination parameters (JSON:API style) + properties: + after: +> PerPage: + name: per_page + in: query + description: | + Number of records to return per page. + + Note: Default and maximum values vary by endpoint. Check endpoint-specific + documentation for limits. + schema: + type: integer + minimum: 1 + example: 50 + RequestId: + name: request_id + in: path + description: The ID of the request + required: true + schema: + type: integer + example: 33 + ResourceCollectionId: +> TicketSortBy: + name: sort_by + in: query + description: Sort by + schema: + type: string + enum: + - id + - subject + - deleted_at + - created_at + - updated_at + - status + - requester + - requester.name + - group + - assignee + - assignee.name +> TicketSortOrder: + name: sort_order + in: query + description: Sort order. Defaults to "asc" + schema: + type: string + enum: + - asc + - desc +> TicketSupportTypeScope: + name: support_type_scope + in: query + description: | + Lists tickets by support type. Possible values are "all", "agent", or "ai_agent". Defaults to "agent" + schema: + type: string +> TicketsInclude: + name: include + in: query + description: | + Sideloads to include in the response. Accepts a comma-separated list of values. + See [Sideloading](/api-reference/ticketing/tickets/tickets/#sideloading). + schema: + type: string + example: users,groups,organizations + TriggerActive: + name: active + in: query + description: Filter by active triggers if true or inactive triggers if false + schema: + type: boolean + example: true + TriggerCategoryId: + name: category_id + in: query + description: Filter triggers by category ID + schema: + diff --git a/src/main/resources/z4j.yaml b/src/main/resources/z4j.yaml index 7de98a7..5bf1fcb 100644 --- a/src/main/resources/z4j.yaml +++ b/src/main/resources/z4j.yaml @@ -1,970 +1,956 @@ +# Copyright 2026 Peanut Butter Unicorn LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. openapi: 3.0.2 info: title: Help Center API description: Help Center v2 REST API version: 2.0.0 -paths: - /api/v2/ticket_fields: - get: - operationId: ListTicketFields - tags: - - Ticket - summary: List Ticket Fields - description: | -Returns a list of all system and custom ticket fields in your account.
-For end users, only the ticket fields with visible_in_portal set to true are returned.
-Consider caching this resource to use with the{@link TicketClient}.
-| Custom field type | -Description | -||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| text | -Default custom field type when type is not specified |
- ||||||||||||||||||||||||||||||||||||||||||||||||||||
| textarea | -For multi-line text | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| checkbox | -To capture a boolean value. Allowed values are true or false. Optionally, you can specify a tag to be added - to the ticket when the value is true. - | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| date | -Example: 2021-04-16 | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| integer | -String composed of numbers. May contain an optional decimal point | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| decimal | -For numbers containing decimals | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| regexp | -Matches the Regex pattern found in the custom field settings | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| partialcreditcard | -A credit card number. Only the last 4 digits are retained | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| multiselect | -Enables users to choose multiple options from a dropdown menu. It contains one or more tag values belonging - to the field's options. - | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| tagger | -Single-select dropdown menu. It contains one or more tag values belonging to the field's options. - Example: ( {"id": 21938362, "value": ["hd_3000", "hd_5555"]}) - | -||||||||||||||||||||||||||||||||||||||||||||||||||||
| lookup | -A field to create a relationship (see Allowed For
-
|
| value | -description | -
|---|---|
position |
- order set manually using the Arrange Content page. Default order | -
created_at |
- order by creation time | -
updated_at |
- order by update time | -
| value | -description | -
|---|---|
asc |
- ascending order | -
desc |
- descending order | -
You must specify a category name and locale. The locale can be omitted if it's specified - in the URL. Optionally, you can specify multiple translations for - the category. The specified locales must be enabled for the current Help Center.
-Note: {/locale} is an optional parameter for admins and agents. End users and anonymous users must provide the parameter.
Translations are embedded within the category because they're - not shared between resources.
- responses: - "200": - description:description
- content: - application/json: - schema: - $ref: '#/components/schemas/CategoryResponse' - put: - operationId: UpdateCategory - tags: - - Category - summary: Update Category by Locale - description: |- -These endpoints only update category-level metadata such as the sorting position. - They don't update category translations.
-WARNING: Every section and all articles in the category will also be deleted.
-The endpoint updates the category source_locale property
OK Response
- content: - application/json: - schema: - $ref: '#/components/schemas/CategoryResponse' - /api/v2/help_center/categories: - get: - operationId: ListCategoriesNoLocale - tags: - - Category - summary: List Categories - description: |- -The response will list only the categories that the agent can view in the help center.
- parameters: - - name: sort_by - in: query - description:Sorts the results by one of the accepted values
- schema: - type: string - enum: - - position - - created_at - - updated_at - - name: sort_order - in: query - description:Selects the order of the results.
- schema: - type: string - enum: - - asc - - desc - responses: - "200": - description:description
- content: - application/json: - schema: - $ref: '#/components/schemas/CategoriesResponse' - post: - operationId: CreateCategoryNoLocale - tags: - - Category - summary: Create Category - description: |- -You must specify a category name and locale. - Optionally, you can specify multiple translations for - the category. The specified locales must be enabled for the current Help Center.
-Note: {/locale} is an optional parameter for admins and agents. End users and anonymous users must provide the parameter.
Translations are embedded within the category because they're - not shared between resources.
- responses: - "200": - description:description
- content: - application/json: - schema: - $ref: '#/components/schemas/CategoryResponse' - put: - operationId: UpdateCategoryNoLocale - tags: - - Category - summary: Update Category - description: |- -These endpoints only update category-level metadata such as the sorting position. - They don't update category translations.
-WARNING: Every section and all articles in the category will also be deleted.
-No content
- /api/v2/search: - get: - operationId: List - tags: - - Search - summary: List Search Results - description: |- -Returns the search results. See Query syntax for details on the {@code query} parameter.
-Use the ampersand character (&) to append the {@code sort_by} or {@code sort_order} parameters to the URL.
-For examples, see Searching with Zendesk API.
-This endpoint has its own rate limit. The rate limit counts towards the global API rate limit. See Limits.
-Offset pagination may result in duplicate results when paging. You can also use the - Export Search Results endpoint, which - uses cursor-based pagination and doesn't return duplicate results. See - Using cursor pagination for more information.
- parameters: - - name: query - in: query - description: Returns the search results. See Query syntax for details on the {@code query} parameter. For details on the query syntax, see the Zendesk Support search reference. - required: true - schema: - type: string - - name: sort_by - in: query - description: One of {@code updated_at}, {@code created_at}, {@code priority}, {@code status}, or {@code ticket_type}. Defaults to sorting by relevance - schema: - $ref: '#/components/schemas/SearchSortBy' - - name: sort_order - in: query - description: Defaults to descending - schema: - $ref: '#/components/schemas/SearchSortOrder' - - $ref: '#/components/parameters/SearchInclude' - responses: - "200": - description: Success response - content: - application/json: - schema: - $ref: '#/components/schemas/SearchResponse' - "400": - description: Error response - content: - application/json: - schema: - $ref: '#/components/schemas/BadRequestErrorResponse' - /api/v2/search/count: - get: - operationId: Count - tags: - - Search - summary: Show Search Results Count - description: | - Returns the number of items matching the query rather than returning the items. The search string works the same as a regular search. - -Exports a set of results. See Query syntax for the syntax of the {@code query} parameter.
-Use this endpoint for search queries that will return more than 1000 results. The result set is ordered only by the {@code created_at} attribute.
-The search only returns results of a single object type. The following object types are supported: ticket, organization, user, or group.
-You must specify the type in the {@code filter[type]} parameter. Searches with type in the query string will result in an error.
-See Pagination.
-Returns a maximum of 1000 records per page. The number of results shown in a page is determined by the {@code page[size]} parameter.
-Note: You may experience a speed reduction or a timeout if you request 1000 results per page and you have many archived tickets in the results. Try reducing the number of results per page. We recommend 100 results per page.
-The cursor specified by the {@code after_cursor} property in a response expires after one hour.
-For more information on cursor-based pagination, see the following articles:
-This API endpoint is rate-limited to 100 requests per minute per account. The limit also counts towards the global API rate limit.
- parameters: - - name: query - in: query - description: Returns the search results. See Query syntax for details on the {@code query} parameter. For details on the query syntax, see the Zendesk Support search reference. - required: true - schema: - type: string - - name: page[size] - in: query - description: The number of results shown in a page. - required: true - schema: - type: integer - - name: page[after] - in: query - description: The cursor token for fetching the next page of results. - required: true - schema: - type: string - - name: filter[type] - in: query - description: The object type returned by the export query. Can be `ticket`, `organization`, `user`, or `group`. - required: true - schema: - $ref: '#/components/schemas/SearchExportType' - - $ref: '#/components/parameters/SearchInclude' - responses: - "200": - description: Success response - content: - application/json: - schema: - $ref: '#/components/schemas/SearchResponse' - "400": - description: Error response - content: - application/json: - schema: - $ref: '#/components/schemas/BadRequestErrorResponse' +#paths: +# /api/v2/ticket_fields: +# get: +# operationId: ListTicketFields +# tags: +# - Ticket +# summary: List Ticket Fields +# description: | +#Returns a list of all system and custom ticket fields in your account.
+#For end users, only the ticket fields with visible_in_portal set to true are returned.
+#Consider caching this resource to use with the{@link TicketClient}.
+#Creates any of the following custom field types:
+#| Custom field type | +#Description | +#
|---|---|
| text | +#Default custom field type when type is not specified |
+#
| textarea | +#For multi-line text | +#
| checkbox | +#To capture a boolean value. Allowed values are true or false. Optionally, you can specify a tag to be added +# to the ticket when the value is true. +# | +#
| date | +#Example: 2021-04-16 | +#
| integer | +#String composed of numbers. May contain an optional decimal point | +#
| decimal | +#For numbers containing decimals | +#
| regexp | +#Matches the Regex pattern found in the custom field settings | +#
| partialcreditcard | +#A credit card number. Only the last 4 digits are retained | +#
| multiselect | +#Enables users to choose multiple options from a dropdown menu. It contains one or more tag values belonging +# to the field's options. +# | +#
| tagger | +#Single-select dropdown menu. It contains one or more tag values belonging to the field's options. +# Example: ( {"id": 21938362, "value": ["hd_3000", "hd_5555"]}) +# | +#
| lookup | +#A field to create a relationship (see lookup relationships) to +# another object such as a user, ticket, or organization +# | +#
Note: Tags can't be re-used across custom ticket fields. For example, if you configure a tag for +# a checkbox field, you can't use that tag value for a dropdown (tagger) field option. The use of tags isn't +# validated and can prevent editing in the future.
+#See About custom field types in the Zendesk +# Help Center.
+#We recommend the following best practices for ticket fields limits. Creating more than these amounts can affect +# performance.
+#Returns a number of ticket properties though not the ticket comments. To get the comments, use List Comments
+#Some user segments can only be applied to sections and topics on certain Guide plans. For instance, user
+# segments with a user_type of "staff" cannot be applied to sections and topics on accounts on the Guide
+# Lite plan or the Suite Team plan.
+# (Allowed for Help Center managers)
Lists the topics that use the specified user segment.
+#This endpoint supports pagination as described in Pagination.
+#See Pagination.
+# responses: +# "200": +# description: OK Response +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/TopicsResponse' +# /api/v2/help_center/{locale}/categories: +# parameters: +# - $ref: '#/components/parameters/OptionalLocale' +# get: +# operationId: ListCategories +# tags: +# - Category +# summary: List Categories by Locale +# description: |- +#The response will list only the categories that the agent, end user, or +# anonymous user can view in the help center.
+#Translations are embedded within the category because they're +# not shared between resources.
+# parameters: +# - name: sort_by +# in: query +# description: | +#The sort_by parameter can have one of the following values:
| value | +#description | +#
|---|---|
position |
+# order set manually using the Arrange Content page. Default order | +#
created_at |
+# order by creation time | +#
updated_at |
+# order by update time | +#
| value | +#description | +#
|---|---|
asc |
+# ascending order | +#
desc |
+# descending order | +#
You must specify a category name and locale. The locale can be omitted if it's specified +# in the URL. Optionally, you can specify multiple translations for +# the category. The specified locales must be enabled for the current Help Center.
+#Note: {/locale} is an optional parameter for admins and agents. End users and anonymous users must provide the parameter.
Translations are embedded within the category because they're +# not shared between resources.
+# responses: +# "200": +# description:description
+# content: +# application/json: +# schema: +# $ref: '#/components/schemas/CategoryResponse' +# put: +# operationId: UpdateCategory +# tags: +# - Category +# summary: Update Category by Locale +# description: |- +#These endpoints only update category-level metadata such as the sorting position. +# They don't update category translations.
+#WARNING: Every section and all articles in the category will also be deleted.
+#The endpoint updates the category source_locale property
OK Response
+# content: +# application/json: +# schema: +# $ref: '#/components/schemas/CategoryResponse' +# /api/v2/help_center/categories: +# get: +# operationId: ListCategoriesNoLocale +# tags: +# - Category +# summary: List Categories +# description: |- +#The response will list only the categories that the agent can view in the help center.
+# parameters: +# - name: sort_by +# in: query +# description:Sorts the results by one of the accepted values
+# schema: +# type: string +# enum: +# - position +# - created_at +# - updated_at +# - name: sort_order +# in: query +# description:Selects the order of the results.
+# schema: +# type: string +# enum: +# - asc +# - desc +# responses: +# "200": +# description:description
+# content: +# application/json: +# schema: +# $ref: '#/components/schemas/CategoriesResponse' +# post: +# operationId: CreateCategoryNoLocale +# tags: +# - Category +# summary: Create Category +# description: |- +#You must specify a category name and locale. The locale can be omitted if it's specified +# in the URL. Optionally, you can specify multiple translations for +# the category. The specified locales must be enabled for the current Help Center.
+#description
+# content: +# application/json: +# schema: +# $ref: '#/components/schemas/CategoryResponse' +# put: +# operationId: UpdateCategoryNoLocale +# tags: +# - Category +# summary: Update Category +# description: |- +#These endpoints only update category-level metadata such as the sorting position. +# They don't update category translations.
+#WARNING: Every section and all articles in the category will also be deleted.
+#No content
+# /api/v2/search: +# get: +# operationId: List +# tags: +# - Search +# summary: List Search Results +# description: |- +#Returns the search results. See Query syntax for details on the {@code query} parameter.
+#Use the ampersand character (&) to append the {@code sort_by} or {@code sort_order} parameters to the URL.
+#For examples, see Searching with Zendesk API.
+#This endpoint has its own rate limit. The rate limit counts towards the global API rate limit. See Limits.
+#Offset pagination may result in duplicate results when paging. You can also use the +# Export Search Results endpoint, which +# uses cursor-based pagination and doesn't return duplicate results. See +# Using cursor pagination for more information.
+# parameters: +# - name: query +# in: query +# description: Returns the search results. See Query syntax for details on the {@code query} parameter. For details on the query syntax, see the Zendesk Support search reference. +# required: true +# schema: +# type: string +# - name: sort_by +# in: query +# description: One of {@code updated_at}, {@code created_at}, {@code priority}, {@code status}, or {@code ticket_type}. Defaults to sorting by relevance +# schema: +# $ref: '#/components/schemas/SearchSortBy' +# - name: sort_order +# in: query +# description: Defaults to descending +# schema: +# $ref: '#/components/schemas/SearchSortOrder' +# - $ref: '#/components/parameters/SearchInclude' +# responses: +# "200": +# description: Success response +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/SearchResponse' +# "400": +# description: Error response +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/BadRequestErrorResponse' +# /api/v2/search/count: +# get: +# operationId: Count +# tags: +# - Search +# summary: Show Search Results Count +# description: | +# Returns the number of items matching the query rather than returning the items. The search string works the same as a regular search. +# +#Exports a set of results. See Query syntax for the syntax of the {@code query} parameter.
+#Use this endpoint for search queries that will return more than 1000 results. The result set is ordered only by the {@code created_at} attribute.
+#The search only returns results of a single object type. The following object types are supported: ticket, organization, user, or group.
+#You must specify the type in the {@code filter[type]} parameter. Searches with type in the query string will result in an error.
+#See Pagination.
+#Returns a maximum of 1000 records per page. The number of results shown in a page is determined by the {@code page[size]} parameter.
+#Note: You may experience a speed reduction or a timeout if you request 1000 results per page and you have many archived tickets in the results. Try reducing the number of results per page. We recommend 100 results per page.
+#The cursor specified by the {@code after_cursor} property in a response expires after one hour.
+#For more information on cursor-based pagination, see the following articles:
+#This API endpoint is rate-limited to 100 requests per minute per account. The limit also counts towards the global API rate limit.
+# parameters: +# - name: query +# in: query +# description: Returns the search results. See Query syntax for details on the {@code query} parameter. For details on the query syntax, see the Zendesk Support search reference. +# required: true +# schema: +# type: string +# - name: page[size] +# in: query +# description: The number of results shown in a page. +# required: true +# schema: +# type: integer +# - name: page[after] +# in: query +# description: The cursor token for fetching the next page of results. +# required: true +# schema: +# type: string +# - name: filter[type] +# in: query +# description: The object type returned by the export query. Can be `ticket`, `organization`, `user`, or `group`. +# required: true +# schema: +# $ref: '#/components/schemas/SearchExportType' +# - $ref: '#/components/parameters/SearchInclude' +# responses: +# "200": +# description: Success response +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/SearchResponse' +# "400": +# description: Error response +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/BadRequestErrorResponse' components: schemas: SearchSortBy: @@ -1007,7 +993,7 @@ components: Attachment: type: object description: | - A file represented as an Attachment object + A file represented as an Attachment object allOf: - $ref: '#/components/schemas/AttachmentBase' - $ref: '#/components/schemas/AttachmentThumbnails' @@ -1021,7 +1007,7 @@ components: content_url: type: string description: | - A full URL where the attachment image file can be downloaded. The file may be hosted externally so take care not to inadvertently send Zendesk authentication credentials. See Working with url properties + A full URL where the attachment image file can be downloaded. The file may be hosted externally so take care not to inadvertently send Zendesk authentication credentials. See Working with url properties readOnly: true deleted: type: boolean @@ -1175,7 +1161,7 @@ components: type: string description: |HTML body of the article. Unsafe tags and attributes may be removed before display. For a list of safe tags and attributes, - see Allowing unsafe HTML in Help Center articles in Zendesk help
+ see Allowing unsafe HTML in Help Center articles in Zendesk help comments_disabled: type: boolean description: True if comments are disabled; false otherwise @@ -1425,36 +1411,39 @@ components: html_url: type: string description: The url of this category in Help Center + # readOnly: true id: type: integer format: int64 description: Automatically assigned when creating categories + # readOnly: true locale: - $ref: '#/components/schemas/LocaleAbbreviation' + type: string + description: The locale where the category is displayed name: type: string description: The name of the category outdated: type: boolean description: Whether the category is out of date + # readOnly: true position: type: integer format: int64 description: The position of this category relative to other categories source_locale: - $ref: '#/components/schemas/LocaleAbbreviation' - translations: - type: array - description: The translations for the category - items: - $ref: '#/components/schemas/Translation' + type: string + description: The source (default) locale of the category + # readOnly: true updated_at: type: string format: date-time description: The time at which the category was last updated + # readOnly: true url: type: string description: The API url of this category + # readOnly: true required: - name CategoryResponse: @@ -1479,13 +1468,13 @@ components: author_id: type: integer format: int64 - description: The id of the author of this comment. Writable on create by Help Center managers. See Create Comment + description: The id of the author of this comment. Writable on create by Help Center managers. See Create Comment body: type: string - description: The comment made by the author. See User content + description: The comment made by the author. See User content created_at: type: string - description: The time the comment was created. Writable on create by Help Center managers. See Create Comment + description: The time the comment was created. Writable on create by Help Center managers. See Create Comment html_url: type: string description: The url at which the comment is presented in Help Center @@ -1596,7 +1585,7 @@ components: readOnly: true source_locale: type: string - description: Used only for Create Section Subscription and Create Article Subscription, where it's mandatory. Selects the locale of the content to be subscribed + description: Used only for Create Section Subscription and Create Article Subscription, where it's mandatory. Selects the locale of the content to be subscribed updated_at: type: string description: The time at which the subscription was last updated @@ -1888,83 +1877,6 @@ components: name: English updated_at: "2011-05-05T10:38:52Z" url: https://company.zendesk.com/api/v2/locales/en-US.json - LocaleAbbreviation: - type: string - description: The locale of the translation - enum: - - ar - - pt-br - - bg - - cs - - da - - nl - - en-gb - - en-us - - fa-af - - fil - - fi - - fr - - fr-ca - - de - - el - - he - - hi - - hu - - id - - it - - ja - - ko - - ms - - no - - pl - - ro - - ru - - zh-cn - - es - - sk - - sv - - th - - zh-tw - - tr - - uk - - vi - x-enum-varnames: - - ARABIC - - PORTUGUESE_BRAZIL - - BULGARIAN - - CZECH - - DANISH - - DUTCH - - ENGLISH_UNITED_KINGDOM - - ENGLISH_UNITED_STATES - - DARI_PERSIAN_AFGHANISTAN - - FILIPINO - - FINNISH - - FRENCH - - FRENCH_CANADA - - GERMAN - - GREEK - - HEBREW - - HINDI - - HUNGARIAN - - INDONESIAN - - ITALIAN - - JAPANESE - - KOREAN - - MALAY - - NORWEGIAN - - POLISH - - ROMANIAN - - RUSSIAN - - SIMPLIFIED_CHINESE - - SPANISH - - SLOVAK - - SWEDISH - - THAI - - TRADITIONAL_CHINESE - - TURKISH - - UKRAINIAN - - VIETNAMESE LocaleResponse: type: object properties: @@ -1992,13 +1904,13 @@ components: author_id: type: integer format: int64 - description: The id of the author of the comment. Writable on create by Help Center managers. See Create Post Comment + description: The id of the author of the comment. Writable on create by Help Center managers. See Create Post Comment body: type: string - description: The comment made by the author. See User content + description: The comment made by the author. See User content created_at: type: string - description: When the comment was created. Writable on create by Help Center managers. See Create Post Comment + description: When the comment was created. Writable on create by Help Center managers. See Create Post Comment html_url: type: string description: The community url of the comment @@ -2071,7 +1983,7 @@ components: author_id: type: integer format: int64 - description: The id of the author of the post. *Writable on create by Help Center managers -- see Create Post + description: The id of the author of the post. *Writable on create by Help Center managers -- see Create Post readOnly: true closed: type: boolean @@ -2090,11 +2002,11 @@ components: created_at: type: string format: date-time - description: When the post was created. Writable on create by Help Center managers -- see Create Post + description: When the post was created. Writable on create by Help Center managers -- see Create Post readOnly: true details: type: string - description: The details of the post made by the author. See User content + description: The details of the post made by the author. See User content featured: type: boolean description: Whether the post is featured @@ -2360,7 +2272,7 @@ components: brand_id: type: integer format: int64 - description: The id of the brand this ticket is associated with. See Setting up multiple brands + description: The id of the brand this ticket is associated with. See Setting up multiple brands collaborator_ids: type: array description: The ids of users currently CC'ed on the ticket @@ -2369,12 +2281,12 @@ components: format: int64 collaborators: type: array - description: POST requests only. Users to add as cc's when creating a ticket. See Setting Collaborators + description: POST requests only. Users to add as cc's when creating a ticket. See Setting Collaborators items: $ref: '#/components/schemas/Collaborator' comment: type: object - description: Write only. An object that adds a comment to the ticket. See Ticket comments. To include an attachment with the comment, see Attaching files. A ticket can contain up to 5000 comments in total, including both public and private comments. Once this limit is reached, any additional attempts to add comments results in a 422 error. The ticket can still be updated in other ways, provided that no new comments are added. + description: Write only. An object that adds a comment to the ticket. See Ticket comments. To include an attachment with the comment, see Attaching files. A ticket can contain up to 5000 comments in total, including both public and private comments. Once this limit is reached, any additional attempts to add comments results in a 422 error. The ticket can still be updated in other ways, provided that no new comments are added. writeOnly: true created_at: type: string @@ -2383,7 +2295,7 @@ components: readOnly: true custom_fields: type: array - description: Custom fields for the ticket. See Setting custom field values + description: Custom fields for the ticket. See Setting custom field values items: type: object properties: @@ -2397,39 +2309,39 @@ components: custom_status_id: type: integer format: int64 - description: The custom ticket status id of the ticket. See custom ticket statuses + description: The custom ticket status id of the ticket. See custom ticket statuses description: type: string description: | - Read-only first comment on the ticket. When creating a ticket, usecomment to set the description. See Description and first comment
+ Read-only first comment on the ticket. When creating a ticket, use comment to set the description. See Description and first comment
readOnly: true
due_at:
type: string
format: date-time
- description: If this is a ticket of type "task" it has a due date. Due date format uses ISO 8601 format
+ description: If this is a ticket of type "task" it has a due date. Due date format uses ISO 8601 format
nullable: true
email_cc_ids:
type: array
- description: The ids of agents or end users currently CC'ed on the ticket. Ignored when CCs and followers is not enabled
+ description: The ids of agents or end users currently CC'ed on the ticket. Ignored when CCs and followers is not enabled
items:
type: integer
format: int64
email_ccs:
type: object
- description: Write only. An array of objects that represents agent or end users email CCs to add or delete from the ticket. See Setting email CCs. Ignored when CCs and followers is not enabled
+ description: Write only. An array of objects that represents agent or end users email CCs to add or delete from the ticket. See Setting email CCs. Ignored when CCs and followers is not enabled
writeOnly: true
external_id:
type: string
description: An id you can use to link Zendesk Support tickets to local records
follower_ids:
type: array
- description: The ids of agents currently following the ticket. Ignored when CCs and followers is not enabled
+ description: The ids of agents currently following the ticket. Ignored when CCs and followers is not enabled
items:
type: integer
format: int64
followers:
type: object
- description: Write only. An array of objects that represents agent followers to add or delete from the ticket. See Setting followers. Ignored when CCs and followers is not enabled
+ description: Write only. An array of objects that represents agent followers to add or delete from the ticket. See Setting followers. Ignored when CCs and followers is not enabled
writeOnly: true
followup_ids:
type: array
@@ -2445,7 +2357,7 @@ components:
readOnly: true
from_messaging_channel:
type: boolean
- description: If true, the ticket's via type is a messaging channel.
+ description: If true, the ticket's via type is a messaging channel.
readOnly: true
generated_timestamp:
type: integer
@@ -2482,12 +2394,12 @@ components:
format: int64
metadata:
type: object
- description: Write only. Metadata for the audit. In the audit object, the data is specified in the custom property of the metadata object. See Setting Metadata
+ description: Write only. Metadata for the audit. In the audit object, the data is specified in the custom property of the metadata object. See Setting Metadata
writeOnly: true
organization_id:
type: integer
format: int64
- description: The organization of the requester. You can only specify the ID of an organization associated with the requester. See Organization Memberships
+ description: The organization of the requester. You can only specify the ID of an organization associated with the requester. See Organization Memberships
priority:
type: string
description: The urgency with which the ticket should be addressed
@@ -2503,13 +2415,13 @@ components:
raw_subject:
type: string
description: |
- The dynamic content placeholder, if present, or the "subject" value, if not. See Dynamic Content Items
+ The dynamic content placeholder, if present, or the "subject" value, if not. See Dynamic Content Items
recipient:
type: string
description: The original recipient e-mail address of the ticket. Notification emails for the ticket are sent from this address
requester:
type: object
- description: Write only. See Creating a ticket with a new requester
+ description: Write only. See Creating a ticket with a new requester
writeOnly: true
requester_id:
type: integer
@@ -2517,7 +2429,7 @@ components:
description: The user who requested this ticket
safe_update:
type: boolean
- description: Write only. Optional boolean. When true and an update_stamp date is included, protects against ticket update collisions and returns a message to let you know if one occurs. See Protecting against ticket update collisions. A value of false has the same effect as true. Omit the property to force the updates to not be safe
+ description: Write only. Optional boolean. When true and an update_stamp date is included, protects against ticket update collisions and returns a message to let you know if one occurs. See Protecting against ticket update collisions. A value of false has the same effect as true. Omit the property to force the updates to not be safe
writeOnly: true
satisfaction_rating:
type: object
@@ -2536,7 +2448,7 @@ components:
The state of the ticket.
If your account has activated custom ticket statuses, this is the ticket's
- status category. See custom ticket statuses
+ status category. See custom ticket statuses
enum:
- new
- open
@@ -2547,14 +2459,14 @@ components:
subject:
type: string
description: |
- The value of the subject field for this ticket. See Subject
+ The value of the subject field for this ticket. See Subject
submitter_id:
type: integer
format: int64
description: The user who submitted the ticket. The submitter always becomes the author of the first comment on the ticket
tags:
type: array
- description: The array of tags applied to this ticket. Unless otherwise specified, the set tag behavior is used, which overwrites and replaces existing tags
+ description: The array of tags applied to this ticket. Unless otherwise specified, the set tag behavior is used, which overwrites and replaces existing tags
items:
type: string
ticket_form_id:
@@ -2572,7 +2484,7 @@ components:
updated_at:
type: string
format: date-time
- description: When this record last got updated. It is updated only if the update generates a ticket event
+ description: When this record last got updated. It is updated only if the update generates a ticket event
readOnly: true
updated_stamp:
type: string
@@ -2584,7 +2496,7 @@ components:
readOnly: true
via:
type: object
- description: For more information, see the Via object reference
+ description: For more information, see the Via object reference
properties:
channel:
type: string
@@ -2598,15 +2510,15 @@ components:
via_followup_source_id:
type: integer
format: int64
- description: POST requests only. The id of a closed ticket when creating a follow-up ticket. See Creating a follow-up ticket
+ description: POST requests only. The id of a closed ticket when creating a follow-up ticket. See Creating a follow-up ticket
via_id:
type: integer
format: int64
- description: Write only. For more information, see the Via object reference
+ description: Write only. For more information, see the Via object reference
writeOnly: true
voice_comment:
type: object
- description: Write only. See Creating voicemail ticket
+ description: Write only. See Creating voicemail ticket
writeOnly: true
example:
assignee_id: 235323
@@ -2680,18 +2592,18 @@ components:
description: Enterprise only. The id of the brand this ticket is associated with
collaborators:
type: array
- description: POST requests only. Users to add as cc's when creating a ticket. See Setting Collaborators
+ description: POST requests only. Users to add as cc's when creating a ticket. See Setting Collaborators
items:
$ref: '#/components/schemas/Collaborator'
email_cc_ids:
type: array
- description: The ids of agents or end users currently CC'ed on the ticket. See CCs and followers resources in the Support Help Center
+ description: The ids of agents or end users currently CC'ed on the ticket. See CCs and followers resources in the Support Help Center
items:
type: integer
format: int64
follower_ids:
type: array
- description: The ids of agents currently following the ticket. See CCs and followers resources
+ description: The ids of agents currently following the ticket. See CCs and followers resources
items:
type: integer
format: int64
@@ -2704,7 +2616,7 @@ components:
raw_subject:
type: string
description: |
- The dynamic content placeholder, if present, or the "subject" value, if not. See Dynamic Content Items
+ The dynamic content placeholder, if present, or the "subject" value, if not. See Dynamic Content Items
recipient:
type: string
description: The original recipient e-mail address of the ticket
@@ -2721,7 +2633,7 @@ components:
via_followup_source_id:
type: integer
format: int64
- description: POST requests only. The id of a closed ticket when creating a follow-up ticket. See Creating a follow-up ticket
+ description: POST requests only. The id of a closed ticket when creating a follow-up ticket. See Creating a follow-up ticket
required:
- comment
example:
@@ -2801,13 +2713,13 @@ components:
description: The relative position of the ticket field on a ticket. Note that for accounts with ticket forms, positions are controlled by the different forms
raw_description:
type: string
- description: The dynamic content placeholder if present, or the description value if not. See Dynamic Content
+ description: The dynamic content placeholder if present, or the description value if not. See Dynamic Content
raw_title:
type: string
- description: The dynamic content placeholder if present, or the title value if not. See Dynamic Content
+ description: The dynamic content placeholder if present, or the title value if not. See Dynamic Content
raw_title_in_portal:
type: string
- description: The dynamic content placeholder if present, or the "title_in_portal" value if not. See Dynamic Content
+ description: The dynamic content placeholder if present, or the "title_in_portal" value if not. See Dynamic Content
regexp_for_validation:
type: string
description: For "regexp" fields only. The validation pattern for a field value to be deemed valid
@@ -2849,7 +2761,7 @@ components:
description: The title of the ticket field for end users in Help Center
type:
type: string
- description: System or custom field type. Editable for custom field types and only on creation. See Create Ticket Field
+ description: System or custom field type. Editable for custom field types and only on creation. See Create Ticket Field
updated_at:
type: string
format: date-time
@@ -2889,7 +2801,7 @@ components:
properties:
additional_collaborators:
type: array
- description: An array of numeric IDs, emails, or objects containing name and email properties. See Setting Collaborators. An email notification is sent to them when the ticket is updated
+ description: An array of numeric IDs, emails, or objects containing name and email properties. See Setting Collaborators. An email notification is sent to them when the ticket is updated
items:
$ref: '#/components/schemas/Collaborator'
assignee_email:
@@ -2913,20 +2825,20 @@ components:
$ref: '#/components/schemas/TicketComment'
custom_fields:
type: array
- description: Custom fields for the ticket. See Setting custom field values
+ description: Custom fields for the ticket. See Setting custom field values
items:
$ref: '#/components/schemas/CustomField'
custom_status_id:
type: integer
- description: The custom ticket status id of the ticket. See custom ticket statuses
+ description: The custom ticket status id of the ticket. See custom ticket statuses
due_at:
type: string
format: date-time
- description: If this is a ticket of type "task" it has a due date. Due date format uses ISO 8601 format.
+ description: If this is a ticket of type "task" it has a due date. Due date format uses ISO 8601 format.
nullable: true
email_ccs:
type: array
- description: An array of objects that represent agent or end users email CCs to add or delete from the ticket. See Setting email CCs
+ description: An array of objects that represent agent or end users email CCs to add or delete from the ticket. See Setting email CCs
items:
$ref: '#/components/schemas/EmailCC'
external_id:
@@ -2934,7 +2846,7 @@ components:
description: An id you can use to link Zendesk Support tickets to local records
followers:
type: array
- description: An array of objects that represent agent followers to add or delete from the ticket. See Setting followers
+ description: An array of objects that represent agent followers to add or delete from the ticket. See Setting followers
items:
$ref: '#/components/schemas/Follower'
group_id:
@@ -2942,7 +2854,7 @@ components:
description: The group this ticket is assigned to
organization_id:
type: integer
- description: The organization of the requester. You can only specify the ID of an organization associated with the requester. See Organization Memberships
+ description: The organization of the requester. You can only specify the ID of an organization associated with the requester. See Organization Memberships
priority:
type: string
description: The urgency with which the ticket should be addressed.
@@ -2971,7 +2883,7 @@ components:
The state of the ticket.
If your account has activated custom ticket statuses, this is the ticket's
- status category. See custom ticket statuses.
+ status category. See custom ticket statuses.
enum:
- new
- open
@@ -3018,7 +2930,7 @@ components:
$ref: '#/components/schemas/TicketUpdateInput'
TicketAuditVia:
type: object
- description: Describes how the object was created. See the Via object reference
+ description: Describes how the object was created. See the Via object reference
properties:
channel:
type: string
@@ -3034,20 +2946,20 @@ components:
properties:
attachments:
type: array
- description: Attachments, if any. See Attachment
+ description: Attachments, if any. See Attachment
items:
$ref: '#/components/schemas/Attachment'
readOnly: true
audit_id:
type: integer
- description: The id of the ticket audit record. See Show Audit
+ description: The id of the ticket audit record. See Show Audit
readOnly: true
author_id:
type: integer
- description: The id of the comment author. See Author id
+ description: The id of the comment author. See Author id
body:
type: string
- description: The comment string. See Bodies
+ description: The comment string. See Bodies
created_at:
type: string
format: date-time
@@ -3055,30 +2967,30 @@ components:
readOnly: true
html_body:
type: string
- description: The comment formatted as HTML. See Bodies
+ description: The comment formatted as HTML. See Bodies
id:
type: integer
description: Automatically assigned when the comment is created
readOnly: true
metadata:
type: object
- description: System information (web client, IP address, etc.) and comment flags, if any. See Comment flags
+ description: System information (web client, IP address, etc.) and comment flags, if any. See Comment flags
additionalProperties: true
readOnly: true
plain_body:
type: string
- description: The comment presented as plain text. See Bodies
+ description: The comment presented as plain text. See Bodies
readOnly: true
public:
type: boolean
description: true if a public comment; false if an internal note. The initial value set on ticket creation persists for any additional comment unless you change it
type:
type: string
- description: "`Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See Adding voice comments to tickets"
+ description: '`Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See Adding voice comments to tickets'
readOnly: true
uploads:
type: array
- description: List of tokens received from uploading files for comment attachments. The files are attached by creating or updating tickets with the tokens. See Attaching files in Tickets
+ description: List of tokens received from uploading files for comment attachments. The files are attached by creating or updating tickets with the tokens. See Attaching files in Tickets
items:
type: string
via:
@@ -3231,7 +3143,8 @@ components:
description: Automatically assigned when a translation is created
readOnly: true
locale:
- $ref: '#/components/schemas/LocaleAbbreviation'
+ type: string
+ description: The locale of the translation
outdated:
type: boolean
description: True if the translation is outdated; false otherwise. False by default
@@ -3261,6 +3174,12 @@ components:
type: string
description: The API url of the translation
readOnly: true
+ example:
+ id: 3243452
+ locale: en
+ source_id: 768934
+ source_type: Article
+ title: Hello translation
required:
- locale
- title
@@ -3451,7 +3370,7 @@ components:
Via:
type: object
description: |
- An object explaining how the ticket was created. See the Via object reference
+ An object explaining how the ticket was created. See the Via object reference
properties:
channel:
type: string
@@ -3678,7 +3597,9 @@ components:
description: The locale the item is displayed in. (must be lowercase, even if returned from zendesk as mixed case)
required: true
schema:
- $ref: '#/components/schemas/LocaleAbbreviation'
+ type: string
+ example: en-us
+ example: en-us
PostCommentId:
name: post_comment_id
in: path
@@ -3812,4 +3733,4 @@ components:
schema:
type: integer
format: int64
- example: 35467
\ No newline at end of file
+ example: 35467
diff --git a/src/test/groovy/lol/pbu/z4j/Z4jSpec.groovy b/src/test/groovy/lol/pbu/z4j/Z4jSpec.groovy
index 84d5ea4..07510fe 100644
--- a/src/test/groovy/lol/pbu/z4j/Z4jSpec.groovy
+++ b/src/test/groovy/lol/pbu/z4j/Z4jSpec.groovy
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package lol.pbu.z4j
import io.micronaut.context.ApplicationContext
@@ -72,3 +87,4 @@ class Z4jSpec extends Specification {
ApplicationContext.builder(EmbeddedServer).properties(properties).build().start()
}
}
+
diff --git a/src/test/groovy/lol/pbu/z4j/client/ArticleClientSpec.groovy b/src/test/groovy/lol/pbu/z4j/client/ArticleClientSpec.groovy
index 24829b7..cda2332 100644
--- a/src/test/groovy/lol/pbu/z4j/client/ArticleClientSpec.groovy
+++ b/src/test/groovy/lol/pbu/z4j/client/ArticleClientSpec.groovy
@@ -1,11 +1,26 @@
+/*
+ * Copyright 2026 Peanut Butter Unicorn, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package lol.pbu.z4j.client
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import lol.pbu.z4j.Z4jSpec
import lol.pbu.z4j.model.ArticlesResponse
-import lol.pbu.z4j.model.ListArticlesSortByParameter
-import lol.pbu.z4j.model.ListArticlesSortOrderParameter
import lol.pbu.z4j.model.LocaleAbbreviation
+import lol.pbu.z4j.model.SortArticleBy
+import lol.pbu.z4j.model.SortOrder
import reactor.core.publisher.Mono
import spock.lang.Shared
@@ -22,13 +37,14 @@ class ArticleClientSpec extends Z4jSpec {
adminArticleClient = adminCtx.getBean(ArticleClient.class)
agentArticleClient = agentCtx.getBean(ArticleClient.class)
userArticleClient = userCtx.getBean(ArticleClient.class)
- allLocales = List.of(LocaleAbbreviation.ENGLISH_UNITED_STATES, LocaleAbbreviation.FRENCH)
+ allLocales = userCtx.getBean(LocaleClient.class).listLocales().block().locales.collect { it.localeAbbreviation }
}
- def "can use ListArticles for other tests using the '#locale' locale"(ArticleClient articleClient, LocaleAbbreviation locale, ListArticlesSortByParameter sortBy, ListArticlesSortOrderParameter sortOrder, Long startTime, String labelNames) {
+ def "can use ListArticles for other tests using the '#localeAbbreviation' locale"(
+ ArticleClient articleClient, LocaleAbbreviation localeAbbreviation, SortArticleBy sortBy, SortOrder sortOrder, Long startTime, String labelNames) {
// https://github.com/PeanutButter-Unicorn/z4j/issues/31
- when: "query articles list for the '#locale' locale"
- Mono