Monochrome API Ship Checklist
(Backend)


What happens before we add an endpoint to our collection

Before an endpoint ships, the developer should be able to show that the response format is consistent, easy to decode, and does not include extra noise. The first test is that the endpoint returns the same top-level shape every time. A successful response must always return success: true, a friendly message, and a data payload that matches the endpoint’s purpose. An error response must always return success: false, a friendly message, and an error object with a stable code. The response should never mix success data and error data in the same call, and it should never require the mobile app to guess what happened based on missing keys.


Naming must be consistent and predictable across the entire JSON body. Every field must be camelCase with no exceptions, including nested objects and arrays. The endpoint must not leak database naming like _id, and must expose id instead. Timestamps must be ISO strings and consistently named as createdAt, updatedAt, startsAt, endsAt, or expiresAt depending on purpose. Any location fields must use latitude and longitude. Booleans must read clearly as is…, has…, can…, or should…, and must never be returned as 0/1 or "true"/"false" strings.

The developer should be able to point to the naming dictionary and show the endpoint follows it. The response must avoid redundancy. If the endpoint is clearly scoped, the payload must not repeat context in every item. For example, “get user addresses” should not repeat userId inside each address item unless the endpoint supports multiple users in a single response. If a field is not used by the client or not needed for decision-making, it should not be included “just because it exists in the database.” A shipping endpoint should contain only the fields that a client can actually use right now, or fields that are clearly required for backward compatibility.


Nulls and defaults must be handled intentionally. Fields should not appear as null unless the client is expected to handle that field as optional and the null has meaning. Arrays should never be null; they must be an empty array when there are no items. Numeric fields should not default to 0 unless the true value is genuinely zero; unknown values should be omitted or returned as null depending on what the client needs. The endpoint must be safe even when the database has missing fields, and it must never throw or crash because a nested property is absent.


Error handling must be stable and useful. Every error response must include an error.code that is short, consistent, and machine-friendly, and that does not change over time. The message can be friendly and human, but clients must be able to rely on error.code for logic. If validation fails, the endpoint must return a clear list of field problems so the app can highlight the exact inputs that need fixing. The endpoint must not return raw database or stack trace errors to the client.

The endpoint must behave consistently under edge cases. It must return the correct structure when the dataset is empty, when the user is new, when optional settings are not configured, and when the request is missing non-required fields. It must be clear whether the endpoint is returning a single object or an array, and it must not change the shape depending on data availability. If pagination exists, pagination must live in a meta object and include enough information to request the next page without guesswork. If pagination does not exist, meta should not exist.


Every response must be easy to decode in Swift and Kotlin without custom hacks. A developer should be able to show a sample response and confirm there are no mixed naming conventions, no inconsistent data types, and no keys that sometimes change type between calls. Numbers should remain numbers. Booleans should remain booleans. Strings should remain strings. If an enum-like field exists, its values must be stable and documented.

The final pass is a “read aloud” test. If a developer reads the key names aloud and they sound like normal English, the endpoint is likely named correctly. If the keys feel like database fields, abbreviations, or internal jargon, they must be renamed before shipping. The endpoint should feel clean, friendly, and obvious.


#MoveWithMonochrome


Contact us via email

We're here to help! If you have any questions, need assistance, or want to share feedback, feel free to reach out to us via email or chat support. Our team is available and ready to assist you with anything you need. Simply drop us a message, and we’ll get back to you promptly!

info@monochromeapp.com

Chat with us here

Goran Babarogic Product UX Designer

#MoveWithMonochrome