Create an Appeal

POST https://api.hivemoderation.com/api/v1/appeals/create

Appeals allow users to contest previous moderation decisions. You can submit an appeal using either judgment_id or appeal_context. If the content has expired, you will need to include this field in this request.


Example Request

curl -X POST https://api.hivemoderation.com/api/v1/appeals/create \
  -H "Authorization: token <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "appeal_context": {
      "type": "post",
      "post_id": "post-1",
      "user_id": "user-1" },
    "appealer_id": "user-1",
    "appeal_reason": "This content was flagged incorrectly. It is educational material.",
    "appeal_categories": ["false_positive", "educational_content"]
  }'

Request

Headers

HeaderTypeRequiredDescription
AuthorizationstringYesAPI key from Moderation Dashboard (per-application).
Content-TypestringYesSubmit JSON data in the request body.

Request Body Parameters

ParameterTypeRequiredDescription
appealer_idstringYesUnique identifier for the user submitting the appeal.
judgment_idstringConditional*ID of the moderation judgment being appealed.
appeal_contextobjectConditional*Context object for the content being appealed (see below).
appeal_reasonstringNoFree-form text explaining the appeal.
appeal_categoriesarrayNoCategory strings for the appeal type.
report_idstringNoAssociated report ID.
metadataobjectNoCustom metadata (any valid JSON). Must not be greater than 2048 characters.
text_datastringConditional†Text content for moderator review. Required if original content has expired.
urlstringConditional†Media URL for moderator review. Required if original content has expired.

Notes

  • (*) Provide exactly one: judgment_id OR appeal_context.
  • (†) When original content has expired, provide exactly one: text_data OR url.

Appeal Context Object

Required when using appeal_context instead of judgment_id.

FieldTypeRequiredDescription
typestringYesEither "post" or "user".
user_idstringYesUser ID associated with the content.
post_idstringConditionalRequired when type is "post". Mutually exclusive with source_post_id.
source_post_idstringNoOriginal post ID for shared/reposted content. Mutually exclusive with post_id.

Responses

Response Fields

FieldTypeAlways ReturnedDescription
appeal.idstringNoUnique identifier for the created appeal.
appeal.application_idstringYesYour application ID.
appeal.appeal_categoriesarrayNoCategories associated with the appeal.
appeal.patron_idstringNoID of the user about whom the appeal was made.
appeal.post_idstringNoID of the post about which the appeal was made.
appeal.timestampstringYesTimestamp (ISO 8601 format) when the appeal was created.
appeal.appeal_reasonstringNoThe reason provided for the appeal.
appeal.metadataobjectNoCustom metadata attached to the appeal.
appeal.text_datastringConditional*Text content from the appealed post. Returned if the post is of type text.
appeal.urlstringConditional*Media URL from the appealed post. Returned if the post contains media.
appeal.judgment_idstringNoAssociated judgment ID (if provided).
appeal.report_idstringNoAssociated report ID (if provided).
appeal.appealer_idstringYesID of the user who submitted the appeal.
appeal.entity_typestringYesEither "patron", "post", or "none".
appeal.bucketstringYes
appeal.content_expiredbooleanYesWhether the content has expired.

Notes

  • (*) When original content has expired, provide exactly one: text_data OR url.

Example Responses

Example Success (200 OK)

{
  "appeal": {
    "id": "appeal_xyz789",
    "application_id": "app_123",
    "judgment_id": "jdg_abc123xyz",
    "appealer_id": "user_789",
    "appeal_reason": "This content was flagged incorrectly. It is educational material.",
    "appeal_categories": ["false_positive", "educational_content"],
    "status": "pending",
    "created_at": "2026-01-21T10:30:00Z",
    "metadata": null
  }
}

Example Error Response (400 Bad Request)

{
  "error": true,
  "status": 400,
  "error_code": "PARAM_REQUIRED",
  "message": "appealer_id is required.",
  "show_alert": false,
}

Common Errors

Status CodeError CodeDescription
400INVALID_PARAMETERSMissing required parameter or invalid type.
400INVALID_APPEAL_CONTEXT_TYPEappeal_context.type must be "post" or "user".
400CONFLICTING_PARAMETERSViolated mutual exclusivity rules (e.g., provided both judgment_id and appeal_context).
400NONEXISTENT_POST_IDThe post ID references expired/deleted content. Include text_data or url to provide content for moderator review.
400APPEAL_METADATA_TOO_LARGEAppeal Metadata must be under 2048 total characters.
401UNAUTHORIZEDInvalid or missing API key.
404JUDGMENT_NOT_FOUNDThe specified judgment_id does not exist.
429RATE_LIMIT_EXCEEDEDToo many requests. Please retry after the specified time.