Skip to content
GitmoapdocsBeta
Guide· How do I…?

Your account

Overview

Your account is the identity everything else hangs off: the name on your commits and comments, the person a merge request is assigned to, the owner of your tokens and of your personal namespace. From it you can change the username and email you are shown as, put a picture on it, look other people up by username or email address, see how many bytes your credentials have pulled this hour and today, and close the account when you are done with it.

You never sign up for it. Signing in for the first time creates the profile and a personal namespace for you, so the tasks below are all edits to something that already exists.

Before you start

  • An account, which you already have if you can sign in.The profile and a personal group named after you are created the first time you authenticate, and every later sign-in checks they are still there. There is no registration form.
  • Only you can change your own.Every write here is self-only, with no exceptions: editing a profile, uploading or removing a picture, and deleting an account are refused with 403 for anybody but the account's owner, whatever access level they hold anywhere else.
  • A token with the right scope, if you are calling the API or the CLI rather than clicking: user:read for every read on this page including your own transfer figures, user:create to register a profile, user:update to edit one and to set or remove its picture, and user:delete to close it. Scopes are fixed when a token is minted and cannot be added afterwards, so a script that only looks people up should carry user:read alone.
  • A signed-in caller for the email lookup.Reading a profile by id or by username works with no credential at all. Resolving an email address to a person does not.
  • Membership of the group whose people you want to list.Any access level is enough — Guest included — but you have to hold one, and it has to be on that group. No other task on this page depends on an access level, because none of them touches a group or a repository.
  • Your own credential, not a service account's.A service-account token cannot stand in for a person here: the writes are refused with 403 because the account is not the target user, and registering or listing refuses a non-human caller with 400.
  • An image of at most 5 MiB, in PNG, JPEG, GIF or WebP, if you are setting a picture. Exactly 5 MiB is allowed; a byte more is not.

How it works

Your account is created for you

The first time you authenticate, the platform derives a username from the local part of your email address, creates the profile, and creates a private top-level group with that same name — your personal namespace, the place your own repositories go when you do not pick a group. Every later sign-in re-checks both. The profile is verified before you are issued a session, so you can never hold a token without one; the namespace is created on a later sign-in if it did not go through at signup.

The derivation lowercases the local part, replaces everything that is not a letter, digit or hyphen with a hyphen, collapses runs of hyphens, and trims the ends. If the result is shorter than two characters it falls back to user-0. If the name is taken, a number is appended.

john.doe@example.com -> john-doe
John.Doe@example.com -> john-doe1 (john-doe was taken)
john.doe_test+tag@corp.com -> john-doe-test-tag
x@example.com -> user-0 (too short to use)
admin@corp.com -> user-0 (admin is a reserved name)

A username is also the path of your personal group, so it is checked like an organisation's name: a word Gitmoap keeps, a well-known organisation's name or one that looks like it, and a name an organisation gave up recently are never derived. A refused name falls back to user-0, numbered past whoever already has it, and if that is refused too, to user- followed by eight letters and digits. Owning the domain in your email address makes no difference — a domain unlocks a reserved name only for an organisation, never for a person. The Groups page lists what is kept back and why.

None of this is permanent — the derived name is a starting point, and changing it is one of the tasks below.

What is public, and what is not

ReadWho can do it
A profile by its id, or by usernameanyone, signed in or not
A profile by email addressany signed-in caller
The people in a groupany member of it, at any access level
Your own transfer usageyou, for your own credential

Profiles are public because they have to be: a public repository's commit authors, its contributors and the participants on a merge request all have to resolve for a reader who has no account. The email lookup is the one read that is gated, because answering it confirms an address that the caller typed rather than resolving one the platform published, and that answer is worth something to somebody guessing addresses. A profile never carries the email address: reading one by id or by username returns the id, the username and the avatar, and only your own account (GET /user) shows your email.

Your picture is addressed by your email

An avatar is stored under a fingerprint of your email address, and the URL other pages load it from is computed from that same address. Two consequences follow, and both surprise people:

  • Change your email and your picture appears to reset. The image is still there under the old address, but nothing points at it any more. Upload it again after the change.
  • You have a picture address whether or not you upload anything. It is computed from your email address rather than stored, so an account that has never uploaded an image still resolves to the default image served at that address rather than to a blank.

Your id is the account's own, not your sign-in's

Your account's id is chosen by the platform when the account is created, and it never changes. It is not the identifier your identity provider uses for you, and it is not anything in your sign-in token — so the way you sign in can change without your account changing.

You can reach one account in more than one way: with a password, and through your organisation's single sign-on, for example. The first time a new way of signing in reaches the platform, it is joined to the account that already holds its email address — as long as that address has been verified, either by the code sent to it when you signed up or by your organisation's identity provider on a domain the organisation has proved it owns. A sign-in whose address has not been verified is refused rather than given a second account: verify the address and sign in again. Your repositories, memberships, tokens and history stay where they are, whichever way you came in.

Because your id is not in your sign-in token, a program that needs it asks for it — the call under Find out which account you are signed in as — rather than reading it out of the token.

Your username is a label; your id is the identity

Everything that stores a reference to you stores your id, so renaming yourself breaks nothing: your memberships, tokens, commits, reviews and work items all follow. What does not follow is anything spelled with the old name — a bookmarked profile link stops resolving, and your personal namespace keeps its original path. Renaming yourself and renaming that group are two separate acts; do the second one as well if you want them to match.

How to

Find out which account you are signed in as

Ask for your own account and you get a profile's fields plus the one only you see — the id, the username, the avatar and your email address — for whoever the credential belongs to. It is the way for a script or an app to learn your id: store that id, not the username, which you can change.

Choose your avatar in the top-right: the menu shows the username and email address of the account you are signed in as, with a link to its profile.

Terminalbash
gitmoap users get-current
curlbash
curl -X GET https://api.gitmoap.example/user \
-H "Authorization: Bearer $GITMOAP_TOKEN"

See your profile

A profile carries three things and no more: the id, the username and the avatar. There is no bio, no location and no pronoun field to fill in. The read takes an id and answers anybody, signed in or not.

Choose your avatar in the top-right and then your name to open your own profile, or choose anybody's avatar or username anywhere it appears. A profile shows the picture, the username and a contribution heatmap. The heatmap is counted from the viewer's side — it folds in the subject's work in the repositories you can already read — so two people looking at the same profile can see different totals, and neither of them sees a repository name.

Terminalbash
gitmoap users get --user-id <id>
curlbash
curl -X GET https://api.gitmoap.example/users/{user_id} \
-H "Authorization: Bearer $GITMOAP_TOKEN"

Change your username or email

Both fields are edited together and both are unique across the platform, so a name somebody else already holds is refused rather than taken from them. Sending only one field changes only that field. A new username is checked the way an organisation's name is: a word Gitmoap keeps, a well-known organisation's name or one that looks like it, and a name an organisation gave up recently are refused, and no domain you own unlocks one. Sending the username you already have changes nothing and is never refused.

Choose your avatar in the top-right, then Settings, and stay on the Profile section. Edit Username or Email, then choose Save in the bar that appears along the bottom. Navigating away with unsaved edits asks you first rather than discarding them.

Terminalbash
gitmoap users update --user-id <id>
curlbash
curl -X PUT https://api.gitmoap.example/users/{user_id} \
-H "Authorization: Bearer $GITMOAP_TOKEN"

Changing the email on your profile does not change the address you sign in with — that one belongs to whoever authenticates you. It does change the address the email lookup resolves, the address your picture is keyed to, and the address commits are matched against when the platform works out which commits are yours.

Set a profile picture

Uploading is two calls, because the bytes never pass through the API. You ask for an upload link, declaring the file's exact size and type; you then send the file to the link you got back. The size you declared is bound into that link, so the upload has to be exactly that many bytes — a file that changed between the two steps is refused by storage rather than accepted and served wrong.

  1. Ask for an upload link, passing the image's exact byte count and content type. You get back the link and the URL the image will be served from.

  2. Send the file to that link with PUT, with the same content type. Do not attach your token — the link carries its own authorization.

  3. The link is valid for five minutes. If you take longer, ask for another one.

In Settings → Profile, use the avatar control above the fields: choose an image and it uploads as soon as you pick it, then the new picture appears everywhere you are shown. The web app does both steps for you.

Terminalbash
gitmoap users upload-avatar \
--user-id <id> \
--content-length <n> \
--content-type <content type>
curlbash
curl -X PUT https://api.gitmoap.example/users/{user_id}/avatar \
-H "Authorization: Bearer $GITMOAP_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "content_length": "<int64>", "content_type": "<string>" }'

Remove your profile picture

Removing the image is its own action, and the only one — editing a profile can set the avatar field but has no way to clear it, so there is no second route to the same result. Removing the image does not blank your profile either: the address it was served from is unchanged, and the default image appears there instead.

In Settings → Profile, choose Remove on the avatar control. The default image replaces it immediately.

Terminalbash
gitmoap users delete-avatar --user-id <id>
curlbash
curl -X DELETE https://api.gitmoap.example/users/{user_id}/avatar \
-H "Authorization: Bearer $GITMOAP_TOKEN"

Look somebody up by username

The lookup is exact, not a search — it resolves one name to one person, and answers 404 for anything else. Case does not matter: usernames are lowercase, and what you send is lowercased first, so Jane-Doe finds jane-doe. Use it to turn an @name into an id before you add somebody to a repository or assign them a work item.

Open a profile directly at its username, or start typing a name into any people picker — the member field on a repository, the reviewer field on a merge request, the assignee field on a work item.

Terminalbash
gitmoap users get-by-username --username <id>
curlbash
curl -X GET https://api.gitmoap.example/users/by-username/{username} \
-H "Authorization: Bearer $GITMOAP_TOKEN"

Find somebody by their email address

The by-address lookup is the way to reach somebody who is not in the group you are working in — an external collaborator you want to add as a member, or a commit author you want to resolve to an account. It needs you to be signed in, and it matches the whole address exactly, ignoring case.

Type a full email address into any people picker that allows somebody from outside the group. A name that matches nobody in the group's list but is a complete address resolves to that person and can be picked.

Terminalbash
gitmoap users get-by-email --email <id>
curlbash
curl -X GET https://api.gitmoap.example/users/by-email/{email} \
-H "Authorization: Bearer $GITMOAP_TOKEN"

List the people in a group

The listing is scoped to one group — the organisation's top-level group in the normal case — and you have to be a member of it, at any level, because a group's roster is not public even though every individual profile is. The group's own member list (under Members) asks for more — Reporter or above — whatever the group's visibility. It returns that group's direct members only, so somebody who reaches a subgroup through a membership held higher up does not appear in the subgroup's list. Each row carries the id, username, email address and avatar. Ask for up to 100 rows at a time and follow the token in the response for the next page.

Open the group and choose its Members section to see who is in it. The same roster backs the people pickers you type into elsewhere, so a name that does not come up is usually a name that is not a member of the group you are working in — add them there first, or resolve them by their exact email address instead.

Terminalbash
gitmoap users list --group-id <group id>
curlbash
curl -X GET https://api.gitmoap.example/users \
-H "Authorization: Bearer $GITMOAP_TOKEN"

Check how much data you have pulled

Every clone, fetch, package download, release asset, archive, diff and log tail is charged against the identity that asked for it, in two windows at once: a short hourly burst allowance and a larger daily one. The self-view reports what you have spent in each and what the ceiling is, so you can tell a 429 on a clone from a network problem before you start debugging the wrong thing.

Choose your avatar in the top-right, then Settings → Transfer. Two meters show the current hour and the current day against their allowances, and the panel names the credential the spending is counted against — your own identity, or the service account whose token you are using.

Terminalbash
gitmoap users get-my-egress-usage
curlbash
curl -X GET https://api.gitmoap.example/user/egress-usage \
-H "Authorization: Bearer $GITMOAP_TOKEN"

The windows roll: the hourly figure resets on the hour and the daily one at midnight UTC, and the response names the exact window each number covers so you can tell a reset from a wrong number. Budgets are per identity, not per token — every personal access token you sign requests with spends the same one, while a service account has its own.

Register a profile by hand

Signing in does this for you, so the only reason to call it is a credential that has authenticated but has no profile behind it. It takes a username and an email, and it always creates the profile for the caller — you cannot register somebody else. Calling it a second time is refused with 409, which is safe to treat as success. It is never refused because a version of the Terms is waiting for you: you accept the Terms as yourself, so the profile has to exist first.

There is no screen for this. The web app has no registration form, because signing in for the first time creates the profile before you reach any page that could show one.

Terminalbash
gitmoap users create --email <email> --username <username>
curlbash
curl -X POST https://api.gitmoap.example/users \
-H "Authorization: Bearer $GITMOAP_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "email": "<string>", "username": "<string>" }'

Delete your account

Warning

Deleting an account is immediate and cannot be undone. It takes your group and repository memberships, your reviewer assignments, your work-item assignments, your stars, your contribution history and every personal access token you hold with it — any script still signing with one starts failing at once. What it does not take is anything you authored: repositories and groups you created, merge requests you opened, work items you filed and comments you left are historical record and stay where they are. Ownership is checked before anything is removed, so a refusal leaves the account exactly as it was.

Two checks stand between you and a deletion, and both are refusals rather than partial deletions:

  • You cannot be the sole Owner of an organisation. If you are the only Owner of a top-level group, the request is refused and the response names every such group. Add another Owner, or delete the organisation, then try again. Being the last direct Owner of a subgroup or a repository does not block you — the organisation's Owners administer those. Expect this one on your first attempt: signing in created a private top-level group for you and made you its only Owner, so it is on the list until you hand it over or delete it.
  • You cannot be credited as the creator or author of anything that still exists. Authorship is kept deliberately, so an account that created a group or a repository, or opened a merge request, is refused as well — this time with a 409 that names nothing, because what blocks it is a reference held by somebody else's record rather than a resource of yours. Delete or transfer what you created where you can. Past that, removing an identity that authored work is an anonymisation rather than a deletion, and it is not what this call does.

There is no screen for this. Deleting an account is a CLI or API call, deliberately: it is not a button you can reach by accident from a settings page.

Terminalbash
gitmoap users delete --user-id <id>
curlbash
curl -X DELETE https://api.gitmoap.example/users/{user_id} \
-H "Authorization: Bearer $GITMOAP_TOKEN"

Reference

Every read here is addressed by an id, except the two lookups that exist precisely because you have a name or an address instead, and your own account and transfer view, which are always about the credential you called with. Every write below is self-only.

11 endpoints

GET/useruser:read

Get the signed-in user's own account

get_current_userGET /userOpen in the API reference

Token scope

user:read

Send

Nothing — the address is the whole request.

Refuses

  • 400The credential belongs to a service account or a pipeline run, which has no user account
  • 401Unauthorized
  • 403Forbidden — the caller's access level or token scope is insufficient

Receive

  • avatarobjectoptional
  • emailstring
  • user_iduuid
  • usernamestring
GET/users/{user_id}user:read

Get a user by ID

get_userGET /users/{user_id}Open in the API reference

Token scope

user:read

Send

Path
  • user_iduuidUser ID

Refuses

  • 400Bad request — a path parameter is not a well-formed value of its type
  • 401Unauthenticated — no credential, or an invalid one
  • 403Forbidden — the caller's access level or token scope is insufficient
  • 404User not found

Receive

  • avatarobjectoptionalThe URL of the person's avatar image, when they have one.
  • user_iduuid
  • usernamestring
GET/users/by-username/{username}user:read

Look up a user by username

get_user_by_usernameGET /users/by-username/{username}Open in the API reference

Token scope

user:read

Send

Path
  • usernamestringUsername

Refuses

  • 400Invalid username format
  • 401Unauthenticated — no credential, or an invalid one
  • 403Forbidden — the caller's access level or token scope is insufficient
  • 404No user with that username

Receive

The same shape get_user returns — 3 fields. Go to it

Show it here
  • avatarobjectoptionalThe URL of the person's avatar image, when they have one.
  • user_iduuid
  • usernamestring
GET/users/by-email/{email}user:read

Look up a user by email address

get_user_by_emailGET /users/by-email/{email}Open in the API reference

Token scope

user:read

Send

Path
  • emailstringEmail address

Refuses

  • 400Invalid email format
  • 401Unauthenticated
  • 403Forbidden — the caller's access level or token scope is insufficient
  • 404No user with that email

Receive

The same shape get_current_user returns — 4 fields. Go to it

Show it here
  • avatarobjectoptional
  • emailstring
  • user_iduuid
  • usernamestring
GET/usersuser:read

List the members of a group, with their profiles

list_usersGET /usersOpen in the API reference

Token scope

user:read

Send

Query
  • group_idstringThe group whose members to list (required)
  • limitint32optionalPage size (max 100)
  • cursorstringoptionalPagination cursor

Refuses

  • 400Invalid request
  • 401Unauthenticated — no credential, or an invalid one
  • 403Caller is not a member of this group
  • 404Group not found

Receive

  • items[]object4 fields
    • avatarobjectoptional
    • emailstring
    • user_iduuid
    • usernamestring
  • next_tokenobjectoptional
POST/usersuser:create

Create the signed-in person's user profile

create_userPOST /usersOpen in the API reference

Token scope

user:create

Send

Body
  • avatarobjectoptional
  • emailstring
  • usernamestring

Refuses

  • 400Invalid request
  • 401Unauthenticated — no credential, or an invalid one
  • 403The username is reserved or looks like a reserved name
  • 409User, email, or username already exists, or the username is held back

Receive

The same shape get_current_user returns — 4 fields. Go to it

Show it here
  • avatarobjectoptional
  • emailstring
  • user_iduuid
  • usernamestring
PUT/users/{user_id}user:update

Update your own user profile

update_userPUT /users/{user_id}Open in the API reference

Token scope

user:update

Send

Path
  • user_iduuidUser ID
Body
  • avatarobjectoptional
  • emailobjectoptional
  • usernameobjectoptional

Refuses

  • 400Invalid request
  • 401Unauthenticated — no credential, or an invalid one
  • 403Forbidden — not the target user, or the username is reserved
  • 404User not found
  • 409Email or username already taken, or the username is held back

Receive

The same shape get_current_user returns — 4 fields. Go to it

Show it here
  • avatarobjectoptional
  • emailstring
  • user_iduuid
  • usernamestring
PUT/users/{user_id}/avataruser:update

Get a URL to upload your own avatar to

upload_avatarPUT /users/{user_id}/avatarOpen in the API reference

Token scope

user:update

Counts against

avatar_bytes

Send

Path
  • user_iduuidUser ID
Body
  • content_lengthint64Exact byte size of the upload. Bound into the presigned PUT, so the upload must send exactly this many bytes; rejected up front if over the avatar cap.
  • content_typestring

Refuses

  • 400Invalid content type
  • 401Unauthenticated — no credential, or an invalid one
  • 403Forbidden — not the target user
  • 404User not found
  • 409The request conflicts with the resource's current state; `reason` says how
  • 501Avatar uploads are not available on this deployment

Receive

  • avatar_urlstring
  • upload_urlstring
DELETE/users/{user_id}/avataruser:update

Delete your own avatar

delete_avatarDELETE /users/{user_id}/avatarOpen in the API reference

Token scope

user:update

Send

Path
  • user_iduuidUser ID

Refuses

  • 400Bad request — a path parameter is not a well-formed value of its type
  • 401Unauthenticated — no credential, or an invalid one
  • 403Forbidden — not the target user
  • 404User not found
  • 409The request conflicts with the resource's current state; `reason` says how
  • 500Avatar upload not configured

Receive

No body.

GET/user/egress-usageuser:read

The caller's own outbound-byte usage for the current hour and day

get_my_egress_usageGET /user/egress-usageOpen in the API reference

Token scope

user:read

Send

Nothing — the address is the whole request.

Refuses

  • 401No authenticated caller
  • 403Forbidden — the caller's access level or token scope is insufficient

Receive

  • actor_keystringWhich budget this is: USER#{id} for a user, SA#{id} for a service account, PRT#{id} for a pipeline run. Lets a caller holding several credentials tell them apart.
  • dayobject3 fields
    • limit_bytesint64The limit for this window, in bytes — reported even where the limit is not enforced, so you can see what you would be held to.
    • used_bytesint64Bytes charged to this window so far.
    • windowstringThe period this covers: YYYY-MM-DDTHH for an hour, YYYY-MM-DD for a day.
  • hourobject3 fields
    • limit_bytesint64The limit for this window, in bytes — reported even where the limit is not enforced, so you can see what you would be held to.
    • used_bytesint64Bytes charged to this window so far.
    • windowstringThe period this covers: YYYY-MM-DDTHH for an hour, YYYY-MM-DD for a day.
DELETE/users/{user_id}user:delete

Delete your own user account

delete_userDELETE /users/{user_id}Open in the API reference

Token scope

user:delete

Send

Path
  • user_iduuidUser ID

Refuses

  • 400Bad request — a path parameter is not a well-formed value of its type
  • 401Unauthenticated — no credential, or an invalid one
  • 403Forbidden — not the target user
  • 404User not found
  • 409User is sole Owner of resources

Receive

No body.

Limits

An avatar may be at most 5 MiB (5 242 880 bytes) per upload, and it must be one of image/png, image/jpeg, image/gif or image/webp. The limit is flat: no plan raises it, because an avatar is one image per account rather than something a busy account accumulates more of.

The size is checked before anything is uploaded. You declare the exact byte count when you ask for the upload link; a count of zero or one over the limit is refused with 400 there and then, and no link is issued — so an oversized image costs you one small request rather than a failed transfer. The declared size is then bound into the link itself, so an upload that does not send exactly that many bytes is rejected by storage. Uploading again replaces the image in place; there is no cap on how often you do it and no history of previous ones.

Outbound data is metered per identity in two windows — an hourly burst allowance and a daily one — and an exhausted budget answers 429 TOO_MANY_REQUESTS on the transfer that would have crossed it, never on the profile calls on this page. Your own transfer view reports the free-plan allowance, which is a floor rather than the number that will be enforced: a transfer is gated against the plan of the namespace you are pulling from, so pulling from one on a paid plan gives you a higher ceiling than the view shows. The usage figures beside it are exact. The view also reports its limits as the enforced values even where enforcement is switched off, so it answers what a transfer would cost you rather than what is switched on today.

Troubleshooting

400 BAD_REQUESTmentioning user_id
Cause
A username or an email address was pasted where the id belongs
What to do
Resolve the person first with the by-username or by-email lookup, then use the id it returns
400 BAD_REQUESTon a username
Cause
A username may hold only lowercase letters, digits and hyphens, must be 1–100 characters, and may not start or end with a hyphen
What to do
Lowercase it and replace dots, underscores, spaces and + with hyphens — John.Doe becomes john-doe
400 BAD_REQUESTon an email address
Cause
The address has no @, an empty local or domain part, whitespace or a control character, or is over 254 characters
What to do
Send the complete address, exactly as it is written on the profile, and percent-encode it before it goes into the path
400 BAD_REQUESTon an avatar, mentioning the content type
Cause
The image is not PNG, JPEG, GIF or WebP — a .heic off a phone and a .svg are the two that catch people
What to do
Convert it. If your tool sent application/octet-stream, set the content type explicitly instead of letting it guess
400 BAD_REQUESTon an avatar, mentioning size
Cause
The declared byte count is zero or over the 5 MiB limit
What to do
Resize or recompress the image, then declare the new file's exact size. Read the size off the file rather than estimating it
400 BAD_REQUESTon an avatar, mentioning configuration
Cause
Avatar storage is unavailable on Gitmoap's side
What to do
Contact support@gitmoap.com; nothing you send will succeed until it is fixed
400 BAD_REQUESTnaming an unknown field
Cause
The body carried a field the endpoint does not accept — a typo, or a field copied from another API
What to do
Send only the fields the endpoint accepts. An unknown one is refused rather than ignored, so a misspelled username is a 400 and not a silent no-op
400 BAD_REQUESTnaming the caller, on register or list
Cause
A service-account or pipeline credential called an endpoint that only a person can call
What to do
Use your own credential. A service account has its own profile surface and cannot act as a person here
403 RESERVED_NAMESPACEon a username change or on register
Cause
The username is a word Gitmoap keeps, or a well-known organisation's name
What to do
Pick another. A username cannot be unlocked by owning a domain; an organisation's name can, by renaming an organisation — see Take your reserved name
403 NAME_RESEMBLES_RESERVEDon a username change or on register
Cause
The username looks like a well-known organisation's name — a digit for a letter, a hyphen inside it, or a word such as official or support added
What to do
Pick another username
401 UNAUTHORIZEDon a read that works signed out
Cause
A credential was sent and rejected — expired, malformed, or minted for somewhere else
What to do
Sign in again, or send no credential at all. An invalid token is refused even on the reads that accept anonymous callers, so a stale one is worse than none
401 UNAUTHORIZEDsaying no account is linked to the sign-in
Cause
Your session was issued before this way of signing in was joined to an account — after Gitmoap moved to a new sign-in service, for example
What to do
Sign out and sign in again. The sign-in joins it to the account holding your verified email address
401 UNAUTHORIZEDon the email lookup
Cause
The by-address lookup is the one profile read that requires a signed-in caller
What to do
Sign in, or send a token carrying user:read. The check runs before the address is even parsed, so a 401 here says nothing about whether the address exists
403 FORBIDDENon an edit, an avatar or a delete
Cause
You are acting on somebody else's account. Every write here is self-only, with no admin override
What to do
Check the id in the URL is yours. If you meant to change what somebody else may do, change their membership on the group or repository instead
403 FORBIDDENon listing a group's people
Cause
You are not a member of that group. A group's membership is not public even where its repositories are
What to do
Ask an Owner or Maintainer of the group to add you, or resolve the person you actually wanted by username or email address
403 INSUFFICIENT_SCOPE
Cause
The token is valid but was minted without the scope this call needs
What to do
Mint a new token carrying user:read, user:create, user:update or user:delete as appropriate. Scopes are chosen at mint time and cannot be added to an existing token
404 NOT_FOUNDon a username or email you are sure exists
Cause
The lookups are exact: a username differs by a hyphen, or the address is an alias rather than the one on the profile
What to do
Try the other lookup, or find the person through a group they belong to. An email lookup matches only the address on the profile, which is not necessarily the one they sign in with
404 NOT_FOUNDon a group when listing people
Cause
The group id is wrong, or the group was deleted
What to do
Look the group up by its path, then list with the id that returns
409 CONFLICTon register
Cause
A profile already exists for your identity
What to do
Read it instead of creating it. Signing in provisions the profile, so this is the expected answer and safe to treat as success
409 CONFLICTon a username or email change
Cause
Somebody else holds that username, or that email address is on another account
What to do
Pick another. The conflict is detected as the write happens, so nothing was half-applied and your existing name is untouched
409 NAME_RETIREDon a username change or on register
Cause
An organisation gave that name up recently, and it is held back — the message says until when, or that it is held for good
What to do
Pick another username
409 CONFLICTon delete, naming groups
Cause
You are the only Owner of the organisations it lists, and deleting you would leave them ownerless
What to do
Add a second Owner to each, or delete them, then delete again. The list in the response is the complete set, and your own personal group is on it until you hand it over
409 CONFLICTon delete, naming nothing you own
Cause
Your account is credited as the creator or author of work that is kept as a permanent record
What to do
Delete or transfer what you created where you can. Past that, contact support@gitmoap.com to retire the account — an identity that authored work is anonymised rather than removed
500 INTERNAL_ERRORon an avatar upload or removal
Cause
Avatar storage is unavailable on Gitmoap's side
What to do
Contact support@gitmoap.com. Retrying will not help, and the profile itself is unaffected
501 NOT_IMPLEMENTEDon an avatar upload
Cause
This Gitmoap deployment does not host avatars
What to do
Set avatar on your profile to the address of a picture you host elsewhere. The profile itself is unaffected
The upload link is refused by storage
Cause
The link expired after five minutes, or the file's size no longer matches the count you declared
What to do
Ask for a new link and send the file straight away. If the file changed, declare the new size
The new picture uploaded but the old one is still shown
Cause
Images are served through a cache, and your browser holds one too
What to do
Hard-refresh the page. It settles on its own shortly afterwards
Your picture vanished after an email change
Cause
The image is addressed by your email address, so changing the address leaves the old image unreferenced
What to do
Upload the image again against the new address
A profile link stopped working after a rename
Cause
The link spelled the old username. Ids never change; names do
What to do
Rebuild the link from the id, or look the person up by their new username. Store ids, not names, in anything you keep
Your personal group still has your old name after a rename
Cause
Renaming yourself does not rename the group created with your account
What to do
Rename the group yourself. The two names are independent once the account exists
You have no personal group
Cause
Your username became a reserved name after you took it, and no group can be created at a reserved name. You keep the username
What to do
Change your username to a free one; your next sign-in creates the group at the new name. If you already own an organisation, create your repositories there instead
Your transfer figures reset to zero
Cause
The hourly or daily window rolled over
What to do
Read the window each figure covers in the response — it names the hour or the day, so a reset is visible rather than a mystery
A clone or download fails with 429 while your profile calls still work
Cause
An outbound-data budget is exhausted, not an authorization problem
What to do
Check your transfer view for which window is full, wait for it to roll over, or have an Owner of the namespace you are pulling from raise its plan
  • Access tokensminting a token with user:read or user:update, and revoking it when a script is retired
  • Service accountsthe non-human identities that own their own profiles and budgets, for automation you do not want signing as you
  • Groupsyour personal namespace, nesting, membership and who may see what
  • Single sign-onconnecting an identity provider, and what happens to accounts that arrive through one
  • Repositoriesthe members list your name appears in, and the visibility rules that decide who can read your work
  • Billing and plansthe plans that raise the transfer allowance for a namespace
  • Getting set upthe checklist your account starts with the first time you sign in