Service status

Add MCP server to your AI tool

Allow AI tools and LLMs to interact with the API documentation portal through MCP.

MCP server URL

https://api-reference.usecommune.dev/mcp

Standard setup for AI tools providing an mcp.json file

mcp.json
{
  "REST API MCP server": {
    "url": "https://api-reference.usecommune.dev/mcp"
  }
}

Close
GET /status

Whether the API is serving, what it depends on to serve, and which contract version it is currently on. Reaching this operation at all proves the process is up and routing; status and dependencies say whether it is up in a useful sense.

Every check is shallow. It proves that a dependency answers, not that it answers correctly, so read a down as a reason to stop retrying and never an up as a guarantee that a write elsewhere will land.

The answer is deliberately coarse. Because this operation is unauthenticated, it reports capability names and states and nothing else: no vendor, no free text, and no distinction between a dependency that failed its probe and one this deployment cannot reach at all.

Unauthenticated, and the one operation that ignores Commune-Version, since it describes the service rather than a resource. Because it takes no credential there is no key to count against, so the per-key budgets described under Rate limits do not apply to it and it carries no RateLimit-* headers. It can still be refused by whatever sits in front of this service, which is why the 429 stays declared.

Responses

  • 200 application/json

    The service is serving traffic. Read status before trusting it to serve every operation: a 200 here reports a degradation rather than hiding it.

    Hide response attributes Show response attributes object
    • object string Required

      Always service_status.

      Value is service_status.

    • status string Required

      The whole service in one word, driven by the required dependencies alone. ok when every required dependency is up, degraded when one answered slowly or partially, and down when one is unreachable. A degraded service still answers 200 here, because the point of this operation is to say so.

      An optional dependency being down does not move this. Every operation in the current contract is a read served out of the database, so none of them depends on one. Read dependencies for the individual states.

      Values are ok, degraded, or down.

    • version string(date) Required

      The newest contract version this service serves, as a release date. A request that sends no Commune-Version header is not necessarily on it: an existing key stays pinned to the version that was current when it was issued. Compare the two to find out whether an integration has a newer contract available to move to.

    • dependencies array[object] Required

      Every dependency the API checks, whatever its state. The set is fixed by this contract rather than by the deployment, so the list is the same length on every response from every environment. Order is not meaningful; match on name.

      Hide dependencies attributes Show dependencies attributes object

      One capability the API depends on, and how it answered. required is the field that matters when deciding what to do about a failure: a required dependency being down means no operation can be served, while an optional one being down costs only the operations that touch it.

      A dependency is named by the capability it provides, never by the vendor providing it, and carries no free text. getStatus is unauthenticated, so its body is held to answering whether the API can serve. Anything finer, including why a dependency is down, is an operator concern and is not published here.

      • name string Required

        Which capability this is. Stable across versions, so it is safe to branch on: the name says what the dependency does, not who provides it, so changing a provider does not change the name.

        Values are database, email_service, payments, or edge.

      • state string Required

        How a single dependency answered its last check. up is a successful answer, degraded is an answer that arrived but was slow or partial, and down is no usable answer at all.

        down covers every way a dependency can be unavailable to this deployment and does not distinguish between them. Read it as "not usable right now", never as a statement about why.

        Values are up, degraded, or down.

      • required boolean Required

        Whether the API can serve at all without it. The database is required. email_service, payments and edge are not: they back sending, billing and domain provisioning, none of which the current read-only operations touch, so losing one narrows the surface rather than closing it.

      • checked_at string(date-time) Required

        When this dependency was last checked. Checks are cached for a few seconds, so this is usually a little behind the request. Always present, whatever the state.

  • 429 application/json

    Too many requests. Back off and retry after the interval named by the Retry-After response header.

    Hide headers attribute Show headers attribute
    • Retry-After integer

      Seconds to wait before retrying.

      Minimum value is 1.

    Hide response attribute Show response attribute object
    • error object Required

      Additional properties are NOT allowed.

      Hide error attributes Show error attributes object
      • code string Required

        The stable, machine readable reason a request failed. New codes may be added in a minor version, so treat an unrecognised code as a generic failure of its HTTP status class.

        Values are bad_request, invalid_version, unauthorized, forbidden, insufficient_scope, payment_required, not_found, conflict, unprocessable, rate_limited, or internal_error.

      • message string Required

        A human readable sentence describing what went wrong. Written for a developer reading a log, not for an end user. Do not branch on it, branch on code.

      • param string

        The query, path or body parameter the error is attributed to, when the error is attributable to exactly one. Absent otherwise.

      • allowed_values array[string]

        Everything param would have accepted, when what it accepts is a finite set. Absent when it is not: a cursor, an identifier or a numeric range has nothing to enumerate, and an empty array would read as "nothing is allowed".

        It is deliberately redundant with message, which names the same values in prose. The array is what a program branches on and the sentence is what a model reads, and a caller correcting a request has to be able to do it from this one response without opening a reference page.

        On an unknown parameter name rather than an unknown value, this carries the parameter names the operation does accept, since that is the set the caller has to pick from.

        On an insufficient_scope failure there is no parameter at fault and param is absent, and this carries the scopes that would have been accepted instead.

      • request_id string

        Identifier for this request, echoed in the Commune-Request-Id response header. Quote it in support requests.

      • docs_url string(uri)

        Link to the reference page for this error code.

  • 500 application/json

    Something failed inside Commune. The request may be retried.

    Hide response attribute Show response attribute object
    • error object Required

      Additional properties are NOT allowed.

      Hide error attributes Show error attributes object
      • code string Required

        The stable, machine readable reason a request failed. New codes may be added in a minor version, so treat an unrecognised code as a generic failure of its HTTP status class.

        Values are bad_request, invalid_version, unauthorized, forbidden, insufficient_scope, payment_required, not_found, conflict, unprocessable, rate_limited, or internal_error.

      • message string Required

        A human readable sentence describing what went wrong. Written for a developer reading a log, not for an end user. Do not branch on it, branch on code.

      • param string

        The query, path or body parameter the error is attributed to, when the error is attributable to exactly one. Absent otherwise.

      • allowed_values array[string]

        Everything param would have accepted, when what it accepts is a finite set. Absent when it is not: a cursor, an identifier or a numeric range has nothing to enumerate, and an empty array would read as "nothing is allowed".

        It is deliberately redundant with message, which names the same values in prose. The array is what a program branches on and the sentence is what a model reads, and a caller correcting a request has to be able to do it from this one response without opening a reference page.

        On an unknown parameter name rather than an unknown value, this carries the parameter names the operation does accept, since that is the set the caller has to pick from.

        On an insufficient_scope failure there is no parameter at fault and param is absent, and this carries the scopes that would have been accepted instead.

      • request_id string

        Identifier for this request, echoed in the Commune-Request-Id response header. Quote it in support requests.

      • docs_url string(uri)

        Link to the reference page for this error code.

GET /status
curl https://api.usecommune.com/status
curl \
 --request GET 'https://api.usecommune.com/status'
Response examples (200)
{
  "object": "service_status",
  "status": "ok",
  "version": "2026-08-26",
  "dependencies": [
    {
      "name": "database",
      "state": "up",
      "required": true,
      "checked_at": "2026-05-04T09:42:00Z"
    }
  ]
}
Response examples (429)
# Headers
Retry-After: 42

# Payload
{
  "error": {
    "code": "bad_request",
    "message": "Newsletter not found.",
    "param": "cursor",
    "allowed_values": [
      "subscribed",
      "unsubscribed",
      "bounced",
      "complained",
      "pending"
    ],
    "request_id": "req_01j9c8h1q7m3n4p5r6s7t8u9v0",
    "docs_url": "https://usecommune.com/docs/api/errors#not_found"
  }
}
Response examples (500)
{
  "error": {
    "code": "bad_request",
    "message": "Newsletter not found.",
    "param": "cursor",
    "allowed_values": [
      "subscribed",
      "unsubscribed",
      "bounced",
      "complained",
      "pending"
    ],
    "request_id": "req_01j9c8h1q7m3n4p5r6s7t8u9v0",
    "docs_url": "https://usecommune.com/docs/api/errors#not_found"
  }
}