Transaction Protection for Institutions

Transaction screening and monitoring for protected wallets

CoinCover protects your wallets and workspaces by actively monitoring and validating outgoing transaction events.

During various transaction stages, we’ll promptly notify you that a transaction is protected by CoinCover or of any potential threats and suspicious activity, ensuring robust protection at all times.

Integration methods

  1. Screening and monitoring API: Use our API to directly send transaction details and receive responses within milliseconds. This allows for real-time monitoring and immediate feedback on each transaction’s protected status.

  2. Partner connections guide: Implement event-based monitoring by configuring webhooks with your preferred wallet service provider. Our guides include specific setup instructions for:

    • Bitgo

    • Fireblocks

    • ForDeFi


Getting started

In order to integrate CoinCover’s Transaction Protection for Institutions, follow these steps:

  • Set up authentication tokens

  • Register users

  • Integrate transaction check

  • Configure partner connections

Set up Authentication Tokens

To use CoinCover’s services, a bearer token is required. These are unique for TEST and PROD environments. A TEST token can be requested from our Sales team and a PROD token is supplied once contractual agreements have been made and the test configuration has been validated by our Sales Engineering team.

Endpoints

TEST

PRODUCTION

Register users

CoinCover requires users existing within a partner’s systems to be registered with essential user details.

The partner acknowledges the contractual declarations that any user details provided have been verified via suitable KYC practices and that 2FA is active on an account.

Integrate transaction checker

CoinCover needs to analyse transactions before they are sent to the blockchain.

For each transaction analysed, CoinCover will provide a response indicating whether the transaction is protected by CoinCover or not.

'Not protected' responses will contain the relevant reason code and description.

Integrate Transaction Checker

Configure partner connections

CoinCover requires relevant partner platforms to be configured with read-only access to completed transactions.

This is required to train machine learning models, monitor wallet activity to detect suspicious patterns and reconcile any real-time transaction protection decisions with the completed transactions.

Follow the steps listed for the relevant platforms under the Partner Connections section.


User Management

Overview

This section contains APIs that are used to create and manage user registrations.


POST Create new user

{{HOST}}/user

Create new user is used to create a new User Registration for an existing User within a partner’s systems. The User Id that is associated with user in the partner’s systems should be specified in the request body along with the relevant user details as stated in the Field Information table.

Field Information

Field Description Mandatory

userId

User Id of the partner’s end-user relevant to the partners systems.

Yes

firstName

First name.

Yes

lastName

Last name.

Yes

dob

Date of Birth.

No

residenceCountry

Country of residence of end-user https://www.iso.org/obp/ui/#search for supported format.

Yes

nationality

Nationality of end-user https://www.iso.org/obp/ui/#search for supported format.

No

Response Codes

Code Description

201

Created successfully.

400

Missing mandatory field value or validation issues.

401

Missing or invalid bearer token.

HEADERS


Content-Type application/json

Authorization Bearer ${API_TOKEN}

Body raw (json)


{
    "userId": "jb001",
    "firstName": "Joe",
    "lastName": "Blogs",
    "dob": "1975-05-01",
    "residenceCountry": "US",
    "nationality": "US"
}

Example Request

cURL - cURL
curl --location 'https://api.txm.coincover.com/user' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ${API_TOKEN}' \
--data '{
    "userId": "jb001",
    "firstName": "Joe",
    "lastName": "Blogs",
    "dob": "1975-05-01",
    "residenceCountry": "US",
    "nationality": "US"
}'
C# - HttpClient
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.txm.coincover.com/user");
request.Headers.Add("Authorization", "Bearer ${API_TOKEN}");
var content = new StringContent("{\n    \"userId\": \"jb001\",\n    \"firstName\": \"Joe\",\n    \"lastName\": \"Blogs\",\n    \"dob\": \"1975-05-01\",\n    \"residenceCountry\": \"US\",\n    \"nationality\": \"US\"\n}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
Go - Native
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "https://api.txm.coincover.com/user"
  method := "POST"

  payload := strings.NewReader(`{
    "userId": "jb001",
    "firstName": "Joe",
    "lastName": "Blogs",
    "dob": "1975-05-01",
    "residenceCountry": "US",
    "nationality": "US"
  }`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer ${API_TOKEN}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
JavaScript - Fetch
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Authorization", "Bearer ${API_TOKEN}");

var raw = JSON.stringify({
  "userId": "jb001",
  "firstName": "Joe",
  "lastName": "Blogs",
  "dob": "1975-05-01",
  "residenceCountry": "US",
  "nationality": "US"
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://api.txm.coincover.com/user", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Example Response

            No response body
This request doesn't return any response body

PATCH Update Existing User

/user/${userId}

Field Information

Field Description Mandatory

firstName

First name.

No

lastName

Last name.

No

residenceCountry

Country of residence of end-user https://www.iso.org/obp/ui/#search for supported format.

No

dob

Date of Birth.

No

Response Codes

Code Description

204

Successfully updated.

400

Missing mandatory field value or validation issues.

401

Missing or invalid bearer token.

404

User with the specified id does not exist.

HEADERS


Content-Type application/json

Authorization Bearer ${API_TOKEN}

Body raw


{
    "firstName": "Joe",
    "lastName": "Blogs",
    "residenceCountry": "US"
}

Example Request

cURL - cURL
curl --location --request PATCH 'https://api.txm.coincover.com/user/jb001' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ${API_TOKEN}' \
--data '{
    "firstName": "Joe",
    "lastName": "Blogs",
    "residenceCountry": "US"
}'
C# - HttpClient
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Patch, "https://api.txm.coincover.com/user/jb001");
request.Headers.Add("Authorization", "Bearer ${API_TOKEN}");
var content = new StringContent("{\n    \"firstName\": \"Joe\",\n    \"lastName\": \"Blogs\",\n    \"residenceCountry\": \"US\"\n}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
Go - Native
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "https://api.txm.coincover.com/user/jb001"
  method := "PATCH"

  payload := strings.NewReader(`{
    "firstName": "Joe",
    "lastName": "Blogs",
    "residenceCountry": "US"
  }`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer ${API_TOKEN}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
JavaScript - Fetch
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Authorization", "Bearer ${API_TOKEN}");

var raw = JSON.stringify({
  "firstName": "Joe",
  "lastName": "Blogs",
  "residenceCountry": "US"
});

var requestOptions = {
  method: 'PATCH',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://api.txm.coincover.com/user/jb001", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Example Response

            No response body
This request doesn't return any response body

Business management

Overview

This section contains APIs that are used to create and manage user registrations.


POST Create new business user

/business

Create new user is used to create a new User Registration for an existing User within a partner’s systems. The User Id that is associated with user in the partner’s systems should be specified in the request body along with the relevant user details as stated in the Field Information table.

Field Information

Field Description Mandatory

businessId

User Id of the partner’s business user relevant to the partners systems.

Yes

name

Name of the business.

Yes

address

Address.

Yes

registrationNumber

Registration Number.

No

contactPersonName

Name of the contact person for the business.

Yes

contactPersonEmail

Email of the contact person for the business.

Yes

contactPersonPhone

Phone number of the contact person for the business.

No

Response Codes

Code Description

201

Created successfully.

400

Missing mandatory field value or validation issues.

401

Missing or invalid bearer token.

HEADERS


Content-Type application/json

Authorization Bearer ${API_TOKEN}

Body raw (json)


{
    "businessId": "jb001",
    "name": "Company Name",
    "address": "13 Gerrard St",
    "registrationNumber": "12345-6789",
    "contactPersonName": "Joe Blogs",
    "contactPersonEmail": "joe@company.com",
    "contactPersonPhone": "+447822000000"
}

Example Request

cURL - cURL
curl --location 'https://api.txm.coincover.com/business' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ${API_TOKEN}' \
--data-raw '{
    "businessId": "jb001",
    "name": "Company Name",
    "address": "13 Gerrard St",
    "registrationNumber": "12345-6789",
    "contactPersonName": "Joe Blogs",
    "contactPersonEmail": "joe@company.com",
    "contactPersonPhone": "+447822000000"
}'
C# - HttpClient
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.txm.coincover.com/business");
request.Headers.Add("Authorization", "Bearer ${API_TOKEN}");
var content = new StringContent("{\n    \"businessId\": \"jb001\",\n    \"name\": \"Company Name\",\n    \"address\": \"13 Gerrard St\",\n    \"registrationNumber\": \"12345-6789\",\n    \"contactPersonName\": \"Joe Blogs\",\n    \"contactPersonEmail\": \"joe@company.com\",\n    \"contactPersonPhone\": \"+447822000000\"\n}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
Go - Native
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "https://api.txm.coincover.com/business"
  method := "POST"

  payload := strings.NewReader(`{
    "businessId": "jb001",
    "name": "Company Name",
    "address": "13 Gerrard St",
    "registrationNumber": "12345-6789",
    "contactPersonName": "Joe Blogs",
    "contactPersonEmail": "joe@company.com",
    "contactPersonPhone": "+447822000000"
  }`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer ${API_TOKEN}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
JavaScript - Fetch
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Authorization", "Bearer ${API_TOKEN}");

var raw = JSON.stringify({
  "businessId": "jb001",
  "name": "Company Name",
  "address": "13 Gerrard St",
  "registrationNumber": "12345-6789",
  "contactPersonName": "Joe Blogs",
  "contactPersonEmail": "joe@company.com",
  "contactPersonPhone": "+447822000000"
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://api.txm.coincover.com/business", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Example Response

            No response body
This request doesn't return any response body

PATCH Update existing business user

/business/${businessId}

Field Information

Field Description Mandatory

name

Name of the business.

No

address

Address.

No

registrationNumber

Registration Number.

No

contactPersonName

Name of the contact person for the business.

No

contactPersonEmail

Email of the contact person for the business.

No

contactPersonPhone

Phone number of the contact person for the business.

No

Response Codes

Code Description

204

Successfully updated.

400

Missing mandatory field value or validation issues.

401

Missing or invalid bearer token.

404

User with the specified id does not exist.

HEADERS


Content-Type application/json

Authorization Bearer ${API_TOKEN}

Body raw


{
    "name": "Company Name",
    "address": "72 Horseferry Rd",
    "registrationNumber": "12345-6789",
    "contactPersonName": "Joe Blogs",
    "contactPersonEmail": "joe@company.com",
    "contactPersonPhone": "+447822000000"
}

Example Request

cURL - cURL
curl --location -g --request PATCH 'https://api.txm.coincover.com/business/${businessId}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ${API_TOKEN}' \
--data-raw '{
    "name": "Company Name",
    "address": "72 Horseferry Rd",
    "registrationNumber": "12345-6789",
    "contactPersonName": "Joe Blogs",
    "contactPersonEmail": "joe@company.com",
    "contactPersonPhone": "+447822000000"
}'
C# - HttpClient
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Patch, "https://api.txm.coincover.com/business/${businessId}");
request.Headers.Add("Authorization", "Bearer ${API_TOKEN}");
var content = new StringContent("{\n    \"name\": \"Company Name\",\n    \"address\": \"72 Horseferry Rd\",\n    \"registrationNumber\": \"12345-6789\",\n    \"contactPersonName\": \"Joe Blogs\",\n    \"contactPersonEmail\": \"joe@company.com\",\n    \"contactPersonPhone\": \"+447822000000\"\n}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
Go - Native
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "https://api.txm.coincover.com/business/$%7BbusinessId%7D"
  method := "PATCH"

  payload := strings.NewReader(`{
    "name": "Company Name",
    "address": "72 Horseferry Rd",
    "registrationNumber": "12345-6789",
    "contactPersonName": "Joe Blogs",
    "contactPersonEmail": "joe@company.com",
    "contactPersonPhone": "+447822000000"
  }`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer ${API_TOKEN}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
JavaScript - Fetch
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Authorization", "Bearer ${API_TOKEN}");

var raw = JSON.stringify({
  "name": "Company Name",
  "address": "72 Horseferry Rd",
  "registrationNumber": "12345-6789",
  "contactPersonName": "Joe Blogs",
  "contactPersonEmail": "joe@company.com",
  "contactPersonPhone": "+447822000000"
});

var requestOptions = {
  method: 'PATCH',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://api.txm.coincover.com/business/${businessId}", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Example Response

            No response body
This request doesn't return any response body

Transaction Check

Transactions should be sent to the Risk Engine before they are broadcast to the blockchain.

For each transaction checked, CoinCover will provide a response indicating whether the transaction is 'Green' (protected by CoinCover) or 'Red' (not protected by CoinCover). 'Red' responses will contain the relevant reason code and description.

Code Category Reason

50101

Sanctioned address

The destination wallet address is associated with an untrustworthy or high-risk jurisdiction.

50102

Scamming address

The destination wallet address has previously been associated with reported scam.

50103

Phishing address

The destination wallet address has previously been associated with reported phishing activities

50104

Previous claim

The destination wallet address has previously been associated with a previous claim incident.

50105

Honeypot token

The destination wallet address has previously been associated with honeypot tokens or has created scam tokens.

50106

Blackmail activities

The destination wallet address has previously been associated with blackmail activities.

50107

Stealing attack

The destination wallet address has previously been associated with a reported stealing attack.

50108

Fake KYC

The destination wallet address has previously been involved with faking KYC requirements.

50109

Malicious mining activities

The destination wallet address has previously been involved with malicious mining activities.

50110

Darkweb transactions

The destination wallet address has previously been involved with darkweb transactions.

50111

Cybercrime

The destination wallet address has previously been involved with cybercrime activities.

50112

Money laundering

The destination wallet address has previously been involved with money laundering activities.

50113

Financial crime

The destination wallet address has previously been involved with financial crime activities.

50114

Sextortion

The destination wallet address has previously been involved with sextortion activities.

50115

Ransomware

The destination wallet address has previously been involved with ransomware attacks.

50201

Associated with blocklist wallet

The destination wallet address has previously transacted with known blocklisted addresses.

50202

Suspected malicious address

The destination wallet address is suspected to be involved with malicious behaviour.

50301

User upper amount hourly limit

The transaction amount breaches the user’s maximum amount per hour limit policy.

50302

User upper amount daily limit

The transaction amount breaches the user’s maximum amount per day limit policy.

50303

Organisation transaction upper amount limit

The transaction amount breaches the maximum amount per transaction limit policy.

50304

Wallet hourly upper amount limit

The transaction amount breaches the maximum amount per hour for this wallet.

50305

Wallet daily upper amount limit

The transaction amount breaches the maximum amount per day for this wallet.

50306

Organisation hourly upper amount limit

The transaction amount breaches the maximum amount per hour for your organisation.

50307

Organisation daily upper amount limit

The transaction amount breaches the maximum amount per day for your organisation.

50308

Organisation transactions limit (per user)

The transaction breaches the maximum number of transactions allowed per day for your organisation.

50310

User transaction upper amount limit

This transaction amount breaches the maximum claim limit amount for this user.

50401

User upper limit

This transaction amount breaches CoinCover’s user limit policy.

50402

Transaction amount daily limit

This transaction amount breaches CoinCover’s daily limit policy.

50403

Transaction upper amount limit

The transaction amount breaches CoinCover’s maximum amount per transaction limit.

50501

Anomalous daily transaction

This transaction has been determined as being suspicious in conjunction with the daily pattern.

50502

Anomalous weekly transaction

This transaction has been determined as being suspicious in conjunction with the weekly pattern.

50503

Anomalous monthly transaction

This transaction has been determined as being suspicious in conjunction with the monthly pattern.

50504

Anomalous quarterly transaction

This transaction has been determined as being suspicious in conjunction with the quarterly pattern.

50505

Anomalous yearly transaction

This transaction has been determined as being suspicious in conjunction with the yearly pattern.

50601

Transaction is in a time window with abnormal volume

This transaction has been determined as being suspicious in conjunction with time of day.

50602

Transaction is in a time window with abnormal volume

This transaction has been determined as being suspicious in conjunction weekly behaviour.

50603

Transaction is in a time window with abnormal volume

This transaction has been determined as being suspicious in conjunction monthly behaviour.

50701

Token not supported by CoinCover

This transaction contains a token that is not protected by CoinCover.


POST Check Transaction

{{HOST}}/transaction

Transactions should be sent to CoinCover before they are published or broadcast to the blockchain. CoinCover requires core elements of a blockchain transaction including the transaction Hash1 which allows CoinCover to reconcile this for any published transactions.

1For Fireblocks customers who are unable to provide a transaction Hash, a unique reference for the transaction can be submitted in place of the transaction Hash, from the /v1/transaction Fireblocks endpoint (please see the Fireblocks Field Information table).

Transactions need to be associated to a wallet and an end-user.

1For Fireblocks customers who need to provide a walletId, the tuple of the vaultId and assetId can be provided as the walletId in the form of ${vaultId}-${assetId} (please see the Fireblocks Field Information table). The chain and coin/token type needs to be defined.

Note that tokens must be supported contractually and the list of token names can be found at:
https://www.coingecko.com/en/api/documentation

Field Information

Field Description Mandatory

transactionCustomerId

Unique internal ID used by customers systems to identify a transaction.

Yes

transactionHash

Hash of the transaction, verifiable on chain if published.

No

coin

Name of coin/token as defined in coingecko. Use name and not code. E.g bitcoin not btc as codes are not unique.

Yes

walletId

walletId associated to the user. Where there is an onchain reference available, this should be used.

Yes

outputs

Array to support single or batch transactions. Each object in the array should consist of a destination address, amount and the associated user.

Yes

outputs: destination

On chain destination address.

Yes

outputs: amount

Amount in currency. E.g. 1.7 bitcoin.

Yes

outputs: userId

User ID of the end-user relevant to the customers systems and associated to each output address.

Yes

Fireblocks Field Information

Only applicable to customers who have assets on Fireblocks.

Fireblocks Field CoinCover Field Description Mandatory

externalTxId

transactionCustomerId

Unique transaction ID provided by the user. Future transactions with same ID will be rejected.

Yes

vaultId-assetId

walletId

The tuple of the vaultId and assetId should be provided as the walletId in the form of ${vaultId}-${assetId}.

Yes

HTTP Status Codes

Code Description

200

OK.

400

Missing mandatory field value or validation issues.

401

Missing or invalid bearer token.

HEADERS


Content-Type application/json

Authorization Bearer ${API_TOKEN}

Body raw


{
  "transactionCustomerId": "b27f38b9-5158-4b4b-ae2f-a030852f98cd",
  "transactionHash": "GL8636339870050078",
  "coin": "bitcoin-cash",
  "walletId": "1FjgpyeeWTRd7BxTXHEL2rjCj8",
  "outputs":[
      {
        "destination": "16bG5v7VkCeadwzyD1CqAvL6soJ3nfGAhh",
        "amount": "356",
        "userId": "27a73667-fb36-4708-822f-8b2c79cb817e"
      }
  ]
}

Example Request

cURL - cURL
curl --location '/transaction' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ${API_TOKEN}' \
--data '{
  "transactionCustomerId": "b27f38b9-5158-4b4b-ae2f-a030852f98cd",
  "transactionHash": "GL8636339870050078",
  "coin": "bitcoin-cash",
  "walletId": "1FjgpyeeWTRd7BxTXHEL2rjCj8",
  "outputs":[
      {
      "destination": "16bG5v7VkCeadwzyD1CqAvL6soJ3nfGAhh",
      "amount": "356",
      "userId": "27a73667-fb36-4708-822f-8b2c79cb817e"
      }
  ]
}'
C# - HttpClient
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "/transaction");
request.Headers.Add("Authorization", "Bearer ${API_TOKEN}");
var content = new StringContent("{\n  \"transactionCustomerId\": \"b27f38b9-5158-4b4b-ae2f-a030852f98cd\",\n  \"transactionHash\": \"GL8636339870050078\",\n  \"coin\": \"bitcoin-cash\",\n  \"walletId\": \"1FjgpyeeWTRd7BxTXHEL2rjCj8\",\n  \"outputs\":[\n     {\n       \"destination\": \"16bG5v7VkCeadwzyD1CqAvL6soJ3nfGAhh\",\n       \"amount\": \"356\",\n       \"userId\": \"27a73667-fb36-4708-822f-8b2c79cb817e\"\n     }\n   ]\n}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
Go - Native
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "/transaction"
  method := "POST"

  payload := strings.NewReader(`{
  "transactionCustomerId": "b27f38b9-5158-4b4b-ae2f-a030852f98cd",
  "transactionHash": "GL8636339870050078",
  "coin": "bitcoin-cash",
  "walletId": "1FjgpyeeWTRd7BxTXHEL2rjCj8",
  "outputs":[
    {
      "destination": "16bG5v7VkCeadwzyD1CqAvL6soJ3nfGAhh",
      "amount": "356",
      "userId": "27a73667-fb36-4708-822f-8b2c79cb817e"
    }
  ]
  }`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer ${API_TOKEN}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
JavaScript - Fetch
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Authorization", "Bearer ${API_TOKEN}");

var raw = JSON.stringify({
  "transactionCustomerId": "b27f38b9-5158-4b4b-ae2f-a030852f98cd",
  "transactionHash": "GL8636339870050078",
  "coin": "bitcoin-cash",
  "walletId": "1FjgpyeeWTRd7BxTXHEL2rjCj8",
  "outputs": [
    {
      "destination": "16bG5v7VkCeadwzyD1CqAvL6soJ3nfGAhh",
      "amount": "356",
      "userId": "27a73667-fb36-4708-822f-8b2c79cb817e"
    }
  ]
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("/transaction", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Example Response

{
  "transactionUUID": "3d0ee9d3-4d85-5c8e-af77-3bc9feec83f2",
  "status": "GREEN",
  "message": "Transaction is protected by CoinCover."
}