Format grant 404 workspace_not_found: only team handles resolve
workspace_not_found on POST .../grants means the handle matches no team workspace. User handles are not grantable, so pass a team handle or an org_ id.

404 workspace_not_found on POST /v1/formats/{handle}/{slug}/grants means the value in workspace does not resolve to a team workspace. A personal user handle never resolves, because sharing a Format is workspace to workspace, never to a person. Pass the invitee's team handle, or its org_... id.
How the value is resolved
The API reads the workspace field in two ways. If it starts with org_, it is taken as the workspace id as is and no handle lookup happens. Anything else is lowercased and looked up in the handle registry, and the match must be a team, not a user.
A handle that exists but belongs to a person gives the same workspace_not_found as one that does not exist at all. That is intentional: it avoids confirming whether a given person handle is registered.
| You send | Result |
|---|---|
| A team handle such as kiwi | Resolved to the team workspace. Grant created pending. |
| An org_ id | Used directly, no handle lookup. |
| A user handle | 404 workspace_not_found. |
| An unknown handle | 404 workspace_not_found. |
| Under 2 or over 39 characters | 400 before any lookup (schema length bounds). |
Do not confuse it with format_not_found
Both are 404s on the same call, and they point at different values. format_not_found says the Format address in the path did not resolve for your key: wrong handle, archived, or you used a personal key against a team Format. workspace_not_found says the Format was fine and the invitee was not.
Check the path first, then the body. If the Format address were wrong, you would not have reached the invitee lookup at all.
A quick way to fix it
Ask the partner for the handle shown on their team workspace, not their own profile handle. If they send an org_ id, use that, because it also survives a later rename of the handle.
For the revoke and role calls, the same rule applies to the {workspace} path segment, which accepts a team handle or an org id.
Checking the handle before you call
There is no public endpoint that tells you whether a handle is a team or a person, by design. The reliable check is human: the partner opens their workspace switcher and reads the team handle there. If you are building an onboarding form for partners, label the field Team handle and show the example format, so people do not paste their personal username.
A second source of confusion is case and whitespace. The value is trimmed and lowercased before lookup, so Kiwi and kiwi behave like kiwi, but an at-sign prefix is part of the string and will fail the lookup. Strip a leading at-sign in your form if your users type one.
Finally, remember the body bounds. Two to 39 characters is the schema range for workspace, so a one-letter value is rejected before any lookup happens, and that is a validation error rather than this 404.
Limits
The error is not retryable and the OpenAPI example marks it as a fix-the-input case. If handle resolution is not configured in an environment, the API returns a 503 account_handles_unavailable instead, which is a deployment issue rather than a typo.
Sources
Related posts
More in Formats
- Format grant 409: exists, self, or workspace_required
A 409 on POST .../grants is format_grant_exists, format_grant_self or format_workspace_required. Each has its own fix, and none is a retry.
- Format run spend caps: the $500 ceiling and the null trap
A Sume Format run cannot spend past its cap. Omit it to inherit the Format's cap, send up to 500 to set one, and know null means $500, not no limit.
- Gemini Omni edit: direct Video Router call or a Sume Format run?
Use the Video Router edit call for one precise change to one clip. Use a Format run when the job has steps, a schema and a spend cap around the edit.
- Spend cap for six 10-second 1080p clips: set $25, not the $400 default
Six 10-second Omni 1080p clips bill $11.28 on Sume. Set generation_spend_cap_usd to about $25 to allow one retake each, instead of the $400 default or $500 max.
Written by Sume