SG Ground Truth

POST /entity/human_users/<user_id>/follow

post_entity_human_users_id_follow

Subscribes one HumanUser to a list of records at 204. entity must be the CamelCase schema name: the snake_case plural every path uses answers 500, and a bad id in the list 404s after applying the good ones.

API

Params

part value
<user_id> a HumanUser id. Any other user type is a 404
Content-Type application/json. A vendor type is a 415
entities required list of {"record_id": <int>, "entity": "<SchemaName>"}
entities[].entity the CamelCase schema name, Shot, never shots

Sample requests

r = c.post("/entity/human_users/3/follow",
           json={"entities": [{"record_id": 7668, "entity": "Shot"}]})
204, empty body
r = c.get("/entity/shots/7668/followers")
{"data": [{"id": 3, "type": "HumanUser", "attributes": {"name": "<user>"},
           "links": {"self": "/api/v1/entity/HumanUser/3"}}]}

The plural spelling that works in every path segment does not work here:

r = c.post("/entity/human_users/3/follow",
           json={"entities": [{"record_id": 7669, "entity": "shots"}]})
{"errors": [{"status": 500, "code": 100, "title": "Shotgun Server Error", "source": null,
  "detail": "Please contact your Shotgun administrator, or contact Shotgun support at: ...
   Please pass on the following information so we can trace what happened: Request: ... Event: ..."}]}

A name that is not a schema name at all is a clean 400 that points at the offending index:

r = c.post("/entity/human_users/3/follow",
           json={"entities": [{"record_id": 7668, "entity": "Bogus"}]})
{"errors": [{"status": 400, "code": 103, "title": "Request Parameters invalid.",
  "source": {"entities": {"0": {"entity": ["entity is not valid"]}}}}]}

Response codes

status when
204 followed, including a repeat and an empty entities list
400 source: {"entities": ["entities is missing"]}
400 source: {"entities": {"0": {"entity": ["entity is not valid"]}}}
404 detail: "Couldn't find Shot with id=999999999"
404 detail: "Couldn't find HumanUser with id=\"999999999\""
415 source: {"content_type": "Content-Type must be one of: 'application/json'."}
500 entity given as the snake_case plural

Edge cases

sent result
{"entities": [{"record_id": 7668, "entity": "Shot"}]} 204, followed
the same call again 204, still one follower
{"entities": [{"record_id": 7669, "entity": "shots"}]} 500, not followed
{"record_id": 7668, "entity": "Shot"} 400 entities is missing
{} 400 entities is missing
{"entities": []} 204, nothing followed
one good record and one missing id 404, and the good one is followed
  • The call is not atomic. A list holding a live id and a missing one answers 404 Couldn't find Shot with id=999999999, and reading the live record back shows the follow was applied. A 404 here does not mean nothing happened, so re-read followers rather than retrying the whole list.
  • The 415 body is the same one /hierarchy/_expand returns (findings/046_search_without_a_path): a client that sets application/vnd+shotgun.api3_array+json for every POST fails on this one.
  • 204 has no body, so nothing names which entries were applied.
  • The user is in the path and the records are in the body. Unfollowing inverts that: see endpoints/put_entity_type_id_unfollow.

Every entry on this site is the output of a probe in probes/. The corpus is generated by running those probes against a live Flow Production Tracking site, not written from memory.

Not affiliated with or endorsed by Autodesk. Flow Production Tracking is their product; this is an independent record of how its REST API answers.