API 接口文档
短链接平台开放 RESTful API 文档,所有接口返回统一 JSON 格式。
Base URL: http://localhost:3050
鉴权方式
所有 API 请求必须在请求头中携带 X-API-Key,值为有效的 API 密钥。
非法密钥或无密钥请求返回 401 状态码。
# 请求头示例
X-API-Key: sk_your_api_key_here
API 密钥可在 管理后台 - API 密钥 页面创建和管理。
标准错误码
所有 API 返回统一 JSON 格式:
{
"code": 0,
"message": "success",
"data": {}
}
标准错误码说明:
0请求成功
401未授权 — API 密钥无效或缺失
403禁止访问 — 链接被禁用或触发风控
404资源不存在
429请求过于频繁,被限流
500服务器内部错误
1001参数校验失败
1002资源已存在(如短码冲突)
限流说明
系统对 API 接口实施两级限流:
- 通用 API 限流:每个 IP 每分钟最多
60次请求 - 创建链接限流:
POST /api/link/create每个 IP 每分钟最多20次请求
超出限制返回 HTTP 429,响应体:
{
"code": 429,
"message": "请求过于频繁,请稍后再试",
"data": null
}
SDK Demo
以下提供 Node.js、Python、Java、PHP、Go 五种语言的 SDK 调用示例,可直接复制使用。
NODE
Node.js
使用 axios / fetch
/**
* Node.js SDK 示例 — 使用原生 fetch(Node.js 18+)
*/
const API_BASE = 'http://localhost:3050';
const API_KEY = 'sk_your_api_key_here';
async function createShortLink(url, options = {}) {
const res = await fetch(`${API_BASE}/api/link/create`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': API_KEY,
},
body: JSON.stringify({
url,
short_code: options.shortCode,
title: options.title,
expire_days: options.expireDays,
}),
});
return res.json();
}
async function listLinks(params = {}) {
const query = new URLSearchParams(params).toString();
const res = await fetch(`${API_BASE}/api/link/list?${query}`, {
headers: { 'X-API-Key': API_KEY },
});
return res.json();
}
async function getLinkInfo(id) {
const res = await fetch(`${API_BASE}/api/link/info?id=${id}`, {
headers: { 'X-API-Key': API_KEY },
});
return res.json();
}
async function updateLink(id, fields) {
const res = await fetch(`${API_BASE}/api/link/update`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY },
body: JSON.stringify({ id, ...fields }),
});
return res.json();
}
async function deleteLink(id) {
const res = await fetch(`${API_BASE}/api/link/delete`, {
method: 'DELETE',
headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY },
body: JSON.stringify({ id }),
});
return res.json();
}
// ===== 使用示例 =====
async function main() {
// 1. 创建短链接
const created = await createShortLink('https://example.com/very/long/url', {
title: 'SDK 测试',
expireDays: 30,
});
console.log('创建成功:', created.data.short_url);
// 2. 查询列表
const list = await listLinks({ page: 1, page_size: 10 });
console.log('总数:', list.data.total);
// 3. 查询详情
const info = await getLinkInfo(created.data.id);
console.log('链接标题:', info.data.title);
// 4. 更新链接
await updateLink(created.data.id, { title: '新标题', status: 1 });
// 5. 删除链接
await deleteLink(created.data.id);
console.log('删除完成');
}
main().catch(console.error);
PY
Python
使用 requests
"""
Python SDK 示例 — 使用 requests
安装: pip install requests
"""
import requests
API_BASE = "http://localhost:3050"
API_KEY = "sk_your_api_key_here"
HEADERS = {"X-API-Key": API_KEY}
def create_short_link(url, short_code=None, title=None, expire_days=None):
"""创建短链接"""
body = {"url": url}
if short_code:
body["short_code"] = short_code
if title:
body["title"] = title
if expire_days:
body["expire_days"] = expire_days
res = requests.post(f"{API_BASE}/api/link/create",
json=body, headers=HEADERS)
return res.json()
def list_links(page=1, page_size=20, keyword=None, status=None):
"""查询链接列表"""
params = {"page": page, "page_size": page_size}
if keyword:
params["keyword"] = keyword
if status is not None:
params["status"] = status
res = requests.get(f"{API_BASE}/api/link/list",
params=params, headers=HEADERS)
return res.json()
def get_link_info(id=None, short_code=None):
"""查询链接详情"""
params = {}
if id:
params["id"] = id
if short_code:
params["short_code"] = short_code
res = requests.get(f"{API_BASE}/api/link/info",
params=params, headers=HEADERS)
return res.json()
def update_link(id, url=None, title=None, status=None, expire_days=None):
"""更新链接"""
body = {"id": id}
if url is not None:
body["url"] = url
if title is not None:
body["title"] = title
if status is not None:
body["status"] = status
if expire_days is not None:
body["expire_days"] = expire_days
res = requests.put(f"{API_BASE}/api/link/update",
json=body, headers=HEADERS)
return res.json()
def delete_link(id):
"""删除链接"""
res = requests.delete(f"{API_BASE}/api/link/delete",
json={"id": id}, headers=HEADERS)
return res.json()
# ===== 使用示例 =====
if __name__ == "__main__":
# 1. 创建
result = create_short_link("https://example.com/long-url",
title="Python SDK 测试", expire_days=30)
link_id = result["data"]["id"]
print(f"创建成功: {result['data']['short_url']}")
# 2. 查询列表
links = list_links(page=1, page_size=10)
print(f"总数: {links['data']['total']}")
# 3. 查询详情
info = get_link_info(id=link_id)
print(f"标题: {info['data']['title']}")
# 4. 更新
update_link(link_id, title="新标题")
# 5. 删除
delete_link(link_id)
print("删除完成")
JAVA
Java
使用 OkHttp
// Java SDK 示例 — 使用 OkHttp + Jackson
// build.gradle 依赖:
// implementation 'com.squareup.okhttp3:okhttp:4.12.0'
// implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0'
import okhttp3.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ShortLinkSDK {
private static final String API_BASE = "http://localhost:3050";
private static final String API_KEY = "sk_your_api_key_here";
private final OkHttpClient client = new OkHttpClient();
private final ObjectMapper mapper = new ObjectMapper();
private JsonNode request(Request request) throws Exception {
try (Response resp = client.newCall(request).execute()) {
return mapper.readTree(resp.body().string());
}
}
/** 创建短链接 */
public JsonNode createLink(String url, String title, Integer expireDays) throws Exception {
String json = mapper.writeValueAsString(
java.util.Map.of("url", url, "title", title != null ? title : "",
"expire_days", expireDays != null ? expireDays : 0));
RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
Request request = new Request.Builder()
.url(API_BASE + "/api/link/create")
.header("X-API-Key", API_KEY)
.post(body).build();
return request(request);
}
/** 查询链接列表 */
public JsonNode listLinks(int page, int pageSize) throws Exception {
HttpUrl url = HttpUrl.parse(API_BASE + "/api/link/list")
.newBuilder().addQueryParameter("page", String.valueOf(page))
.addQueryParameter("page_size", String.valueOf(pageSize)).build();
Request request = new Request.Builder()
.url(url).header("X-API-Key", API_KEY).get().build();
return request(request);
}
/** 查询链接详情 */
public JsonNode getLinkInfo(long id) throws Exception {
HttpUrl url = HttpUrl.parse(API_BASE + "/api/link/info")
.newBuilder().addQueryParameter("id", String.valueOf(id)).build();
Request request = new Request.Builder()
.url(url).header("X-API-Key", API_KEY).get().build();
return request(request);
}
/** 更新链接 */
public JsonNode updateLink(long id, String title, Integer status) throws Exception {
var map = new java.util.HashMap<String, Object>();
map.put("id", id);
if (title != null) map.put("title", title);
if (status != null) map.put("status", status);
String json = mapper.writeValueAsString(map);
RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
Request request = new Request.Builder()
.url(API_BASE + "/api/link/update")
.header("X-API-Key", API_KEY).put(body).build();
return request(request);
}
/** 删除链接 */
public JsonNode deleteLink(long id) throws Exception {
String json = mapper.writeValueAsString(java.util.Map.of("id", id));
RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
Request request = new Request.Builder()
.url(API_BASE + "/api/link/delete")
.header("X-API-Key", API_KEY).delete(body).build();
return request(request);
}
// ===== 使用示例 =====
public static void main(String[] args) throws Exception {
ShortLinkSDK sdk = new ShortLinkSDK();
// 1. 创建
JsonNode created = sdk.createLink("https://example.com/long-url",
"Java SDK 测试", 30);
long id = created.get("data").get("id").asLong();
System.out.println("创建成功: " + created.get("data").get("short_url").asText());
// 2. 查询列表
JsonNode list = sdk.listLinks(1, 10);
System.out.println("总数: " + list.get("data").get("total").asInt());
// 3. 查询详情
JsonNode info = sdk.getLinkInfo(id);
System.out.println("标题: " + info.get("data").get("title").asText());
// 4. 更新
sdk.updateLink(id, "新标题", 1);
// 5. 删除
sdk.deleteLink(id);
System.out.println("删除完成");
}
}
PHP
PHP
使用 cURL
<?php
/**
* PHP SDK 示例 — 使用 cURL
*/
class ShortLinkSDK {
private string $apiBase = 'http://localhost:3050';
private string $apiKey;
public function __construct(string $apiKey) {
$this->apiKey = $apiKey;
}
private function request(string $method, string $path, array $data = []): array {
$url = $this->apiBase . $path;
$ch = curl_init();
if ($method === 'GET' && !empty($data)) {
$url .= '?' . http_build_query($data);
}
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: ' . $this->apiKey,
],
]);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
} elseif (in_array($method, ['PUT', 'DELETE'])) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true) ?? [];
}
/** 创建短链接 */
public function createLink(string $url, ?string $title = null,
?int $expireDays = null): array {
return $this->request('POST', '/api/link/create', array_filter([
'url' => $url,
'title' => $title,
'expire_days' => $expireDays,
], fn($v) => $v !== null));
}
/** 查询链接列表 */
public function listLinks(int $page = 1, int $pageSize = 20,
?string $keyword = null): array {
return $this->request('GET', '/api/link/list', array_filter([
'page' => $page, 'page_size' => $pageSize,
'keyword' => $keyword,
], fn($v) => $v !== null));
}
/** 查询链接详情 */
public function getLinkInfo(?int $id = null, ?string $shortCode = null): array {
return $this->request('GET', '/api/link/info', array_filter([
'id' => $id, 'short_code' => $shortCode,
], fn($v) => $v !== null));
}
/** 更新链接 */
public function updateLink(int $id, ?string $title = null,
?int $status = null): array {
return $this->request('PUT', '/api/link/update', array_filter([
'id' => $id, 'title' => $title, 'status' => $status,
], fn($v) => $v !== null));
}
/** 删除链接 */
public function deleteLink(int $id): array {
return $this->request('DELETE', '/api/link/delete', ['id' => $id]);
}
}
// ===== 使用示例 =====
$sdk = new ShortLinkSDK('sk_your_api_key_here');
// 1. 创建短链接
$result = $sdk->createLink('https://example.com/long-url',
'PHP SDK 测试', 30);
$linkId = $result['data']['id'] ?? null;
echo '创建成功: ' . ($result['data']['short_url'] ?? '') . PHP_EOL;
// 2. 查询列表
$list = $sdk->listLinks(1, 10);
echo '总数: ' . ($list['data']['total'] ?? 0) . PHP_EOL;
// 3. 查询详情
$info = $sdk->getLinkInfo(id: $linkId);
echo '标题: ' . ($info['data']['title'] ?? '') . PHP_EOL;
// 4. 更新
$sdk->updateLink($linkId, title: '新标题', status: 1);
// 5. 删除
$sdk->deleteLink($linkId);
echo '删除完成' . PHP_EOL;
GO
Go
使用 net/http
// Go SDK 示例 — 使用 net/http
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"strconv"
)
const (
apiBase = "http://localhost:3050"
apiKey = "sk_your_api_key_here"
)
type Response struct {
Code int `json:"code"`
Message string `json:"message"`
Data *json.RawMessage `json:"data"`
}
type LinkData struct {
ID int `json:"id"`
ShortCode string `json:"short_code"`
ShortURL string `json:"short_url"`
OriginalURL string `json:"original_url"`
Title string `json:"title"`
VisitCount int `json:"visit_count"`
Status int `json:"status"`
}
type ListData struct {
List []LinkData `json:"list"`
Total int `json:"total"`
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
// SDK 客户端
type ShortLinkClient struct {
baseURL string
apiKey string
client *http.Client
}
func NewClient(baseURL, apiKey string) *ShortLinkClient {
return &ShortLinkClient{
baseURL: baseURL,
apiKey: apiKey,
client: &http.Client{},
}
}
func (c *ShortLinkClient) do(method, path string, body interface{}) (*Response, error) {
var buf bytes.Buffer
if body != nil {
json.NewEncoder(&buf).Encode(body)
}
req, err := http.NewRequest(method, c.baseURL+path, &buf)
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", c.apiKey)
resp, err := c.client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var result Response
data, _ := io.ReadAll(resp.Body)
json.Unmarshal(data, &result)
return &result, nil
}
func (c *ShortLinkClient) CreateLink(url, title string, expireDays int) (*Response, error) {
return c.do("POST", "/api/link/create", map[string]interface{}{
"url": url, "title": title, "expire_days": expireDays,
})
}
func (c *ShortLinkClient) ListLinks(page, pageSize int) (*Response, error) {
return c.do("GET",
fmt.Sprintf("/api/link/list?page=%d&page_size=%d", page, pageSize),
nil)
}
func (c *ShortLinkClient) GetLinkInfo(id int) (*Response, error) {
return c.do("GET",
fmt.Sprintf("/api/link/info?id=%d", id), nil)
}
func (c *ShortLinkClient) UpdateLink(id, status int, title string) (*Response, error) {
return c.do("PUT", "/api/link/update", map[string]interface{}{
"id": id, "title": title, "status": status,
})
}
func (c *ShortLinkClient) DeleteLink(id int) (*Response, error) {
return c.do("DELETE", "/api/link/delete",
map[string]interface{}{"id": id})
}
// ===== 使用示例 =====
func main() {
client := NewClient(apiBase, apiKey)
// 1. 创建短链接
resp, _ := client.CreateLink("https://example.com/long-url",
"Go SDK 测试", 30)
fmt.Printf("创建成功: %+v\n", resp)
// 2. 查询列表
list, _ := client.ListLinks(1, 10)
fmt.Printf("列表: %+v\n", list)
// 3. 删除
client.DeleteLink(1)
fmt.Println("删除完成")
}
链接 API
POST
/api/link/create
创建短链接
创建一条新的短链接,支持普通 URL 和微信小程序链接。
请求参数 (JSON Body)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | 目标链接,普通链接以 http:// 或 https:// 开头,微信小程序链接以 # 开头 |
| short_code | string | 否 | 自定义短码(字母数字组合,最长 16 位),留空自动生成 |
| title | string | 否 | 链接标题/备注 |
| expire_days | number | 否 | 有效期天数(0 或省略表示永不过期) |
响应示例
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"short_code": "abc123",
"short_url": "http://localhost:3050/abc123",
"original_url": "https://example.com/long-url",
"title": "示例链接",
"expire_at": null,
"status": 1,
"qrcode_url": "http://localhost:3050/api/link/qrcode/abc123",
"created_at": "2026-06-11 12:00:00"
}
}
cURL 示例
curl -X POST http://localhost:3050/api/link/create \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_your_api_key_here" \
-d '{
"url": "https://example.com/very/long/url",
"title": "我的链接",
"expire_days": 30
}'
微信小程序链接示例
curl -X POST http://localhost:3050/api/link/create \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_your_api_key_here" \
-d '{
"url": "#小程序://myapp/page?id=123",
"title": "小程序链接"
}'
POST
/api/link/batch-create
批量创建短链接
一次性批量创建最多 1000 条短链接。支持普通 URL 和微信小程序链接。
请求参数 (JSON Body)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| urls | array | 是 | URL 数组,每项为字符串或 {url, title} 对象,最多 1000 条 |
| expire_days | number | 否 | 有效期天数(0 或省略表示永不过期) |
响应示例
{
"code": 0,
"message": "success",
"data": {
"total": 3,
"success_count": 2,
"fail_count": 1,
"results": [
{ "index": 0, "id": 1, "short_code": "abc123", "short_url": "http://localhost:3050/abc123", "original_url": "https://example.com/page1", "title": "" }
],
"errors": [
{ "index": 1, "url": "", "message": "URL 不能为空" }
]
}
}
cURL 示例
curl -X POST http://localhost:3050/api/link/batch-create \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_your_api_key_here" \
-d '{
"urls": [
"https://example.com/page1",
"https://example.com/page2"
],
"expire_days": 30
}'
GET
/api/link/list
批量查询链接列表
分页查询短链接列表,支持关键词搜索和状态筛选。
请求参数 (Query)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | number | 否 | 页码,默认 1 |
| page_size | number | 否 | 每页条数,默认 20,最大 100 |
| keyword | string | 否 | 搜索关键词(匹配 URL / 短码 / 标题) |
| link_type | string | 否 | 筛选链接类型:url(普通链接)、weapp(小程序链接),不传则全部 |
| status | number | 否 | 筛选状态:1=启用,0=禁用 |
| start_date | string | 否 | 开始日期,格式 YYYY-MM-DD |
| end_date | string | 否 | 结束日期,格式 YYYY-MM-DD |
响应示例
{
"code": 0,
"message": "success",
"data": {
"list": [
{
"id": 1,
"short_code": "abc123",
"short_url": "http://localhost:3050/abc123",
"original_url": "https://example.com/page",
"title": "示例",
"visit_count": 42,
"expire_at": null,
"status": 1,
"qrcode_url": "http://localhost:3050/api/link/qrcode/abc123",
"created_at": "2026-06-11 12:00:00",
"updated_at": "2026-06-11 12:00:00"
}
],
"total": 1,
"page": 1,
"pageSize": 20
}
}
cURL 示例
curl -s "http://localhost:3050/api/link/list?page=1&page_size=10&keyword=example" \ -H "X-API-Key: sk_your_api_key_here"
GET
/api/link/info
查询单条链接详情
通过 id 或 short_code 查询单条链接的详细信息。
请求参数 (Query)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | number | 二选一 | 链接 ID |
| short_code | string | 二选一 | 短码 |
cURL 示例
# 按 ID 查询 curl -s "http://localhost:3050/api/link/info?id=1" \ -H "X-API-Key: sk_your_api_key_here" # 按短码查询 curl -s "http://localhost:3050/api/link/info?short_code=abc123" \ -H "X-API-Key: sk_your_api_key_here"
PUT
/api/link/update
修改链接信息
修改链接的目标地址、标题、状态或有效期。
请求参数 (JSON Body)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | number | 是 | 链接 ID |
| url | string | 否 | 新的目标地址 |
| title | string | 否 | 新的标题 |
| status | number | 否 | 1=启用,0=禁用 |
| expire_days | number | 否 | 有效期天数(0=永久) |
cURL 示例
curl -X PUT http://localhost:3050/api/link/update \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_your_api_key_here" \
-d '{
"id": 1,
"title": "新标题",
"status": 0
}'
DELETE
/api/link/delete
删除短链接
删除指定短链接及其关联的访问记录。支持 body 和 query 两种传参方式。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | number | 是 | 链接 ID(可放 body 或 query 中) |
cURL 示例
# 通过 Body 传参
curl -X DELETE http://localhost:3050/api/link/delete \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_your_api_key_here" \
-d '{"id": 1}'
# 通过 Query 传参
curl -X DELETE "http://localhost:3050/api/link/delete?id=1" \
-H "X-API-Key: sk_your_api_key_here"
扩展 API
GET
/api/link/qrcode/:short_code
获取二维码图片
获取指定短链接的二维码图片(PNG 格式),可直接嵌入 <img> 标签或下载。
路径参数
| 参数 | 说明 |
|---|---|
| short_code | 短码 |
cURL 示例
# 保存为文件 curl -o qrcode.png "http://localhost:3050/api/link/qrcode/abc123" \ -H "X-API-Key: sk_your_api_key_here" # 或直接在浏览器中访问 # http://localhost:3050/api/link/qrcode/abc123
GET
/api/link/stats/:id
获取访问统计
获取指定链接的访问统计数据,包括总访问次数、独立 IP 数、每日趋势。
路径参数
| 参数 | 说明 |
|---|---|
| id | 链接 ID |
查询参数
| 参数 | 类型 | 说明 |
|---|---|---|
| start_date | string | 开始日期 YYYY-MM-DD(可选) |
| end_date | string | 结束日期 YYYY-MM-DD(可选) |
响应示例
{
"code": 0,
"message": "success",
"data": {
"total_visits": 100,
"unique_ips": 42,
"daily_stats": [
{ "date": "2026-06-05", "count": 15 },
{ "date": "2026-06-06", "count": 23 }
],
"link": {
"id": 1,
"short_code": "abc123",
"short_url": "http://localhost:3050/abc123",
"original_url": "https://example.com/page",
"visit_count": 100
}
}
}
cURL 示例
curl -s "http://localhost:3050/api/link/stats/1" \ -H "X-API-Key: sk_your_api_key_here"
API 密钥管理
GET
/api/keys
查询所有密钥
获取所有 API 密钥列表(含密钥值)。
curl -s "http://localhost:3050/api/keys" \ -H "X-API-Key: sk_your_api_key_here"
POST
/api/keys
创建新密钥
创建一个新的 API 密钥。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 密钥名称 |
curl -X POST http://localhost:3050/api/keys \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_your_api_key_here" \
-d '{"name": "生产环境"}'
PUT
/api/keys/:id
编辑密钥
修改密钥名称或状态。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 否 | 新名称 |
| status | number | 否 | 1=启用,0=禁用 |
curl -X PUT http://localhost:3050/api/keys/1 \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_your_api_key_here" \
-d '{"name": "新名称", "status": 1}'
DELETE
/api/keys/:id
删除密钥
删除指定 API 密钥,关联调用将立即失效。
curl -X DELETE http://localhost:3050/api/keys/1 \ -H "X-API-Key: sk_your_api_key_here"