> For the complete documentation index, see [llms.txt](https://docs.stellic.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.stellic.com/stellic-partner-api/hold/remove-a-student-hold.md).

# Remove a student hold

Use this endpoint when a hold should stop applying, for example once a balance is paid. The hold stops blocking activity right away and no longer appears in reads or searches. The response returns the removed hold. You can reuse its `sis_id` for a new hold.

## DELETE /holds/student\_holds/{sis\_id}

>

```json
{"openapi":"3.0.0","info":{"title":"Stellic for Developers","version":"1.0"},"tags":[{"name":"Hold"}],"servers":[{"url":"https://{institution}.stellic.com/partnerapi/v1","variables":{"institution":{"default":"{institution}","description":"Your institution's Stellic subdomain: the part before `.stellic.com` in the URL you use to sign in. It becomes the host in every request, as in `https://{institution}.stellic.com/partnerapi/v1/...`. Replace the `{institution}` placeholder with your subdomain before sending."}}}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Personal Access Token issued by your Stellic integration partner. Send it as `Authorization: Bearer <token>` on every request. One token per institution; do not share across environments."}},"schemas":{"StudentHoldResponse":{"type":"object","description":"A serialized hold record, returned under the `hold` key.","properties":{"activities":{"type":"array","description":"Activity names this hold blocks, as plain strings (not objects). Empty when the hold type is inactive or has no enforced activity. Possible values are `disallow_register_activity`, `disallow_drop_activity`, and `hide_grade_activity`.","items":{"type":"string"}},"campuses":{"type":"array","description":"Campuses the hold is limited to. Empty means every campus. Holds placed through the API never set this; holds loaded by your data sync can.","items":{"type":"object","properties":{"name":{"type":"string"},"screen_name":{"type":"string"}}}},"code":{"type":"string","description":"The hold type's code (the `hold_code` you sent)."},"description":{"type":"string","description":"The hold type's description. Displayed along with the title."},"enrollment_levels":{"type":"array","description":"Enrollment levels the hold is limited to. Empty means every level. Holds placed through the API never set this; holds loaded by your data sync can.","items":{"type":"object","properties":{"display_name":{"type":"string"},"name":{"type":"string"}}}},"note":{"type":"string","description":"The per-student note you sent, or an empty string."},"semester":{"type":"string","nullable":true,"description":"Term name when the hold is term-scoped (a matching `term_code` was sent), otherwise `null`."},"sis_id":{"type":"string","description":"The hold's `sis_id`."},"title":{"type":"string","description":"The hold type's title. Displayed to the student."},"url_link":{"type":"string","description":"The link you sent, or an empty string."},"url_text":{"type":"string","description":"The link placeholder text you sent, or an empty string."},"year":{"type":"integer","nullable":true,"description":"Term year when the hold is term-scoped, otherwise `null`."}}}}},"paths":{"/holds/student_holds/{sis_id}":{"delete":{"tags":["Hold"],"parameters":[{"name":"sis_id","in":"path","required":true,"description":"Hold's `sis_id`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Returned for both success and for domain errors. Branch on the\n`success` field in the body, not the HTTP status.\n\nOn success, `success` is `true` and the removed hold is under `hold`.\n\nOn error, `success` is `false` and the body is\n`{\"success\": false, \"message\": {\"code\": ..., \"text\": ...}}`.\n`message.code` is `404` when no active hold matches `sis_id` (it was\nnever created, or it is already removed), with the text \"The provided\nstudent hold is invalid.\" It is also `404` for a hold whose student has\nsince been archived, with the text \"Cannot remove student hold `{sis_id}`\nbecause it links to a student who is no longer active.\" It is `400` for\nany other failure, with the generic text \"We\nare unable to process your request at the moment. Please try again\nlater.\" The HTTP status is still `200` in every one of these cases.","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"success":{"type":"boolean"}}},{"type":"object","properties":{"hold":{"$ref":"#/components/schemas/StudentHoldResponse"}}}]}}}},"401":{"description":"Missing or invalid Bearer token. This is the only genuine error HTTP\nstatus; auth is checked before the view runs."},"403":{"description":"Your IP address isn't on the allowlist for this endpoint. Contact Stellic to add it; the response includes the `client_ip` Stellic saw.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"client_ip":{"type":"string"}}}}}}}}}}}
```

#### Notes

* **Errors come back with HTTP 200.** Check `success` in the body. An unknown or already-removed `sis_id` returns `message.code` 404 with "The provided student hold is invalid," so treat that as success if you retry.
* **Holds on archived students can't be removed.** Remove holds before you archive a student.

#### Related APIs

* [`POST /holds/student_holds`](/stellic-partner-api/hold/place-a-hold-on-a-student.md) to place a hold.
* [`GET /holds/student_holds/{sis_id}`](/stellic-partner-api/hold/read-a-student-hold.md) to read a hold before removing it.
