### Create Storage Account API Response Source: https://docs.cybrid.xyz/docs/crypto-cold-storage Example response body returned after successfully creating a 'storage' account. It includes details such as creation timestamps, account GUID, asset type, name, customer GUID, balances, and the account state, which progresses from 'storing' to 'created'. ```APIDOC Response Body: { "created_at": "", "updated_at": "", "type": "storage", "guid": "", "asset": "BTC", "name": "", "customer_guid": "", "platform_balance": 0, "platform_available": 0, "state": "storing", "labels": null } ``` -------------------------------- ### Install Project Dependencies Source: https://docs.cybrid.xyz/docs/how-do-i-clone-the-web-repo Installs all the necessary Node.js dependencies for the cybrid-sdk-web demo application using npm. ```bash npm install ``` -------------------------------- ### Create Storage Account API Request Source: https://docs.cybrid.xyz/docs/crypto-cold-storage Example of a POST request to the /api/accounts endpoint to create a new 'storage' account for a specific cryptocurrency asset. This involves specifying the account type, asset, customer GUID, and a descriptive name. ```APIDOC POST /api/accounts Request Body: { "type": "storage", "asset": "BTC", "customer_guid": "", "name": "" } ``` -------------------------------- ### Create Individual Counterparty Source: https://docs.cybrid.xyz/docs/counterparty Example of creating an individual counterparty. This includes details like creation and update timestamps, a unique GUID, type, associated bank and customer GUIDs, state, and compliance decisions. ```APIDOC POST /counterparties Request Body: { "type": "individual", "bank_guid": "1be48364627acfc337ca6fbba33b2a2b", "customer_guid": "fa965bff1576663b7b4443d38ec17345" } Response Body: { "created_at": "2024-09-19T23:36:58.367733Z", "updated_at": "2024-09-19T23:36:59.791494Z", "guid": "926f24ed35aebb8bb45623283e614099", "type": "individual", "bank_guid": "1be48364627acfc337ca6fbba33b2a2b", "customer_guid": "fa965bff1576663b7b4443d38ec17345", "state": "verified", "labels": null, "compliance_decisions": [ { "type": "pesrson_watchlists", "state": "passed", "failure_codes": [] } ] } ``` -------------------------------- ### Create Business Counterparty Source: https://docs.cybrid.xyz/docs/counterparty Example of creating a business counterparty. Similar to individual counterparties, this includes timestamps, GUID, type, bank and customer GUIDs, state, and compliance decisions, tailored for business entities. ```APIDOC POST /counterparties Request Body: { "type": "business", "bank_guid": "6d4b482333cd832ddef0aba9358aba57", "customer_guid": "5bfe74c58106343b36f53221db8df26e" } Response Body: { "created_at": "2024-09-23T16:51:12.669696Z", "updated_at": "2024-09-23T16:51:13.969713Z", "guid": "83716793476895a971f7fc232ce202e9", "type": "business", "bank_guid": "6d4b482333cd832ddef0aba9358aba57", "customer_guid": "5bfe74c58106343b36f53221db8df26e", "state": "unverified", "labels": null, "compliance_decisions": [ { "type": "business_watchlists", "state": "passed", "failure_codes": [] } ] } ``` -------------------------------- ### API Versioning Request Example Source: https://docs.cybrid.xyz/docs/api-versioning Demonstrates how to make a GET request to a specific API version using the 'Accept-Version' header in cURL. This ensures that your integration interacts with the intended version of the Cybrid API. ```cURL curl --request GET \ --url https://bank.sandbox.cybrid.app/api/transfers \ --header 'accept: application/json' \ --header 'accept-version: 2025-06-01' ``` -------------------------------- ### Initialize Plaid Link SDK Source: https://docs.cybrid.xyz/docs/integrating-plaid Example of initializing the Plaid Link SDK with a generated token and handling callbacks for success, load, exit, and events. ```javascript const handler = Plaid.create({ token: 'GENERATED_LINK_TOKEN', onSuccess: (public_token, metadata) => {}, onLoad: () => {}, onExit: (err, metadata) => {}, onEvent: (eventName, metadata) => {}, }); ``` -------------------------------- ### Create Funding Quote Source: https://docs.cybrid.xyz/docs/how-to-execute-instant-funding This API call creates a quote for an instant funding deposit. It requires specifying the product type as 'funding', the asset as 'USD', the side as 'deposit', the customer's GUID, and the amount to be received. ```APIDOC POST /api/quotes Request Body: { "product_type": "funding", "asset": "USD", "side": "deposit", "customer_guid": "", "receive_amount": 100 } Notes: - Instant funding transfers are only available for `side=deposit` quotes. ``` -------------------------------- ### Execute Stablecoin Swap Trade API Source: https://docs.cybrid.xyz/docs/crypto-swap API endpoint to execute a trade for a stablecoin swap. This requires the trade type and the quote GUID obtained from the previous step. ```APIDOC POST /api/trades Request Body: { "trade_type": "platform", "quote_guid": "", "labels": [ "string" ] } ``` -------------------------------- ### Execute Instant Funding Transfer Source: https://docs.cybrid.xyz/docs/how-to-execute-instant-funding This API call executes an instant funding transfer. It requires the transfer type to be 'instant_funding', the GUID of the previously created quote, and the GUID of the destination customer's fiat account. ```APIDOC POST /api/transfers Request Body: { "transfer_type": "instant_funding", "quote_guid": "", "external_bank_account_guid": "" } Notes: - Once submitted, funds are available in the customer's fiat account when the transfer enters the "pending" state. - The transfer remains in "state":"pending" until the same-day ACH completes. ``` -------------------------------- ### Create Fiat Account Source: https://docs.cybrid.xyz/docs/how-do-i-fund-an-account-with-fiat Creates a fiat account for a customer. Requires account type, customer GUID, asset, and a descriptive name. The response includes a unique GUID for the account. ```APIDOC POST /api/accounts ``` ```JSON { "type": "fiat", "customer_guid": "", "asset": "USD", "name": "" } ``` ```JSON { "type": "string", "guid": "string", "created_at": "2024-06-07T15:17:37.355Z", "updated_at": "2024-06-07T15:17:37.355Z", "asset": "string", "name": "string", "bank_guid": "string", "customer_guid": "string", "platform_balance": 0, "platform_available": 0, "state": "string", "labels": [ "string" ] } ``` -------------------------------- ### Create Trading Account API Source: https://docs.cybrid.xyz/docs/crypto-swap API endpoint to create a new trading account for a specific asset. This is a prerequisite for performing stablecoin swaps. ```APIDOC POST /api/accounts Request Body: { "type": "trading", "asset": "string", "name": "string", "customer_guid": "", "labels": [ "string" ] } ``` -------------------------------- ### Sign into the Cybrid Sandbox Source: https://docs.cybrid.xyz/docs/how-do-i-get-started-with-the-sandbox The Cybrid Sandbox is a testing environment for Cybrid's APIs and features. Sign in through the Sandbox Partner Portal at https://id.sandbox.cybrid.app using your Google or Github accounts. ```APIDOC Access URL: https://id.sandbox.cybrid.app Authentication Methods: - Google Account - Github Account Purpose: - Familiarize with Cybrid's APIs and features. - Test simulated activities. - Explore and integrate the Cybrid tech stack. - Experiment with various APIs, simulate transactions, and test functionalities. Benefits: - Secure and separate environment from production systems. - No impact on production systems or real-world data. - Hands-on experience for informed development decisions. ``` -------------------------------- ### Trade Process Steps Source: https://docs.cybrid.xyz/docs/how-do-i-make-a-trade Outlines the sequential steps required to execute a successful trade for a customer on the Cybrid platform. This includes customer creation, account setup, KYC, funding, quote generation, and trade execution. ```APIDOC 1. Create a Customer via the /customers API 2. Create a fiat and trading Account associated with your Customer via the /accounts API 3. Use the Web Demo to go through the simulated KYC and bank account connect process (to programmatically drive the bank connect process see How do I drive Plaid Connect programmatically) 4. Use a funding transfer type to fund the fiat account via the /transfers API (note you still need to generate a quote when doing a funding transfer). 5. Generate a Quote for your Customer via the /quotes API 6. Execute a Trade against your Quote via the /trades API ``` -------------------------------- ### Check Trade Status Source: https://docs.cybrid.xyz/docs/how-do-i-execute-a-trade This snippet demonstrates how to check the status of an executed trade using the GET /api/trades/{trade_guid} endpoint. It shows an example of a successful trade completion response. ```APIDOC GET /api/trades/{trade_guid} Example Response (Completed Trade): { "guid": "your_trade_guid", "customer_guid": "your_customer_guid", "quote_guid": "your_quote_guid", "symbol": "BTC-USD", "side": "buy", "state": "completed", "receive_amount": 10000000, "deliver_amount": 293063, "fee": 0, "created_at": "2022-05-11T19:56:42.856Z" } ``` -------------------------------- ### Run Demo App on Windows Source: https://docs.cybrid.xyz/docs/how-do-i-run-the-demo-app Instructions for configuring a Chrome shortcut on Windows to disable web security for running the demo app. ```bash -disable-web-security --user-data-dir="C:/ChromeDevSession" ``` -------------------------------- ### Clone Cybrid SDK Web Repository Source: https://docs.cybrid.xyz/docs/how-do-i-clone-the-web-repo Clones the cybrid-sdk-web repository from GitHub to your local machine. ```git git clone https://github.com/Cybrid-app/cybrid-sdk-web.git ``` -------------------------------- ### Verify Transfer Status and Balance Source: https://docs.cybrid.xyz/docs/crypto-cold-storage Provides endpoints to check the status of an ongoing transfer and to verify the updated balance of an account after a transfer is completed. The transfer state should be monitored using the transfer GUID, and account balances using the account GUID. ```APIDOC GET /api/transfers/{transfer_guid} # Monitor the 'state' field for completion (e.g., "completed") GET /api/accounts/{account_guid} # Verify the 'platform_available' balance reflects the transfer amount ``` -------------------------------- ### Hosted Demo App Usage Source: https://docs.cybrid.xyz/docs/testing-with-hosted-web-demo-app Instructions on how to test with the hosted web demo app. This includes accessing the app via a URL, the required bank credentials (Client ID, Client Secret, Customer GUID), and environment selection. It also outlines the functionalities that can be tested, such as viewing prices, account lists, simulated trades, and transaction history. ```English 1. Launch the app and enter credentials In Chrome, head over to https://cybrid-app.github.io/cybrid-sdk-web/. You should see the following UI: Be sure to have the following information handy for your bank: * Bank Client ID * Bank Client Secret * Customer GUID * Select the environment to connect to (Local, Sandbox, Staging or Production) The Cybrid Web Demo App authenticates to your Sandbox bank, and connects under the context of a specific customer, which is why we'll provide it with a specific customer GUID. If you don't have these details handy, you can retrieve the Bank Client ID from the Bank page in the Cybrid Partner Portal. Unfortunately if you've lost your Client Secret there is no way to retrieve it, so you'll need to navigate to the API Keys in the Partner Portal and click **Generate New Key** to obtain new credentials. Similarly, you can navigate to**Customers** , select your test customer, and click the copy icon beside the GUID. With the demo app running successfully, you can test out the following: * Viewing real-time prices of crypto assets * Viewing the account list of the customer * Buying or selling cryptocurrency (simulated) * Viewing the transaction history of a specific account ``` -------------------------------- ### Execute Book Transfer Source: https://docs.cybrid.xyz/docs/how-do-i-execute-a-book-transfer This API endpoint executes a book transfer using a previously generated quote. It requires the quote GUID, transfer type ('book'), source and destination account GUIDs, and participant details for both source and destination, including their respective amounts and GUIDs. ```APIDOC POST /api/transfers Request Body: { "transfer_type": "book", "quote_guid": "", "source_account_guid": "", "destination_account_guid": "", "source_participants": [ { "type": "bank", "amount": 100, "guid": "" } ], "destination_participants": [ { "type": "customer", "amount": 100, "guid": "" } ] } ``` -------------------------------- ### Navigate to Project Directory Source: https://docs.cybrid.xyz/docs/how-do-i-clone-the-web-repo Changes the current directory to the root of the cloned cybrid-sdk-web project. ```bash cd cybrid-sdk-web ``` -------------------------------- ### Customer Identity Verification Approaches Source: https://docs.cybrid.xyz/docs/how-do-i-create-an-identity-verification Compares two methods for KYC verification: Cybrid UI SDK and Partner Driven API. The UI SDK simplifies the process by handling the verification flow, while the Partner Driven approach allows for manual control via APIs. ```APIDOC Approach | Description --|-- Cybrid UI SDK | In this approach, Cybrid's SDK drives the entire identity verification process on your behalf. Partner Driven | In this approach, you manually drive the identity verification process via our APIs. ``` -------------------------------- ### Execute Crypto Book Transfer Source: https://docs.cybrid.xyz/docs/how-do-i-execute-a-book-transfer Executes a book transfer using a previously created quote. Requires the quote's GUID, the transfer type ('book'), and the source and destination account GUIDs. It also includes source and destination participants with their respective types, amounts, and GUIDs. ```APIDOC POST /api/transfers Request Body: { "transfer_type": "book", "quote_guid": "", "source_account_guid": "", "destination_account_guid": "", "source_participants": [ { "type": "bank", "amount": 100, "guid": "" } ], "destination_participants": [ { "type": "customer", "amount": 100, "guid": "" } ] } ``` -------------------------------- ### Create Business Customer - Cybrid API Source: https://docs.cybrid.xyz/docs/how-do-i-create-a-customer This API call creates a new business customer. Business customers must undergo Cybrid's KYB process. The customer state is initially 'unverified'. ```APIDOC POST /api/customers Request Body: { "type": "business" } Response Body (Example): { "total": 0, "page": 0, "per_page": 0, "objects": [ { "guid": "your-customer-guid", "bank_guid": "your-bank-guid", "type": "business", "created_at": "2022-05-13T13:55:08.460Z", "state": "unverified" } ] } Customer States: - storing: Platform is storing the customer record. - unverified: Customer stored and ready for verification. ``` -------------------------------- ### Create Individual Customer - Cybrid API Source: https://docs.cybrid.xyz/docs/how-do-i-create-a-customer This API call creates a new individual customer. Individual customers must undergo Cybrid's KYC process. The customer state is initially 'unverified'. ```APIDOC POST /api/customers Request Body: { "type": "individual" } Response Body (Example): { "total": 0, "page": 0, "per_page": 0, "objects": [ { "guid": "your-customer-guid", "bank_guid": "your-bank-guid", "type": "individual", "created_at": "2022-05-13T13:55:08.460Z", "state": "unverified" } ] } Customer States: - storing: Platform is storing the customer record. - unverified: Customer stored and ready for verification. ``` -------------------------------- ### Create Deposit Bank Account Source: https://docs.cybrid.xyz/docs/how-do-i-fund-an-account-with-fiat Creates a routable deposit bank account associated with a fiat account. Requires account GUID, customer GUID, and type. The response includes routing and account details. ```APIDOC POST /api/deposit_bank_accounts ``` ```JSON { "type":"main", "account_guid": "", "customer_guid": "" } ``` ```JSON { "guid": "string", "type": "string", "bank_guid": "string", "customer_guid": "string", "account_guid": "string", "created_at": "2024-06-07T15:17:37.355Z", "updated_at": "2024-06-07T15:17:37.355Z", "asset": "string", "state": "string", "unique_memo_id": "string", "counterparty_name": "string", "counterparty_address": { "street": "string", "street2": "string", "city": "string", "subdivision": "string", "postal_code": "string", "country_code": "string" }, "account_details": [ { "account_number": "string" } ], "routing_details": [ { "routing_number_type": "string", "routing_number": "string" } ], "labels": [ "string" ] } ``` -------------------------------- ### Create Sub-Account Deposit Bank Account Source: https://docs.cybrid.xyz/docs/creating-deposit-accounts Creates a sub-account deposit bank account linked to a parent deposit bank account. This requires both a customer GUID and the parent account's GUID. ```curl curl -X 'POST' \ 'https://bank.{environment}.cybrid.app/api/deposit_bank_accounts' \ -H 'accept: application/json' \ -H 'Authorization: Bearer {bank_token}' \ -H 'Content-Type: application/json' \ -d '{ \ "type": "sub_account", \ "account_guid": "stringstringstringstringstringst", \ "customer_guid": "stringstringstringstringstringst", \ "parent_deposit_bank_account_guid": "stringstringstringstringstringst", \ "labels": [ \ "string" \ ] }' ``` -------------------------------- ### Execute Inter-Account Transfer Source: https://docs.cybrid.xyz/docs/crypto-cold-storage Executes an inter-account transfer using a previously generated quote GUID. This moves the specified asset between accounts. The response includes the transfer details and its initial state. ```APIDOC POST /api/transfers Request Body: { "transfer_type": "inter_account", "quote_guid": "", "source_platform_account": "", "destination_platform_account": "" } Response Body: { "created_at": "", "updated_at": "", "guid": "", "transfer_type": "inter_account", "customer_guid": "", "quote_guid": "", "external_bank_account_guid": null, "asset": "BTC", "side": "deposit", "state": "storing", "failure_code": null, "amount": , "estimated_amount": , "fee": 0, "source_account": { "type": "trading", "guid": "", "customer_guid": "" }, "source_participants": null, "destination_account": { "type": "storage", "guid": "", "customer_guid": "" }, "destination_participants": null, "labels": null } ``` -------------------------------- ### KYB Process Overview Source: https://docs.cybrid.xyz/docs/kyc-responses Outlines the Know Your Business (KYB) process, including the information and verification steps required for businesses and their beneficial owners. ```APIDOC The KYB process includes, but may not be limited to, the following: * Name of Business and Doing Busines As (DBA) * EIN Number * Address * Phone Number * Website * Database Verification * Validates name, EIN, address * KYC of Beneficial owners with 25% or more of the business * All beneficial owners subject to standard KYC checks * AML screening of business * Watchlist / sanctions report * Adverse Media Report ``` -------------------------------- ### Cybrid Webhook SubscriptionEvent Example Source: https://docs.cybrid.xyz/docs/webhooks An example of the JSON payload structure for a Cybrid Webhook event, including details about the event's identifier, owning organization and bank, event type, object identifier, and environment. ```APIDOC SubscriptionEvent: guid: string (Identifier for the event, can be used as an idempotency key) organization_guid: string (Identifier for the organization owning the object) bank_guid: string (Identifier for the bank owning the object) event_type: string (Type of object and event, e.g., 'transfer.storing') object_guid: string (Identifier for the object generating the event) environment: string (Indicates if the event is from sandbox or production) ``` ```JSON { "guid": "cf16b78e233464229c7eda5e979b25a8", "organization_guid": "ad9007e80f35ac6d343d43496cad2744", "bank_guid": "225f91fd6b9e1519817a4048bb37715c", "event_type": "transfer.storing", "object_guid": "8f5ee194e5aa254feef3054bd9543939", "environment": "sandbox" } ``` -------------------------------- ### Create Payment Instructions Source: https://docs.cybrid.xyz/docs/lightning-network-receive-payment Creates payment instructions for a given invoice. The request body requires the invoice GUID. The response includes details of the created payment instruction, initially in a 'storing' state. ```APIDOC POST /api/payment_instructions Request Body: { "invoice_guid": "" } Response Body: { "created_at": "", "updated_at": "", "guid": "", "customer_guid": "", "invoice_guid": "", "network_address": null, "expected_payment_asset": null, "expected_payment_amount": 0, "state": "storing", "expired_at": null, "failed_at": null, "failure_code": null } ``` -------------------------------- ### Run Demo App on Mac OS Source: https://docs.cybrid.xyz/docs/how-do-i-run-the-demo-app Command to launch Google Chrome on Mac OS with CORS disabled for running the demo app. ```bash open -n -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir="/tmp/chrome_dev_test" --disable-web-security ``` -------------------------------- ### Execute Funding Transfer Source: https://docs.cybrid.xyz/docs/how-do-i-fund-an-account-with-fiat This API call executes a funding transfer using a previously generated quote and an external bank account. It specifies the transfer type, quote GUID, external bank account GUID, and payment rail. ```APIDOC POST /api/transfers Request Body: { "quote_guid": "your-quote-guid", "transfer_type": "funding", "external_bank_account_guid": "your-account-string", "payment_rail": "ach", "expected_error": "pending" } Notes: - `payment_rail` defaults to 'ach' for USD and 'eft' for CAD. - In the Sandbox environment, transfers using External Bank Accounts with `type=plaid` are limited to $100.00. ``` -------------------------------- ### Create Trading Account API Source: https://docs.cybrid.xyz/docs/how-do-i-create-an-account-for-the-customer This API endpoint allows for the creation of a trading account. It requires specifying the account type as 'trading', the desired asset (e.g., 'BTC'), a customer GUID, and a descriptive name for the account. The response includes the account's state, which progresses from 'storing' to 'created'. ```APIDOC POST /api/quotes Request Body: { "type": "trading", "asset": "BTC", "customer_guid": "", "name": "BTC trading account" } Response: Success response with new account details, including the account state which progresses from "storing" to "created". ``` -------------------------------- ### Create Inter-Account Transfer Quote Source: https://docs.cybrid.xyz/docs/crypto-cold-storage Initiates a quote for an inter-account transfer, specifying asset, amounts, and account details. The response includes a quote GUID to be used in the subsequent transfer request. Network fees are included in the quote. ```APIDOC POST /api/quotes Request Body: { "product_type": "inter_account", "asset": "BTC", "customer_guid": "", "source_platform_account": "", "destination_platform_account": "", "deliver_amount": , "network_fee": 1000, "network_fee_asset": "BTC" } Response Body: { "created_at": "", "updated_at": "", "guid": "", "product_type": "inter_account", "customer_guid": "", "asset": "BTC", "side": "deposit", "receive_amount": , "deliver_amount": , "fee": 0, "issued_at": "", "expires_at": "", "network_fee": 1000, "network_fee_asset": "BTC" } ``` -------------------------------- ### Create Exit Trade Quote Source: https://docs.cybrid.xyz/docs/exit-trades This API endpoint allows the creation of a quote for an exit trade. An exit trade counters a previous trade that is in the 'settling' state and has not yet been included in a settlement batch. The request requires the customer's GUID and the GUID of the trade to be countered. ```APIDOC POST /api/quotes Request Body: { "product_type": "trading_exit", "customer_guid": "", "reference_trade_guid": "" } Response Body: { "created_at": "", "updated_at": "", "guid": "", "product_type": "trading_exit", "customer_guid": "", "symbol": "", "side": "", "receive_amount": , "deliver_amount": , "fee": , "issued_at": "", "expires_at": "" } ``` -------------------------------- ### Create Bank Account Identity Verification (Plaid) Source: https://docs.cybrid.xyz/docs/how-do-i-create-a-bank-account-verification-v2 This API endpoint is used to create an identity verification for a bank account, specifically for verifying account ownership when using Plaid services. It requires the customer's GUID and the external bank account's GUID. ```APIDOC POST /api/identity_verifications Request Body: { "type": "bank_account", "method": "account_ownership", "customer_guid": "", "external_bank_account_guid": "" } Description: Creates a bank account identity verification to confirm that the customer connecting the external bank account is the owner of that account. This is a prerequisite for processing transfers on the Cybrid Platform. Prerequisites: - The individual customer's state must be 'verified' (completed KYC). - The external bank account's state must be 'unverified'. Notes: - When using the 'account_ownership' method with Plaid, no additional customer details are needed in the request body as the information is verified against the Plaid-connected bank account. ``` -------------------------------- ### Bitcoin Lightning Network Settlement Source: https://docs.cybrid.xyz/docs/crypto-trade-settlement Information on when Bitcoin Lightning Network settlements are initiated. ```APIDOC Bitcoin Lightning Network Settlement: Initiation: Occurs with the 9am Eastern trade settlement. Process: Part of the daily settlement batches. ``` -------------------------------- ### Cybrid Platform Transfers API Reference Source: https://docs.cybrid.xyz/docs/what-does-the-transfer-process-look-like This section details the API endpoints for managing transfers on the Cybrid Platform. It covers the POST /api/transfers endpoint for creating transfers and explains the different states a transfer can be in. ```APIDOC POST /api/transfers Description: Creates a new transfer on the Cybrid Platform. States: - storing: Initial state. - reviewing: Transfer is being processed by the payment processor. - pending: Payment processor has fully processed the transfer. - completed: Transfer was successful. - failed: Transfer failed. failure_codes will contain the reason. Compliance Review: - If flagged for compliance review, the state remains 'reviewing' until the review is complete. - After review, it progresses to 'completed' or 'failed'. ``` -------------------------------- ### Retrieve Customers - Cybrid API Source: https://docs.cybrid.xyz/docs/how-do-i-create-a-customer This API call retrieves all customers associated with your bank. It's used to verify if a customer has been successfully created and to check their current state. ```APIDOC GET /api/customers ```