# Frameblade web services APIs
> Version: 0.0.3~alpha
## GET `/api/internal/v1/csrf`
Return CSRF token.
### Examples
Browser:
```
GET /api/internal/v1/csrf
```
```json
{
"error": true,
"response": "notFound"
}
```
Internal network:
```
GET /api/internal/v1/csrf HTTP/1.1
Host: web-api.intranet.frameblade.com
Origin: web-edge.intranet.frameblade.com
Key: <Internal preshared Intanet API access key>
```
```json
{
"error": false,
"response": "R8ov2YBfTYmzFyjit8o2hKBuoIjXXVpa"
}
```
## GET `/api/v1/news`
Return news IDs.
### Options
| Parameter | Description | Required | Default |
| :-: | :-: | :-: | :-: |
| page | Page number | - | 1 |
| perPage | - | - | 5 |
### Examples
```
GET /api/v1/news
```
```json
{
"error": false,
"response": {
"articles": [ 1293, 422, 23, 1132, 21 ],
"articlesCount": 10,
"page": 1,
"pages": 2,
"perPage": 5
}
}
```
```
GET /api/v1/news?page=2
```
```json
{
"error": false,
"response": {
"articles": [ 134, 4232, 243, 132, 31 ],
"articlesCount": 10,
"page": 2,
"pages": 2,
"perPage": 5
}
}
```
## GET `/api/v1/news/latest`
Return latest news IDs.
### Options
| Parameter | Description | Required | Default |
| - | - | :-: | :-: |
| count | Latest news articles count | - | 5 |
### Examples
```
GET /api/v1/news/latest
```
```json
{
"error": false,
"response": [ 1293, 422, 23, 1132, 21 ]
}
```
```
GET /api/v1/news/latest?count=2
```
```json
{
"error": false,
"response": [ 1293, 422 ]
}
```
## GET `/api/v1/news/:id`
Return news article.
### Options
| Parameter | Description | Required | Default |
| - | - | :-: | :-: |
| excerpt| Include excerpt in response | - | false |
### Examples
```
GET /api/v1/news/21
```
```json
{
"error": false,
"response": {
"id": 21,
"authors": [ 12 ],
"editors": [ 12 ],
"created": 1606463043,
"updated": 1606463043,
"body": "# Test article\n\nMarkdown is cool!",
"tags": [ 124, 21, 4 ]
}
}
```
```
GET /api/v1/news/21?excerpt=true
```
```json
{
"error": false,
"response": {
"id": 21,
"authors": [ 12 ],
"editors": [ 12 ],
"created": 1606463043,
"updated": 1606463043,
"body": "# Test article\n\nMarkdown is cool!",
"excerpt": "Our first test article.",
"tags": [ 124, 21, 4 ]
}
}
```
## GET `/api/v1/news/:id/summary`
Return news article with only excerpt.
### Examples
```
GET /api/v1/news/21/summary
```
```json
{
"error": false,
"response": {
"id": 21,
"author": 12,
"created": 1606463043,
"updated": 1606463043,
"excerpt": "Our first test article.",
"tags": [ 124, 21, 4 ]
}
}
```
## GET `/api/v1/users/:id`
Return user data.
### Options
| Parameter | Description | Required | Default |
| - | - | :-: | :-: |
| page | Page number | - | 1 |
### Examples
```
GET /api/v1/users/12
```
```json
{
"error": false,
"response": {
"id": 12,
"created": 1606463043,
"updated": 1606463043,
"lastOnline": 1606463043,
// null if privacy is 0
// 1606463043 if privacy is 1
"name": "Yaroslav",
// null if privacy is 0
// "Yaroslav" if privacy is 1
"surname": "Vorobev",
// null if privacy is 0
// "Vorobev" if privacy is 1
"nickname": "Zekfad",
// null if privacy is 0
// "Zekfad" if privacy is 1
"dateOfBirth": 1018742400,
// null if privacy is 0
// 8899200 if privacy is 1 - this is unix ts with only dd and mm
// 1018742400 if privacy is 2 - this is full unix ts
"bio": "Beginning developer",
// null if privacy is 0
// "Beginning developer" if privacy is 1
"roles": [ 0, 1, 2 ],
"articles": [ 1293, 422, 23, 1132, 21 ],
// null if privacy is 0
// [ 1293, 422, 23, 1132, 21 ] if privacy is 1
"articlesCount": 10,
// -1 if articles privacy is 0
// 10 if articles privacy is 1
"page": 1,
"pages": 2,
// 1 if articles privacy is 0
// 2 if articles privacy is 1
"perPage": 5,
"hasAvatar": true,
"avatar": { // null if no avatar was uploaded or it's deleted
"100": {
"url": "cdn1.framebade.com/api/v1/pictures/avatars/12/100",
"type": "jpg"
},
"orig": {
"url": "cdn3.framebade.com/api/v1/pictures/avatars/12/0",
"type": "webp"
}
},
"privacy": {
"lastOnline": 1,
"name": 1,
"surname" 1,
"nickname": 1,
"dateOfBirth": 2,
"bio": 1,
"articles": 1
}
}
}
```
## GET `/api/v1/users/:id/summary`
Return user data summary.
### Examples
```
GET /api/v1/users/12/summary
```
```json
{
"error": false,
"response": {
"id": 12,
"created": 1606463043,
"updated": 1606463043,
"lastOnline": 1606463043,
// null if privacy is 0
// 1606463043 if privacy is 1
"name": "Yaroslav",
// null if privacy is 0
// "Yaroslav" if privacy is 1
"surname": "Vorobev",
// null if privacy is 0
// "Vorobev" if privacy is 1
"nickname": "Zekfad",
// null if privacy is 0
// "Zekfad" if privacy is 1
"dateOfBirth": 1018742400,
// null if privacy is 0
// 8899200 if privacy is 1
// 1018742400 if privacy is 2
"bio": "Beginning developer",
// null if privacy is 0
// "Beginning developer" if privacy is 1
"roles": [ 0, 1, 2 ],
"articlesCount": 10,
// -1 if articles privacy is 0
// 10 if articles privacy is 1
"hasAvatar": true,
"avatar": { // null if no avatar was uploaded or it's deleted
"100": {
"url": "cdn1.framebade.com/api/v1/pictures/avatars/12/100",
"type": "jpg"
},
"orig": {
"url": "cdn3.framebade.com/api/v1/pictures/avatars/12/0",
"type": "webp"
}
},
"privacy": {
"lastOnline": 1,
"name": 1,
"surname" 1,
"nickname": 1,
"dateOfBirth": 2,
"bio": 1,
"articles": 1
}
}
}
```
## GET `/api/v1/tags/:id`
Return tag info.
### Examples
```
GET /api/v1/tags/124
```
```json
{
"error": false,
"response": {
"name": "test tag",
"description": "Our first (test) tag!"
}
}
```
## GET `/api/v1/tags/:id/summary`
Return tag data summary.
### Examples
```
GET /api/v1/tags/124/summary
```
```json
{
"error": false,
"response": {
"name": "test tag",
"description": "Our first (test) tag!",
"articlesCount": 10
}
}
```
## GET `/api/v1/status/web-api`
Return tag data summary.
### Examples
```
GET /api/v1/status/web-api
```
```json
{
"error": false,
"response": {
"vg": true, // Indicate that server is opertional
"uptime": 12130, // Seconds
"errorsCount": 23, // Server errors (non 4XX)
"requestsServed": 212 // Requests served with 2XX
}
}
```
If server is offline Nginx will serve:
```
GET /api/v1/status/web-api
```
```json
{
"error": true,
"response": {
"vg": false,
"uptime": -1,
"errorsCount": -1,
"requestsServed": -1
}
}
```