lurkcoin-core/HTTPS API.md

237 lines
7.4 KiB
Markdown

# lurkcoinV3 API documentation
lurkcoin provides an API for servers and other integrations.
In version 3 of the API, JSON is recommended for requests and used for all
responses. If you cannot decode JSON, you should probably use the legacy
[lurkcoinV2 API](https://gist.github.com/luk3yx/8028cedb3bfb282d9ba3f2d1c7871231).
There are currently no plans to remove the older API.
All API endpoints require an `Authorization` header with the
[`Basic`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#Basic_authentication_scheme)
authentication scheme. If the username somehow happens to contain colons (`:`),
these can be replaced with underscores (`_`).
*With Python's requests library, you can simply add
`auth=('username', 'token')` as a keyword argument.*
# Response format
All responses will be a JSON object containing a `success` boolean. If lurkcoin
encounters errors processing your request, this will be false and an error code
will be added to the response. Otherwise, the response data (if any) will be in
the `result` key.
### Examples
```json
{
"success": true,
"result": 1234.56
}
```
```json
{
"success": false,
"error": "ERR_CANNOTAFFORD",
"message": "You cannot afford to do that!"
}
```
### Globally raised errors
The following errors may be raised on any API endpoint:
- `ERR_INVALIDLOGIN` when either `username` or `token` is invalid.
- `ERR_INVALIDREQUEST` when required parameters are missing or are an invalid
type.
- `ERR_INTERNALERROR` when something really nasty happens.
# API endpoints
These endpoints are shared between both lurkcoinV3-core and the suggested bank
API. Any API parameter marked with "servers only" can only be used with
lurkcoinV3-core.
## GET `/v3/summary`
Returns an "account summary".
This endpoint returns a JSON-formatted object with the following items:
- `uid`: An internal UID for the user, this is probably the username with
only the following characters: `[A-Za-z0-9_]+`.
- `name`: The username for the user. This is used in [transaction objects].
- `bal`: A number with the user's current balance.
- `balance`: The balance formatted as a string (if `bal` is `1.23`,
`balance` will be `¤1.23` or similar).
- `history`: A list with the 10 most recent [transaction objects].
- `interest_rate`: The current interest rate.
- `target_balance` *(servers only)*: The server's target balance. This will be
`0` if the server's local currency is equal to lurkcoin.
## POST `/v3/pay`
Sends a payment to a user. This will return the transaction object (see
`/v3/history`) on success. This can optionally be used to generate transaction
IDs for local transactions.
Parameters:
- `source` *(servers only)*: The user who is sending the transaction.
- `target`: The target user to pay.
- `target_server`: The server to pay the user on. If this is a bank, empty
strings should be treated as the current bank.
- `amount`: The amount to pay the user.
- `local_currency` *(servers only)*: If `true`, lurkcoin will calculate the
local server's exchange rate before processing the transaction.
Errors raised:
- `ERR_SERVERNOTFOUND` when `target_server` doesn't exist.
- `ERR_INVALIDAMOUNT` when the amount is invalid
- `ERR_CANNOTPAYNOTHING` when the amount (after exchange rate calculations)
is ¤0.00.
- `ERR_CANNOTAFFORD` when your balance is lower than the amount sent (in
lurkcoins).
## GET `/v3/balance`
Returns your account balance as a number.
## GET `/v3/history`
Returns a list of [transaction objects].
## POST `/v3/exchange_rates`
Gets the exchange rate for the specified server. Will return a number.
Parameters:
- `source` *(optional)*: The server the money is hypothetically coming from.
- `target` *(optional)*: The server the money is hypothetically going to.
- `amount`: The amount of money being transferred.
Errors raised:
- `ERR_SOURCESERVERNOTFOUND` when `source` doesn't exist.
- `ERR_TARGETSERVERNOTFOUND` when `target` doesn't exist.
- `ERR_INVALIDAMOUNT` when `amount` is invalid.
## GET `/v3/pending_transactions`
Returns a JSON-formatted list of unprocessed [transaction objects]. Note that
the order of this list is not guaranteed to be the same between API calls.
## POST `/v3/acknowledge_transactions`
Marks transactions as processed. Invalid or already processed transaction IDs
will be silently ignored.
**Please cache processed transaction IDs until this request has succeeded to
stop transactions being applied twice.**
Parameters:
- `transactions`: A list of transaction IDs that have been processed.
## POST `/v3/reject_transactions`
Marks transactions as rejected, for example when one was sent to a non-existent
user. Invalid or already processed transaction IDs will be silently ignored.
*If a transaction gets marked as rejected, the target user (if any) must not
receive the transaction as the transaction may be reverted.*
Parameters:
- `transactions`: A list of transaction IDs that have been rejected.
## GET `/v3/target_balance`
Gets the target balance. This will be `0` if the server's currency is equal to
lurkcoin.
## PUT `/v3/target_balance`
Sets the server's current balance.
Target balances are used with calculating exchange rates, if the server's
balance is lower than this target balance the currency will be less valuable
than lurkcoin.
**Please do not set ridiculously high/low target balances without a good reason
for doing so.** This API endpoint may have a maximum/minimum target balance
added in the future.
Set the target balance to `0` if the server's currency should have a 1:1
exchange rate with lurkcoin (or if the server's local currency *is* lurkcoin).
Parameters:
- `target_balance`: The new target balance.
Errors raised:
- `ERR_INVALIDAMOUNT`: Invalid target balance.
## GET `/v3/webhook_url`
Gets the server's webhook URL, or `null` if webhooks are not enabled. Every
time a transaction gets sent to the server a POST request will be sent to this
URL similar to the below example.
```
POST /lurkcoin HTTP/1.1
User-Agent: lurkcoin/3.0
Content-Length: 14
Content-Type: application/json
{"version": 0}
```
The request does not contain transaction information because there is currently
no reliable way to validate that the request has indeed originated from
lurkcoin.
# Alternate API endpoints
All `GET`-based endpoints also accept `POST`.
## POST `/v3/set_target_balance`
Equivalent to sending a PUT to `/v3/target_balance`. Can be used if you can't
or don't want to send `PUT` requests.
# Transaction objects
[transaction objects]: #transaction-objects
Transaction objects are defined as follows:
```js
{
// The transaction ID
"id": "T5E1816DE-9ACB0442",
// The user who sent this transaction and the server they are on.
"source": "sourceuser",
"source_server": "sourceserver",
// The user who has received this transaction and their server.
"target": "targetuser",
"target_server": "targetserver",
// The amount sent in lurkcoins.
"amount": 851.80,
// The amount in the sending server's local currency.
"sent_amount": 123.45,
// The amount in the receiving server's local currency.
"received_amount": 1650.52
// The time the transaction was sent in seconds since the UNIX epoch.
"time": 1578637022,
// If this is false, the transaction will not be reverted if it gets
// rejected by the receiving server.
"revertable": true,
}
```
Extra items must be ignored by the client as these may be used in the future
to add more features.