Skip to content
GitmoapAPIBeta
Identity & platformcontact
POST/contact

Send a message to a person at Gitmoap

submit_contact_message
  • Public
    This operation declares no security requirement: it takes no token.
  • Quota · contact messages per source hour

    x-gitmoap-quota: {"kind":"enforced","arg":"contact_messages_per_source_hour"}

Choose what it is about — support, privacy, a legal notice, a report of illegal content or a security vulnerability — and a person at that desk replies by email to the address you give. Nothing is sent to that address before the reply: the response, and the reference it carries, is the acknowledgement. No sign-in is needed. Each network address may send five messages in an hour; past that, or when the platform has received as many as it takes in a day, the answer says how long to wait, and the addresses in the Entity Details still reach the same desks.

Request body

application/json
  • emailContactReplyAddress (string)Where the reply goes. Nothing is sent to it until a person replies.
  • messageContactMessageBody (string)What you want to say.
  • topicContactTopicsupportprivacylegalabusesecurityWhat the message is about, which chooses the desk a person answers it from.
  • nameContactName (string) or nulloptionalThe name to address the reply to, when you want to give one.
  • websitestring or nulloptionalLeave empty. A form a person fills in never sets it.
Request body exampleSynthesized example
{
"email": "mara@acme.example",
"message": "Stream pipeline status into the run header",
"topic": "support"
}

Responses

202Received: a person will reply to the address givenapplication/json
  • message_idContactMessageId (string · uuid)The reference to quote if you write again about the same thing.
  • received_atstringWhen the message arrived.
202 exampleSynthesized example
{
"message_id": "84a2c17f-59fa-40ee-8f43-33c244b8c166",
"received_at": "2026-10-14T03:12:56Z"
}
400A field is not validapplication/json
Error codes
  • BAD_REQUESTThe request is malformed: a parameter or a body field is not a well-formed value of its type
  • errorErrorBody
    • The ErrorBody schema
    • codestringThe coarse category, tied to the status: NOT_FOUND, CONFLICT, INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all.
    • messagestringWhat went wrong, for a person. Written to be read, not parsed: match on reason or code.
    • fieldstring or nulloptionalOn a 400 that refused one field's value, the field, as its JSON path: email, items[0].name. Put the message under that input. Absent on every other error.
    • reasonstring or nulloptionalThe specific code, when the error has one: LAST_ORGANIZATION_OWNER, BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and on code otherwise.
    • required_scopestring or nulloptionalThe scope the access token was missing, on INSUFFICIENT_SCOPE.
    • violationsanyoptionalPresent on the structured-validation errors (PROVIDER_VALIDATION_FAILED per-node, PIPELINE_VALIDATION_FAILED DAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
400 exampleSynthesized example
{
"error": {
"code": "code-e586",
"message": "Stream pipeline status into the run header"
}
}
413The request body is too largeapplication/json
Error codes
  • errorErrorBody
    • The ErrorBody schema
    • codestringThe coarse category, tied to the status: NOT_FOUND, CONFLICT, INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all.
    • messagestringWhat went wrong, for a person. Written to be read, not parsed: match on reason or code.
    • fieldstring or nulloptionalOn a 400 that refused one field's value, the field, as its JSON path: email, items[0].name. Put the message under that input. Absent on every other error.
    • reasonstring or nulloptionalThe specific code, when the error has one: LAST_ORGANIZATION_OWNER, BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and on code otherwise.
    • required_scopestring or nulloptionalThe scope the access token was missing, on INSUFFICIENT_SCOPE.
    • violationsanyoptionalPresent on the structured-validation errors (PROVIDER_VALIDATION_FAILED per-node, PIPELINE_VALIDATION_FAILED DAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
413 exampleSynthesized example
{
"error": {
"code": "code-8504",
"message": "Stream pipeline status into the run header"
}
}
429Several messages were sent recently; try again laterapplication/json
Error codes
  • TOO_MANY_REQUESTSRetryableA quota, a rate limit or a transfer budget is spent. When the response carries Retry-After, retry after that many seconds
  • errorErrorBody
    • The ErrorBody schema
    • codestringThe coarse category, tied to the status: NOT_FOUND, CONFLICT, INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all.
    • messagestringWhat went wrong, for a person. Written to be read, not parsed: match on reason or code.
    • fieldstring or nulloptionalOn a 400 that refused one field's value, the field, as its JSON path: email, items[0].name. Put the message under that input. Absent on every other error.
    • reasonstring or nulloptionalThe specific code, when the error has one: LAST_ORGANIZATION_OWNER, BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and on code otherwise.
    • required_scopestring or nulloptionalThe scope the access token was missing, on INSUFFICIENT_SCOPE.
    • violationsanyoptionalPresent on the structured-validation errors (PROVIDER_VALIDATION_FAILED per-node, PIPELINE_VALIDATION_FAILED DAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
429 exampleSynthesized example
{
"error": {
"code": "code-7ef5",
"message": "Pin a page's payload to the build that rendered it"
}
}
501The contact form is not available on this deploymentapplication/json
Error codes
  • NOT_IMPLEMENTEDThis deployment has not configured the feature the operation needs; the message names it
  • errorErrorBody
    • The ErrorBody schema
    • codestringThe coarse category, tied to the status: NOT_FOUND, CONFLICT, INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all.
    • messagestringWhat went wrong, for a person. Written to be read, not parsed: match on reason or code.
    • fieldstring or nulloptionalOn a 400 that refused one field's value, the field, as its JSON path: email, items[0].name. Put the message under that input. Absent on every other error.
    • reasonstring or nulloptionalThe specific code, when the error has one: LAST_ORGANIZATION_OWNER, BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and on code otherwise.
    • required_scopestring or nulloptionalThe scope the access token was missing, on INSUFFICIENT_SCOPE.
    • violationsanyoptionalPresent on the structured-validation errors (PROVIDER_VALIDATION_FAILED per-node, PIPELINE_VALIDATION_FAILED DAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
501 exampleSynthesized example
{
"error": {
"code": "code-bdc9",
"message": "Draw the region map from operation density"
}
}

CLI

gitmoap contact submit-contact-message

  • --emailstringWhere the reply goes. Nothing is sent to it until a person replies.
  • --messagestringWhat you want to say.
  • --namestringoptional
  • --topicsupport | privacy | legal | abuse | securityWhat the message is about, which chooses the desk a person answers it from.
  • --websitestringoptionalLeave empty. A form a person fills in never sets it.