Troubleshooting and support

Start with the HTTP status, the response body, and the endpoint you called. Retry only when the failure can reasonably be temporary.

Find your symptom#

I received HTML#

Check the URL first. /mt-backend/ opens the guide and /mt-backend/swagger/ opens the reference; API requests use /mt-backend/api/v1/ followed by an endpoint such as repositories. developer.2c8.com hosts documentation, not your organization's data. Replace example hosts with your server address. A proxy or login gateway can also return an HTML page; check the status, content type and any redirect before treating the body as JSON. Ask your administrator about network or VPN access if you cannot reach the server.

The list is empty#

An HTTP 200 with data: [] is a successful request with no results on that page. Clear filters, set startAt=0, and confirm the server and repository with your administrator. The selected repository may simply contain no models. If total is nonzero, check the offset and pagination. Do not assume that an empty list means the key is invalid.

There are no model names#

For the model list, use projection=SIMPLE and fields=titles. The compact projection alone contains uuid and modelType, not names. Expand data, then titles, then a language UUID, and read title. Names are not returned as a top-level name field on a model. If the requested language is missing, follow the catalogue walkthrough.

The example command does not run#

The commands use Bash, including Git Bash or WSL on Windows. They are not PowerShell or Command Prompt syntax. Keep the trailing \ at each continued line with no spaces after it, and replace the server address and ID placeholders. “curl: command not found” means cURL is not available in that shell. “unknown option --fail-with-body” means its cURL version is too old for these examples; update cURL or use the guided Swagger route.

Typing the API key at the Bash prompt intentionally displays no characters. If a request returns 401, confirm the variable was set in the same shell and that the key belongs to this server. Avoid verbose/debug command output when sharing a problem, because it can expose headers.

Swagger has no Execute button#

The public reference cannot execute requests. Open Swagger on your own server, expand the operation and choose Try it out. Its Server response appears after executing; Example Value is sample documentation. See the quickstart.

Diagnose a failed request#

Status Next action
400 Bad Request Check parameter names, identifiers, required fields, and JSON types against the endpoint schema.
401 Unauthorized Check the server address and x-api-key; ask the administrator to verify that the key is active and unexpired.
403 Forbidden Check whether the endpoint requires administrator authentication or has other access constraints.
404 Not Found Check the route, repository ID, resource ID, and whether the resource still exists.
409 Conflict Inspect the message and reload the relevant state. Resolve the conflict before submitting a write again.
429 Too Many Requests Wait for Retry-After and reduce request concurrency.
500 Internal Server Error Save diagnostic details and contact support. Retry reads with bounded backoff if appropriate.

Do not blindly repeat create/update/delete requests after a timeout or server error: the operation may already have taken effect. Verify the resulting state first.

Read an error response#

Common API errors return a message and timestamp:

JSON
{
  "message": "Authentication required to access this resource.",
  "timestamp": "2026-09-10T10:00:00Z"
}

The HTTP status is carried by the response itself. This example is illustrative; validation errors and rate-limit errors can use other bodies. A reverse proxy can also return HTML or an empty response, so do not assume every failed request contains this JSON shape.

Rate limits#

Rate limiting is configurable per installation and tracked per authenticated identity. API keys can be configured to use rate limiting; not every key or request receives rate-limit headers. The limiter skips OPTIONS requests, requests without a principal, and keys configured without rate limiting. A named anonymous principal, such as the one used for public access to /versions, is still subject to the limiter.

When provided, these headers describe the current limit:

Header Meaning
X-RateLimit-Limit Maximum requests in the configured period
X-RateLimit-Remaining Requests remaining in that period
X-RateLimit-Reset Reported reset time as Unix epoch seconds, not a duration
Retry-After On a 429 response, seconds to wait before retrying

Example rate-limit response body:

JSON
{
  "error": "Rate limit exceeded",
  "message": "Maximum 60 requests",
  "retryAfterSeconds": 12
}

The numbers above are examples, not a published quota. The backend's Retry-After header and retryAfterSeconds body field carry the same non-negative wait in seconds. Ask the administrator about the limit configured for your installation. Quota headers can also appear on successful responses and on other failures if the limiter ran; they are not guaranteed on errors rejected before it runs.

Retry a throttled read#

  1. Wait at least the returned Retry-After duration and add a small random delay (jitter) so workers do not all retry together. Reduce request concurrency.
  2. Set both an attempt limit and an elapsed-time budget. For example, allow at most three retries within 60 seconds; this is a suggested client policy, not a server setting.
  3. If the next wait would exceed your budget, stop and report the throttling response. Avoid an immediate retry loop when the wait is zero. A retry can still receive 429.

Check a write before repeating it#

A confirmed 429 from this backend filter rejects the request before the resource operation runs. A write can be retried after that rejection using the returned wait and a bounded retry budget, provided no earlier attempt has an uncertain outcome.

After a timeout, lost connection or server error, a create/update/delete operation may already have taken effect. Read back the resulting state and reconcile it before resubmitting. Receiving 429 on a later attempt does not tell you whether an earlier attempt succeeded. Responses from a proxy may have different bodies and behavior.

Versions and compatibility#

The API path contains v1. The backend release is a separate version, displayed in this guide's navigation/footer. A SNAPSHOT suffix identifies a development build, not a final release. A static export also shows when the documentation was exported; that timestamp is not the API version or release date.

To identify a deployed installation:

Bash / cURL
curl --fail-with-body --silent --show-error \
  --header "x-api-key: $API_KEY" \
  "$API_BASE_URL/versions"

The response includes mtBackendVersion and dbVersion. When using a publicly hosted documentation snapshot, check its server-release label against your installation. Its Swagger and downloads do not necessarily describe an older server.

Use documented fields and operations, tolerate additional response fields, and validate your integration when upgrading. This guide does not establish a compatibility or deprecation policy.

Contact support#

Contact support@2c8.com. Include:

  • The server release and approximate time of the failure, including time zone.
  • The HTTP method, endpoint path, status, and error message.
  • A minimal request example with API keys, authentication headers, and sensitive content removed.
  • The expected result and whether the problem occurs consistently.

If you host the server, check its logs for the same time period.

Glossary#

Term Meaning
API key Application credential sent in x-api-key
Accessor User or group with repository access
Breakdown Link to a more detailed model
Canvas Visual structure of a model
Description type API term for a configured field. Fields can have different types; rich-text field values are generally called descriptions
Document key Provider-specific document identifier
Document source Provider of document references and metadata
Edge Connection between canvas vertices that implicitly defines a relation and carries visual information
Model Diagram or visualization in a repository
OpenAPI Machine-readable description of API operations and schemas
Projection Named selection of response fields
Provider property Key/value data addressed by a provider identifier and property key; distinct from a configured field
Relation In a canvas, a connection between modeled objects, implicitly defined by an edge rather than a separate entity. Custom relations and plugin relations are distinct API concepts
Repository Container for modeling data and configuration
Swagger UI Browser interface for the OpenAPI description
Symbol Underlying modeled object
Vertex Placed canvas item that always references a symbol