All Analyzed Sites - 26.6M
- Canadian Centre for the Study of Co-ops - Canadian Centre for the Study of Co-operatives
usaskstudies.coop
- 118 days ago
- daveling.co.uk
From breaking news and entertainment to sports and politics, get the full story with all the live commentary.
- 118 days ago
- bioinfo.ibp.ac.cn
- 118 days ago
- saudiarabiatourismguide.com
- 118 days ago
- static.styleseat.com
- 118 days ago
- Laurent Kempé - One of the Tech Head Brothers
laurentkempe.com
- 118 days ago
- noinnion - We make your life easier
noinnion.com
- 118 days ago
- GNOME Code of Conduct
conduct.gnome.org
Creating a Welcoming Community Thank you for being a part of the GNOME project. We value your parti***tion and want everyone to have an enjoyable and fulfilling experience. Accordingly, all parti***nts are expected to follow this Code of Conduct, and to show respect, understanding, and consideration to one another. Thank you for helping make this […]
- 118 days ago
- admission.hed.gkp.pk
- 118 days ago
- Embassy of Samoa | Belgium | The Official website of the Embassy of Samoa in Belgium
samoaembassybelgium.com
- 118 days ago
- a-npdc.org
welcome. this is the official site of the accomack-northampton planning district commission. we provide planning, community development and housing services to
- 118 days ago
- CRISPR MultiTargeter Front Page
multicrispr.net
- 118 days ago
- Institute for Parks, People, and Biodiversity | University of California, Berkeley
parks.berkeley.edu
- 118 days ago
- Praegus, voor zorgeloze IT
praegus.nl
Software moet doen wat het moet doen.We hebben een beter idee.
- 118 days ago
- The Forli Lab – Molecular Modeling & Drug Discovery
forlilab.org
The Forli Lab at Scripps Research
Molecular Modeling & Drug Design
We develop com***tional methods and apply them to the***utically relevant targets to unravel new biology for drug design.
Collaborations & Initiatives
The Forli Lab is one of the members of the Center for Com***tional
- 118 days ago
- Airbyte
cloud.airbyte.com
Airbyte is the turnkey open-source data integration platform that syncs data from applications, APIs and databases to warehouses.
- 118 days ago
- web.dos.gov.jo
home page
- 118 days ago
- Lenz Grimmer's random thoughts – Technology, Open Source Software, Politics and Life
blog.lenzg.net
technology, open source software, politics and life
- 118 days ago
- Map of Latest News and incidents from Russia in English - russia.liveuamap.com
russia.liveuamap.com
Explore Russia local news alerts & today's headlines geolocated on live map on website or application. Focus on politics, military news and security alerts
- 35 days ago
- Modern Robotics - Northwestern Mechatronics Wiki
modernrobotics.org
- 118 days ago
- crispr-ga.net
- 118 days ago
- Guyana High Commission London – www.londonhc.mission.gov.gy
guyanahclondon.co.uk
- 118 days ago
- 404 Not Found
napptive.com
napptive pricing: explore our competitive plans. find the perfect solution for your business needs & scale your development with confidence.
- 118 days ago
- AIcrowd Forum - Gathering of AI/ML enthusiast brought together by AIcrowd!
discourse.aicrowd.com
A place for AIcrowd parti***nts organizers and community to hang out
- 118 days ago
- Euroformula Open Championship
euroformulaopen.net
- 118 days ago
- Dept. of IE, CUHK Staff Web Server
staff.ie.cuhk.edu.hk
- 118 days ago
- The Rant | Sanford, N.C.
rantnc.com
The Rant is a news site based in Sanford, North Carolina, covering news and features in our region. The Rant is run by former journalists. The Rant loves you.
- 118 days ago
- Astronomy | U-M LSA
astro.lsa.umich.edu
Discover astronomy at U-M and explore stars, planets, and galaxies, train with future astronomers, and champion cosmic curiosity.
- 118 days ago
- Welcome to PySDL2’s do***entation! — PySDL2 0.9.13 do***entation
pysdl2.readthedocs.io
- 118 days ago
- OCMock
ocmock.org
- 118 days ago
- Commitment to Privacy - Virginia Commonwealth University
research.vcu.edu
Commitment to Privacy
- 118 days ago
- openEO Platform
openeo.cloud
- 118 days ago
- Музей портрета «Национальная портретная галерея». Museum portrait "National Portrait Gallery" – Добро пожаловать в музей портрета «Национальная портретная галерея»!
portret.ru
музей портрета
«национальная портретная галерея» - беспрецедентная в истории музейного дела и уникальная по содержанию коллекция исторических портретов!
цель собрания – сохранить историческую память о выдающихся людях, чьими именами написаны страницы российской истории, осознать исторический контекст их существования, попытаться понять мотивы их деяний.
портретные образы творцов российской истории и культуры, их легендарные судьбы и великие биографии представлены в коллекции музея в самых разнообразных формах и жанрах, что позволяет максимально объемно увидеть личность и осознать её место в историческом пространстве. музейный фонд формируется по классическому принципу иконографии и представляет собой базу данных. коллекция «национальной портретной галереи» - это собрание произведений живописи и графики, скульптуры, документальных фильмов и кино-иследований, редких фотографий, кинохроники, интересных интервью и многое другое…
музей портрета «россия — взгляд из третьего тысячелетия». художественно-исторический проект
- 118 days ago
- 403 Forbidden
master.irisa.fr
- 118 days ago
- OpenValue - Better software, faster.
openvalue.eu
High quality custom software. Over 160 seasoned full stack Java experts, Java champions & JavaOne rockstars with offices in 9 cities.
- 118 days ago
- Just a moment...
dashboard.nbshare.io
- 118 days ago
- EAMT 2020, Lisboa, Portugal, November 3-5 2020
eamt2020.inesc-id.pt
- 118 days ago
- sandsynligvis.dk - sandsynligvis.dk
sandsynligvis.dk
sandsynligvis.dk er en blog om statistik, biostatistik og statistisk ***yse. Målgruppen er alle, der er nysgerrige og interesserede i statistik og statistiske ***yser. Vi diskuterer statistik i nyhederne og interessante statistiske i et sprog, så alle kan forstå det
- 118 days ago
-
Gen Investor Relations - Investor Relations
investor.gendigital.com
- 118 days ago
- International Cost Engineering Council | International Cost Engineering Council
icoste.org
- 118 days ago
- Chenxi Whitehouse
chenxwh.github.io
- 118 days ago
- Website not found…
kodepress.com
- 118 days ago
- Squarespace - Domain Not Claimed
cydefe.com
information security training platform, training content developers, and
curators of information security culture.
- 118 days ago
- VALR API
docs.valr.com
VALR provides a powerful API consisting of REST endpoints for transactional operations and a complementary Websocket service providing streaming market, order, and balance updates.
Access to and use of the API is governed by our [Terms of Service](https://support.valr.com/hc/en-us/articles/360019021931-Terms-of-Service).
If you have any API questions, feedback, or recommendations please post a question via our [support center](https://support.valr.com/).
With our API, you can:
- Access current and historic market data
- Submit trade orders
- Buy and sell over 60 cryptocurrencies
- Withdraw cryptocurrencies from your wallets
- Withdraw fiat from your VALR wallet
# Getting started
---
Keep the following in mind when developing against the VALR API:
- Enable 2FA on your account. API Keys cannot be generated unless 2FA is enabled.
- All REST requests must be sent using the `application/json` content-type. Non-HTTPS requests are not allowed.
- All REST requests will result in HTTP response codes in the range 200-299, unless there is a server or infrastructure error. The API result will be wrapped in a JSON Result object.
- Requests that are made to the Authenticated API without an API key will be rejected with an HTTP response code `403`.
- Any `POST`, `PUT` or `PATCH` HTTP request that is made without the `content-type: application/json` header will be rejected with an HTTP response code `403`.
# Authentication
---
## API Keys
Authenticating to the VALR API requires a valid API Key. API Keys have scoped permissions:
- **View access** - This option grants the API Key permission only to view balances, orders, and other details of the account.
- **Trade** - This option grants the API Key permission to place buy and sell orders.
- **Transfer** - This option grants the API Key permission to transfer funds between primary and subaccounts.
- **Withdraw** - This option grants the API Key permission to programatically withdraw a currency to an address or a bank account you provide.
- **Link Bank Account** - This option grants the API Key permission to programatically link bank accounts for fiat deposits and withdrawals.
If you have enabled 2FA you can view existing API Keys or generate new API Keys with the appropriate permissions. Find the `API Keys` in the account drop-down menu. We strongly recommend minimizing the scope of any given API key to limit the impact of a compromised key/secret pair.
The generated API Key and the corresponding secret are each 64-character long and are made up of numbers and letters. An API Key/API Secret will look similar to the example provided below:
Example API Key/API Secret: `b9fb68df5485639d03c3171cf6e49b89e52fd78d5c313819b9c592b59c689f33`
### Notes on security: Secure your API Keys and API Secrets
Your API Key identifies your account (think of it as a username) and the API Secret authenticates your account (think of it as a password). Please follow the instructions below to secure your API Key and API Secret:
- Do not send your API Secret with your API requests. Only send the API Key.
- Do not share your API Secret or the API Key with anyone.
- Do not commit your API Secret into source control systems like github.
- If you lose your API Key or Secret, immediately delete it from your Setting page.
Please take note that if your API Secret is compromised, your funds are at risk.
## Request signing
Authenticated calls require you to send a request signature with every request. This signature should be re-generated for every request. The `request signature` is generated by first concatenating the following values in the order given below and creating a SHA512 HMAC hash using your API Secret:
| Parameter | Description |
| --- | --- |
| timestamp | The current unix timestamp (in milliseconds) of this request |
| verb | HTTP verb. Example: GET, POST, PUT or DELETE |
| path | Request path excluding host name and including query string, e.g. /v1/account/balances |
| body (optional) | HTTP Request body as a string (optional, if request has no body) |
| subaccountId (optional) | The Id of a subaccount as a string. **Required when impersonating a subaccount.** |
The NodeJS example below has a method called `signRequest` that generates a `request signature` which must be passed along with every request that needs authentication:
``` javascript
const crypto = require('crypto');
function signRequest(apiSecret, timestamp, verb, path, body = '') {
return crypto
.createHmac("sha512", apiSecret)
.update(timestamp.toString())
.update(verb.toUpperCase())
.update(path)
.update(body)
.digest("hex");
}
```
Golang example:
``` go
func signRequest(apiSecret string, timestamp time.Time, verb string, path string, body string) string {
// Create a new Keyed-Hash Message Authentication Code (HMAC) using SHA512 and API Secret
mac := hmac.New(sha512.New, []byte(apiSecret))
// Convert timestamp to nanoseconds then divide by 1000000 to get the milliseconds
timestampString := strconv.FormatInt(timestamp.UnixNano()/1000000, 10)
mac.Write([]byte(timestampString))
mac.Write([]byte(strings.ToUpper(verb)))
mac.Write([]byte(path))
mac.Write([]byte(body))
// Gets the byte hash from HMAC and converts it into a hex string
return hex.EncodeToString(mac.Sum(nil))
}
```
C# example:
``` csharp
using System;
using System.Text;
using System.Security.Cryptography;
public static
string signRequest(string apiKeySecret, string timestamp, string verb, string path, string body = "")
{
var payload = timestamp + verb.ToUpper() + path + body;
byte[] payloadBytes = Encoding.UTF8.GetBytes(payload);
using (HMACSHA512 hmac = new HMACSHA512(Encoding.UTF8.GetBytes(apiKeySecret)))
{
byte[] hash = hmac.ComputeHash(payloadBytes);
return toHexString(hash);
}
}
private static
string toHexString(byte[] hash)
{
StringBuilder result = new StringBuilder(hash.Length * 2);
foreach(var b in hash)
{
result.Append(b.ToString("x2"));
}
return result.ToString();
}
/* Timestamp in milliseconds.
* The same timestamp should be used to generate request signature
* as well as sent along in the X-VALR-TIMESTAMP header of the request
*/
private static
string getTimestamp()
{
return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
}
```
Python 3.x example:
``` python
import time
import hashlib
import hmac
def sign_request(api_key_secret, timestamp, verb, path, body = ""):
"""Signs the request payload using the api key secret
api_key_secret - the api key secret
timestamp - the unix timestamp of this request e.g. int(time.time()*1000)
verb - Http verb - GET, POST, PUT or DELETE
path - path excluding host name, e.g. '/v1/withdraw
body - http request body as a string, optional
"""
payload = "{}{}{}{}".format(timestamp,verb.upper(),path,body)
message = bytearray(payload,'utf-8')
signature = hmac.new( bytearray(api_key_secret,'utf-8'), message, digestmod=hashlib.sha512).hexdigest()
return signature
```
Java example:
``` java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.Clock;
/**
* Signs the request payload using the api key secret
*
* @param apiKeySecret - the api key secret
* @param timestamp - the unix timestamp of this request e.g. Clock.systemUTC().millis()
* @param verb - Http verb - GET, POST, PUT or DELETE
* @param path - path excluding host name, e.g. '/v1/withdraw
* @param body - http request body as a string, optional
* @return the signature of the request
*/
public static String signRequest(String apiKeySecret, String timestamp, String verb, String path, String body) {
try {
Mac hmacSHA512 = Mac.getInstance("HmacSHA512");
SecretKeySpec secretKeySpec = new SecretKeySpec(apiKeySecret.getBytes(), "HmacSHA512");
hmacSHA512.init(secretKeySpec);
hmacSHA512.update(timestamp.getBytes());
hmacSHA512.update(verb.toUpperCase().getBytes());
hmacSHA512.update(path.getBytes());
hmacSHA512.update(body.getBytes());
byte[] digest = hmacSHA512.doFinal();
return toHexString(digest);
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException("Unable to sign request", e);
}
}
public static String toHexString(byte[] a) {
StringBuilder sb = new StringBuilder(a.length * 2);
for (byte b : a)
sb.append(String.format("x", b));
return sb.toString();
}
```
### Writing your own request signing method
If you choose to write your own method to generate a `request signature`, please use the following test data:
| Parameter | Test value |
| --- | --- |
| timestamp | 1558014486185 |
| verb | GET |
| path | /v1/account/balances |
| API Secret | 4961b74efac86b25cce8fbe4c9811c4c7a787b7a5996660afcc2e287ad864363 |
If you provide the above values, your method should generate the following HMAC SHA512 signature using your API Secret:
`9d52c181ed69460b49307b7891f04658e938b21181173844b5018b2fe783a6d4c62b8e67a03de4d099e7437ebfabe12c56233b73c6a0cc0f7ae87e05f6289928`
| Parameter | Test value |
| --- | --- |
| timestamp | 1558017528946 |
| verb | POST |
| path | /v1/orders/market |
| body | {"customerOrderId":"ORDER-000001","pair":"BTCUSDC","side":"BUY","quoteAmount":"80000"} |
| API Secret | 4961b74efac86b25cce8fbe4c9811c4c7a787b7a5996660afcc2e287ad864363 |
If you provide the above values, your method should generate the following HMAC SHA512 signature using your API Secret:
`09f536e3dfdad58443f16010a97a0a21ad27486b7b8d6d4103170d885410ed77f037f1fa628474190d4f5c08ca12c1acc850901f1c2e75c6d906ec3b32b008d0`
## Making an authenticated API call
Follow the instructions below to make an authenticated API call:
1. Create a SHA512 HMAC hash using your API Secret and the values pertaining to your request (timestamp, HTTP verb, API path, body, subaccountId - when impersonating a subaccount) detailed above.
2. REST: Include the following headers in each request:
- **X-VALR-API-KEY** : Your API Key
- **X-VALR-SIGNATURE** : The `request signature` that was generated for your request (see point 1)
- **X-VALR-TIMESTAMP** : The same timestamp used to generate the `request signature`
- **X-VALR-SUB-ACCOUNT-ID** (Optional): A Primary account API key can impersonate a subaccount by specifying the subaccountId in this header. This allows the primary account to transact on the impersonated subaccount. Remember to add the subaccountId in the request signature as well.
3. WebSocket: Pass in the same three headers to the first call that establishes the WebSocket connection. (See `WebSocket API` section below for details)
## Run in Postman
You can run our API collection in Postman using the button "Run in Postman" above. This collection already includes the following items for your convenience:
1. A pre-request script that runs before every request to generate your request signature and timestamp.
2. The three authentication headers pre-po***ted with the right environment variables for each request.
In order to start with Postman, please create a new `Environment` in Postman and add two variables and name them `yourApiKey` and `yourApiSecret`. Provide appropriate initial values for these variables. That is, your Api Key and Api Secret for your account. Enable this enviornment while running your requests. That is all!
(Optional): To impersonate an account add the **X-VALR-SUB-ACCOUNT-ID** header to the request. To add the **X-VALR-SUB-ACCOUNT-ID** header to **every** request, define the `yourSubAccountId` variable in your `Environment`. If you provide the header on the request and **also** define the environment variable, the header will take precedence. Note that some requests do not allow impersonation.
### Details of the pre-request script
The pre-request script will po***te the following two variables in your environment with the correct values:
- `requestSignature`
- `requestTimestamp`
The script is provided below for your convenience:
``` javascript
/* Pre-requisite
==================
1) Create a new Environment in Postman.
2) Add two variables: "yourApiKey" and "yourApiSecret" to the Environment. Provide appropriate initial values for these variables. That is, the Api Key and Api Secret for your account.
3) Enable this environment for your requests.
4) For each request, this script generates the following two new environment variables:
* requestSignature
* requestTimestamp
5) Ensure that the following three headers are sent with every request:
X-VALR-API-KEY: {{yourApiKey}}
X-VALR-SIGNATURE: {{requestSignature}}
X-VALR-TIMESTAMP: {{requestTimestamp}}
Subaccounts
==================
To perform a request impersonating a specific subaccount, the subaccount ID must be provided. The ID can be determined by using `Account/Subaccounts/Retrieve Subaccounts`. Once the ID is determined, it can be added to the request by either adding the `X-VALR-SUB-ACCOUNT-ID` header, with the ID as value, to the request directly, or by adding the variable {{yourSubAccountId}} to the Postman Environment. If both are provided, the header has precedence. If the variable is provided it will be added to every request.
Please note: Requests that may only be performed on the Primary account will fail with a "401: Unauthorized" response if the subaccount ID is included.
*/
var YOUR_API_KEY = postman.getEnvironmentVariable('yourApiKey');
var YOUR_API_SECRET = postman.getEnvironmentVariable('yourApiSecret');
var subAccountHeader = pm.request.headers.find((header) => header.key === 'X-VALR-SUB-ACCOUNT-ID' && !header.disabled)
var YOUR_SUB_ACCOUNT_ID = subAccountHeader ? subAccountHeader.value
: postman.getEnvironmentVariable('yourSubAccountId');
var requestTimestamp = (new Date()).getTime();
function getPath(url) {
var pathRegex = /(?:.+?\:\/\/.+?)?(\/.+)/;
var result = url.match(pathRegex);
return result && result.length > 1 ? result[1] : '';
}
function getHmacDigest(httpMethod, requestUrl, requestBody) {
var requestPath = getPath(requestUrl.toString());
if (httpMethod == 'GET' || !requestBody) {
requestBody = '';
}
var requestData = [requestTimestamp, httpMethod.toUpperCase(), requestPath, requestBody, YOUR_SUB_ACCOUNT_ID].join("");
var hmacDigest = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA512(requestData, YOUR_API_SECRET));
return hmacDigest;
}
postman.setEnvironmentVariable('requestSignature', getHmacDigest(pm.request.method, pm.request.url, pm.request.body));
postman.setEnvironmentVariable('requestTimestamp', requestTimestamp);
if (YOUR_SUB_ACCOUNT_ID && YOUR_SUB_ACCOUNT_ID > 0 && !subAccountHeader) {
pm.request.headers.add({ key: 'X-VALR-SUB-ACCOUNT-ID', value: `${YOUR_SUB_ACCOUNT_ID}` });
}j
```
# Rate limiting
---
There is an API call limit of 1000 API calls per minute per API key, and 1200 API calls per minute per IP, beyond which the API calls will fail with a `429 Too Many Requests` response. A response header of `x-valr-ratelimited: true` will also be returned. The limit will be reset at the start of the next minute.
- Example 1: You are allowed to do 1000 calls from 10:10:00 to 10:10:59. When the time changes to 10:11:00, the counter will be reset and will start over.
- Example 2: If the first request comes in at 10:10:30, the counter will be reset at 10:11:00
To ensure that users are able to place and cancel orders at a higher rate, per second rate limits are applied on certain API routes, with the limit reset at the start of the next second. Here the limits per IP and key do not apply:
- Batch orders:
- Route: `/v1/batch/orders`
- Method: `POST`
- Rate limit: 400/s
- Delete orders:
- Route: `/v1/orders`
- Method: `DELETE`
- Rate limit: 450/s
- Post orders:
- Route: `/v1/orders`
- Method: `POST`
- Rate limit: 400/s
- Modify orders:
- Route: `/v1/orders/modify`
- Method: `PUT`
- Rate limit: 400/s
- Subaccount internal transfers
- Route `/v1/account/subaccounts/transfer`
- Method: `POST`
- Rate limit: 20/s
- Websocket new clients:
- Route: `/ws`
- Rate limit: 30/m
- Websocket account write:
- Route: `/ws/account`
- Place: 400 p/s
- Cancel: 450p/s
- Batch: 400p/s
- Modify: 400p/s
We may reduce limits when the system is under severe pressure.
# Performance considerations
---
### Websocket Efficiency
Websocket connections offer significantly faster data transmission than HTTP due to their persistent, open TCP socket. This allows for efficient, real-time communication.
Batching can further enhance performance, though the benefit is less pronounced with Websockets compared to HTTP.
### Optimal Order Book Updates
The OB_L1_DIFF Websocket feed provides the most *** updates for order book changes. Its smaller data packets minimize overhead for clients, servers, and network transmission.
### Real-Time Order ***
A Websocket connection is the fastest method for receiving order processing and status updates. Most unfiltered HTTP requests for order status are served from memory, but updates via Websockets in normal conditions should still be superior.
### Estimated Latency
Excluding geographic distance and demand, the total round trip time from placing the order via Websocket to receiving the order place outcome on a Websocket connection should be approximately 8ms. This number is a rough estimate and can vary as we constantly update our service or due to other constraints.
# Caching
In order to improve the latency of requests and reduce the load on servers, some GET requests are cached by default.
We use the HTTP Cache-Control Header, which comprises one or more comma separated directives. These directives determine whether a GET response is cachable, and if so, the duration.
Here's an example of an HTTP Response Header:
`cache-control: max-age=60,public`
- cache-control: max-age - defines the amount of time it takes for a cached copy of a resource to expire, in seconds.
- cache-control: public - means that a resource can be cached by any cache.
Below are the GET endpoints that are cached, and their max-age in seconds.
```
*Public Routes*
===============
/marketsummary (60)
/:currencypair/marketsummary (10)
/currencies (60)
/pairs(60)
/:currencyPair/orderbook (30)
/:currencyPair/orderbook/full (30)
/:currencyPair/trades (30)
/ordertypes (60)
/:currencypair/ordertypes (60)
*Authenticated Routes*
======================
/marketdata (1)
/fiat/:currency/banks (600)
/fiat/:currency/auto-buy (60)
/portfolio (1)
```
- 118 days ago
- Neurion AI
neurion.vercel.app
- 118 days ago
- The Zinc Collective
zinc.coop
- 118 days ago
- ERROR: The request could not be satisfied
restaurants.mcdonalds.fr
- 118 days ago
- Neural Data Science Group - University of Goettingen
eckerlab.org
- 118 days ago
- Bram Willemse - Product professional
bramwillemse.nl
Bram Willemse is a product professional with a background in digital product development, based in Amsterdam, the Netherlands.
- 118 days ago
- *Centre d'Histoire du Travail de Nantes
cht-nantes.org
- 118 days ago