# Zome Call Serialization API
> This document can be utilized as a reference for either writing a "conductor library" for a new coding language, or alternatively simply taking a do-it-yourself approach to making API requests to the Holochain conductor
In order to make a Zome call, there are three layers of serialization via msgpack you should perform. This corresponds to three layers of deserialization you should perform. The following is the serialization half. At a quick glance, you have the 3 layers as:
1. The data + metadata of the entire request, serialized (serialize defined in holochain conductor)
2. The specific request content, serialized (serialize defined in holochain conductor)
3. The application specific payload data for the API call, serialized (serialize defined in hApp/zome code)
The levels of serialization are layered in this way in order to improve error handling at distinctive levels.
A Websocket request must be sent as a *msgpack-serialized* message. The serialized message should be a serialized `WireMessage::Request` data structure.
A `WireMessage::Request` should look like this
id: unsigned 64 bit integer,
`id: unsigned 64 bit integer` should be a number which will be unique to this request, distinct from other requests made by the client. An id in a response object asynchronously sent will match/correspond to this.
`data: Buffer` should be a msgpack-serialized `AppRequest::ZomeCall`
An `AppRequest::ZomeCall` should look like this:
cell_id: [Buffer, Buffer],
cap: null | Buffer,
`payload: Buffer` should be whatever your Zome function expects as an input, *msgpack-serialized*. This is up to the application developer to define.
> All the other properties that contain Buffers should be treated as values as opposed to serialized data.
**Where can I view WireMessage::Request?**
an enum variant serialized with #[serde(tag = "type")]
**Where can I view AppRequest::ZomeCall and why is “zome_call” lower case, while “Request” is upper case?**
because of inconsistent Rust serialization settings on the Holochain side (rename_all = “snake_case” vs its absence): #[serde(rename_all = "snake_case", tag = "type", content = "data")]