@wspc/cli 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +166 -39
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/spec/openapi.json +2225 -799
package/spec/openapi.json
CHANGED
|
@@ -1578,9 +1578,10 @@
|
|
|
1578
1578
|
"provider": {
|
|
1579
1579
|
"type": "string",
|
|
1580
1580
|
"enum": [
|
|
1581
|
-
"cloudflare-email-service"
|
|
1581
|
+
"cloudflare-email-service",
|
|
1582
|
+
"pete-mail"
|
|
1582
1583
|
],
|
|
1583
|
-
"description": "Send provider
|
|
1584
|
+
"description": "Send provider used for this outbound email."
|
|
1584
1585
|
},
|
|
1585
1586
|
"provider_message_id": {
|
|
1586
1587
|
"type": "string",
|
|
@@ -1828,6 +1829,57 @@
|
|
|
1828
1829
|
}
|
|
1829
1830
|
]
|
|
1830
1831
|
},
|
|
1832
|
+
"CreateCommentBody": {
|
|
1833
|
+
"type": "object",
|
|
1834
|
+
"properties": {
|
|
1835
|
+
"content": {
|
|
1836
|
+
"type": "string",
|
|
1837
|
+
"minLength": 1,
|
|
1838
|
+
"maxLength": 10000
|
|
1839
|
+
}
|
|
1840
|
+
},
|
|
1841
|
+
"required": [
|
|
1842
|
+
"content"
|
|
1843
|
+
]
|
|
1844
|
+
},
|
|
1845
|
+
"Comment": {
|
|
1846
|
+
"type": "object",
|
|
1847
|
+
"properties": {
|
|
1848
|
+
"id": {
|
|
1849
|
+
"type": "string"
|
|
1850
|
+
},
|
|
1851
|
+
"todo_id": {
|
|
1852
|
+
"type": "string"
|
|
1853
|
+
},
|
|
1854
|
+
"user_id": {
|
|
1855
|
+
"type": "string"
|
|
1856
|
+
},
|
|
1857
|
+
"org_id": {
|
|
1858
|
+
"type": "string"
|
|
1859
|
+
},
|
|
1860
|
+
"content": {
|
|
1861
|
+
"type": "string"
|
|
1862
|
+
},
|
|
1863
|
+
"created_at": {
|
|
1864
|
+
"type": "integer"
|
|
1865
|
+
},
|
|
1866
|
+
"updated_at": {
|
|
1867
|
+
"type": "integer"
|
|
1868
|
+
},
|
|
1869
|
+
"deleted_at": {
|
|
1870
|
+
"type": "integer"
|
|
1871
|
+
}
|
|
1872
|
+
},
|
|
1873
|
+
"required": [
|
|
1874
|
+
"id",
|
|
1875
|
+
"todo_id",
|
|
1876
|
+
"user_id",
|
|
1877
|
+
"org_id",
|
|
1878
|
+
"content",
|
|
1879
|
+
"created_at",
|
|
1880
|
+
"updated_at"
|
|
1881
|
+
]
|
|
1882
|
+
},
|
|
1831
1883
|
"CreateProjectBody": {
|
|
1832
1884
|
"type": "object",
|
|
1833
1885
|
"properties": {
|
|
@@ -2627,6 +2679,19 @@
|
|
|
2627
2679
|
"descendants_in_trash_count"
|
|
2628
2680
|
]
|
|
2629
2681
|
},
|
|
2682
|
+
"UpdateCommentBody": {
|
|
2683
|
+
"type": "object",
|
|
2684
|
+
"properties": {
|
|
2685
|
+
"content": {
|
|
2686
|
+
"type": "string",
|
|
2687
|
+
"minLength": 1,
|
|
2688
|
+
"maxLength": 10000
|
|
2689
|
+
}
|
|
2690
|
+
},
|
|
2691
|
+
"required": [
|
|
2692
|
+
"content"
|
|
2693
|
+
]
|
|
2694
|
+
},
|
|
2630
2695
|
"UpdateProjectBody": {
|
|
2631
2696
|
"type": "object",
|
|
2632
2697
|
"properties": {
|
|
@@ -2894,11 +2959,6 @@
|
|
|
2894
2959
|
"lang": "bash",
|
|
2895
2960
|
"label": "wspc CLI",
|
|
2896
2961
|
"source": "wspc invite accept inv_01KT43YKZ8CX14WS6ENXQ8397E"
|
|
2897
|
-
},
|
|
2898
|
-
{
|
|
2899
|
-
"lang": "typescript",
|
|
2900
|
-
"label": "@wspc/client",
|
|
2901
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"${EXAMPLE_API_BASE_URL}\" })\nconst org = await auth.acceptInvite(process.env.WSPC_API_KEY!, \"inv_01KT43YKZ8CX14WS6ENXQ8397E\")"
|
|
2902
2962
|
}
|
|
2903
2963
|
],
|
|
2904
2964
|
"parameters": [
|
|
@@ -3290,11 +3350,6 @@
|
|
|
3290
3350
|
"lang": "bash",
|
|
3291
3351
|
"label": "wspc CLI",
|
|
3292
3352
|
"source": "wspc keys create --label \"openclaw-tokyo\""
|
|
3293
|
-
},
|
|
3294
|
-
{
|
|
3295
|
-
"lang": "typescript",
|
|
3296
|
-
"label": "@wspc/client",
|
|
3297
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nconst { api_key } = await auth.createKey(process.env.WSPC_API_KEY!, { label: \"Claude\" })"
|
|
3298
3353
|
}
|
|
3299
3354
|
],
|
|
3300
3355
|
"requestBody": {
|
|
@@ -3685,11 +3740,6 @@
|
|
|
3685
3740
|
"lang": "bash",
|
|
3686
3741
|
"label": "wspc CLI",
|
|
3687
3742
|
"source": "wspc keys ls"
|
|
3688
|
-
},
|
|
3689
|
-
{
|
|
3690
|
-
"lang": "typescript",
|
|
3691
|
-
"label": "@wspc/client",
|
|
3692
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nconst { keys } = await auth.listKeys(process.env.WSPC_API_KEY!)"
|
|
3693
3743
|
}
|
|
3694
3744
|
],
|
|
3695
3745
|
"responses": {
|
|
@@ -4068,11 +4118,6 @@
|
|
|
4068
4118
|
"lang": "bash",
|
|
4069
4119
|
"label": "wspc CLI",
|
|
4070
4120
|
"source": "wspc org invite bob@example.com"
|
|
4071
|
-
},
|
|
4072
|
-
{
|
|
4073
|
-
"lang": "typescript",
|
|
4074
|
-
"label": "@wspc/client",
|
|
4075
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"${EXAMPLE_API_BASE_URL}\" })\nawait auth.createOrgInvite(process.env.WSPC_API_KEY!, \"bob@example.com\")"
|
|
4076
4121
|
}
|
|
4077
4122
|
],
|
|
4078
4123
|
"requestBody": {
|
|
@@ -4459,11 +4504,6 @@
|
|
|
4459
4504
|
"lang": "bash",
|
|
4460
4505
|
"label": "wspc CLI",
|
|
4461
4506
|
"source": "wspc org invites"
|
|
4462
|
-
},
|
|
4463
|
-
{
|
|
4464
|
-
"lang": "typescript",
|
|
4465
|
-
"label": "@wspc/client",
|
|
4466
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"${EXAMPLE_API_BASE_URL}\" })\nconst { invites } = await auth.listOrgInvites(process.env.WSPC_API_KEY!)"
|
|
4467
4507
|
}
|
|
4468
4508
|
],
|
|
4469
4509
|
"responses": {
|
|
@@ -4822,11 +4862,6 @@
|
|
|
4822
4862
|
"lang": "bash",
|
|
4823
4863
|
"label": "wspc CLI",
|
|
4824
4864
|
"source": "# No direct CLI command — OAuth is consumed by third-party clients"
|
|
4825
|
-
},
|
|
4826
|
-
{
|
|
4827
|
-
"lang": "typescript",
|
|
4828
|
-
"label": "@wspc/client",
|
|
4829
|
-
"source": "// TODO: client method pending\n// Expected shape:\n// const dev = await fetch(\"https://api.wspc.ai/auth/oauth/device\", {\n// method: \"POST\",\n// headers: { \"Content-Type\": \"application/json\" },\n// body: JSON.stringify({ client_id: \"oac_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\" }),\n// }).then(r => r.json())"
|
|
4830
4865
|
}
|
|
4831
4866
|
],
|
|
4832
4867
|
"requestBody": {
|
|
@@ -5070,11 +5105,6 @@
|
|
|
5070
5105
|
"lang": "bash",
|
|
5071
5106
|
"label": "wspc CLI",
|
|
5072
5107
|
"source": "wspc org show"
|
|
5073
|
-
},
|
|
5074
|
-
{
|
|
5075
|
-
"lang": "typescript",
|
|
5076
|
-
"label": "@wspc/client",
|
|
5077
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nconst org = await auth.getOrg(process.env.WSPC_API_KEY!)"
|
|
5078
5108
|
}
|
|
5079
5109
|
],
|
|
5080
5110
|
"responses": {
|
|
@@ -5457,11 +5487,6 @@
|
|
|
5457
5487
|
"lang": "bash",
|
|
5458
5488
|
"label": "wspc CLI",
|
|
5459
5489
|
"source": "wspc org rename \"New Name\""
|
|
5460
|
-
},
|
|
5461
|
-
{
|
|
5462
|
-
"lang": "typescript",
|
|
5463
|
-
"label": "@wspc/client",
|
|
5464
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nconst org = await auth.updateOrg(process.env.WSPC_API_KEY!, \"New Name\")"
|
|
5465
5490
|
}
|
|
5466
5491
|
],
|
|
5467
5492
|
"requestBody": {
|
|
@@ -5839,11 +5864,6 @@
|
|
|
5839
5864
|
"lang": "bash",
|
|
5840
5865
|
"label": "wspc CLI",
|
|
5841
5866
|
"source": "wspc invite show inv_01KT43YKZ8CX14WS6ENXQ8397E"
|
|
5842
|
-
},
|
|
5843
|
-
{
|
|
5844
|
-
"lang": "typescript",
|
|
5845
|
-
"label": "@wspc/client",
|
|
5846
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"${EXAMPLE_API_BASE_URL}\" })\nconst invite = await auth.getMyInvite(process.env.WSPC_API_KEY!, \"inv_01KT43YKZ8CX14WS6ENXQ8397E\")"
|
|
5847
5867
|
}
|
|
5848
5868
|
],
|
|
5849
5869
|
"parameters": [
|
|
@@ -6238,11 +6258,6 @@
|
|
|
6238
6258
|
"lang": "bash",
|
|
6239
6259
|
"label": "wspc CLI",
|
|
6240
6260
|
"source": "wspc verify # checks the active env API key\nwspc verify --json # JSON output"
|
|
6241
|
-
},
|
|
6242
|
-
{
|
|
6243
|
-
"lang": "typescript",
|
|
6244
|
-
"label": "@wspc/client",
|
|
6245
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nconst me = await auth.getMe(process.env.WSPC_API_KEY!)"
|
|
6246
6261
|
}
|
|
6247
6262
|
],
|
|
6248
6263
|
"responses": {
|
|
@@ -6641,11 +6656,6 @@
|
|
|
6641
6656
|
"lang": "bash",
|
|
6642
6657
|
"label": "wspc CLI",
|
|
6643
6658
|
"source": "wspc invites"
|
|
6644
|
-
},
|
|
6645
|
-
{
|
|
6646
|
-
"lang": "typescript",
|
|
6647
|
-
"label": "@wspc/client",
|
|
6648
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"${EXAMPLE_API_BASE_URL}\" })\nconst { invites } = await auth.listMyInvites(process.env.WSPC_API_KEY!)"
|
|
6649
6659
|
}
|
|
6650
6660
|
],
|
|
6651
6661
|
"responses": {
|
|
@@ -7025,11 +7035,6 @@
|
|
|
7025
7035
|
"lang": "bash",
|
|
7026
7036
|
"label": "wspc CLI",
|
|
7027
7037
|
"source": "wspc org members ls"
|
|
7028
|
-
},
|
|
7029
|
-
{
|
|
7030
|
-
"lang": "typescript",
|
|
7031
|
-
"label": "@wspc/client",
|
|
7032
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nconst { members } = await auth.listOrgMembers(process.env.WSPC_API_KEY!)"
|
|
7033
7038
|
}
|
|
7034
7039
|
],
|
|
7035
7040
|
"parameters": [
|
|
@@ -7413,11 +7418,6 @@
|
|
|
7413
7418
|
"lang": "bash",
|
|
7414
7419
|
"label": "wspc CLI",
|
|
7415
7420
|
"source": "# No direct CLI command — OAuth is consumed by third-party clients"
|
|
7416
|
-
},
|
|
7417
|
-
{
|
|
7418
|
-
"lang": "typescript",
|
|
7419
|
-
"label": "@wspc/client",
|
|
7420
|
-
"source": "// TODO: client method pending\n// Expected shape:\n// const meta = await fetch(\"https://api.wspc.ai/.well-known/oauth-authorization-server\").then(r => r.json())"
|
|
7421
7421
|
}
|
|
7422
7422
|
],
|
|
7423
7423
|
"responses": {
|
|
@@ -7802,11 +7802,6 @@
|
|
|
7802
7802
|
"lang": "shell",
|
|
7803
7803
|
"label": "curl",
|
|
7804
7804
|
"source": "curl https://api.wspc.ai/.well-known/openid-configuration"
|
|
7805
|
-
},
|
|
7806
|
-
{
|
|
7807
|
-
"lang": "typescript",
|
|
7808
|
-
"label": "@wspc/client",
|
|
7809
|
-
"source": "// TODO: client method pending\n// Expected shape (identical to /.well-known/oauth-authorization-server):\n// const meta = await fetch(\"https://api.wspc.ai/.well-known/openid-configuration\").then(r => r.json())"
|
|
7810
7805
|
}
|
|
7811
7806
|
],
|
|
7812
7807
|
"responses": {
|
|
@@ -8165,11 +8160,6 @@
|
|
|
8165
8160
|
"lang": "bash",
|
|
8166
8161
|
"label": "wspc CLI",
|
|
8167
8162
|
"source": "# No direct CLI command — OAuth is consumed by third-party clients"
|
|
8168
|
-
},
|
|
8169
|
-
{
|
|
8170
|
-
"lang": "typescript",
|
|
8171
|
-
"label": "@wspc/client",
|
|
8172
|
-
"source": "// TODO: client method pending\n// Expected shape:\n// const reg = await fetch(\"https://api.wspc.ai/auth/oauth/register\", {\n// method: \"POST\",\n// headers: { \"Content-Type\": \"application/json\" },\n// body: JSON.stringify({ client_name: \"Acme MCP Agent\", redirect_uris: [\"http://localhost:3000/callback\"] }),\n// }).then(r => r.json())"
|
|
8173
8163
|
}
|
|
8174
8164
|
],
|
|
8175
8165
|
"requestBody": {
|
|
@@ -8407,11 +8397,6 @@
|
|
|
8407
8397
|
"lang": "bash",
|
|
8408
8398
|
"label": "wspc CLI",
|
|
8409
8399
|
"source": "wspc invite reject inv_01KT43YKZ8CX14WS6ENXQ8397E"
|
|
8410
|
-
},
|
|
8411
|
-
{
|
|
8412
|
-
"lang": "typescript",
|
|
8413
|
-
"label": "@wspc/client",
|
|
8414
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"${EXAMPLE_API_BASE_URL}\" })\nawait auth.rejectInvite(process.env.WSPC_API_KEY!, \"inv_01KT43YKZ8CX14WS6ENXQ8397E\")"
|
|
8415
8400
|
}
|
|
8416
8401
|
],
|
|
8417
8402
|
"parameters": [
|
|
@@ -8774,11 +8759,6 @@
|
|
|
8774
8759
|
"lang": "shell",
|
|
8775
8760
|
"label": "curl",
|
|
8776
8761
|
"source": "curl -X DELETE https://api.wspc.ai/auth/me/org/members/usr_member \\\n -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
8777
|
-
},
|
|
8778
|
-
{
|
|
8779
|
-
"lang": "typescript",
|
|
8780
|
-
"label": "@wspc/client",
|
|
8781
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nawait auth.removeOrgMember(process.env.WSPC_API_KEY!, \"usr_member\")"
|
|
8782
8762
|
}
|
|
8783
8763
|
],
|
|
8784
8764
|
"parameters": [
|
|
@@ -9143,11 +9123,6 @@
|
|
|
9143
9123
|
"lang": "bash",
|
|
9144
9124
|
"label": "wspc CLI",
|
|
9145
9125
|
"source": "wspc login # prompts for email, then for the magic code"
|
|
9146
|
-
},
|
|
9147
|
-
{
|
|
9148
|
-
"lang": "typescript",
|
|
9149
|
-
"label": "@wspc/client",
|
|
9150
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nawait auth.requestCode(\"alice@example.com\")"
|
|
9151
9126
|
}
|
|
9152
9127
|
],
|
|
9153
9128
|
"requestBody": {
|
|
@@ -9542,11 +9517,6 @@
|
|
|
9542
9517
|
"lang": "bash",
|
|
9543
9518
|
"label": "wspc CLI",
|
|
9544
9519
|
"source": "wspc keys rm key_abcd1234efgh5678"
|
|
9545
|
-
},
|
|
9546
|
-
{
|
|
9547
|
-
"lang": "typescript",
|
|
9548
|
-
"label": "@wspc/client",
|
|
9549
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nawait auth.revokeKey(process.env.WSPC_API_KEY!, \"key_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\")"
|
|
9550
9520
|
}
|
|
9551
9521
|
],
|
|
9552
9522
|
"parameters": [
|
|
@@ -9925,11 +9895,6 @@
|
|
|
9925
9895
|
"lang": "bash",
|
|
9926
9896
|
"label": "wspc CLI",
|
|
9927
9897
|
"source": "wspc keys edit key_01HW3K4N9V5G6Z8C2Q7B1Y0M3F --label \"New Label\""
|
|
9928
|
-
},
|
|
9929
|
-
{
|
|
9930
|
-
"lang": "typescript",
|
|
9931
|
-
"label": "@wspc/client",
|
|
9932
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nawait auth.updateApiKeyLabel(process.env.WSPC_API_KEY!, \"key_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", \"New Label\")"
|
|
9933
9898
|
}
|
|
9934
9899
|
],
|
|
9935
9900
|
"parameters": [
|
|
@@ -10310,11 +10275,6 @@
|
|
|
10310
10275
|
"lang": "bash",
|
|
10311
10276
|
"label": "wspc CLI",
|
|
10312
10277
|
"source": "# No direct CLI command — OAuth is consumed by third-party clients"
|
|
10313
|
-
},
|
|
10314
|
-
{
|
|
10315
|
-
"lang": "typescript",
|
|
10316
|
-
"label": "@wspc/client",
|
|
10317
|
-
"source": "// TODO: client method pending\n// Expected shape:\n// await fetch(\"https://api.wspc.ai/auth/oauth/revoke\", {\n// method: \"POST\",\n// headers: { \"Content-Type\": \"application/json\" },\n// body: JSON.stringify({ token: \"rt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", token_type_hint: \"refresh_token\" }),\n// })"
|
|
10318
10278
|
}
|
|
10319
10279
|
],
|
|
10320
10280
|
"requestBody": {
|
|
@@ -10535,11 +10495,6 @@
|
|
|
10535
10495
|
"lang": "bash",
|
|
10536
10496
|
"label": "wspc CLI",
|
|
10537
10497
|
"source": "wspc org invite revoke inv_01KT43YKZ8CX14WS6ENXQ8397E"
|
|
10538
|
-
},
|
|
10539
|
-
{
|
|
10540
|
-
"lang": "typescript",
|
|
10541
|
-
"label": "@wspc/client",
|
|
10542
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"${EXAMPLE_API_BASE_URL}\" })\nawait auth.revokeOrgInvite(process.env.WSPC_API_KEY!, \"inv_01KT43YKZ8CX14WS6ENXQ8397E\")"
|
|
10543
10498
|
}
|
|
10544
10499
|
],
|
|
10545
10500
|
"parameters": [
|
|
@@ -10903,11 +10858,6 @@
|
|
|
10903
10858
|
"lang": "bash",
|
|
10904
10859
|
"label": "wspc CLI",
|
|
10905
10860
|
"source": "# No direct CLI command — OAuth is consumed by third-party clients"
|
|
10906
|
-
},
|
|
10907
|
-
{
|
|
10908
|
-
"lang": "typescript",
|
|
10909
|
-
"label": "@wspc/client",
|
|
10910
|
-
"source": "// TODO: client method pending\n// Expected shape:\n// const tok = await fetch(\"https://api.wspc.ai/auth/oauth/token\", {\n// method: \"POST\",\n// headers: { \"Content-Type\": \"application/json\" },\n// body: JSON.stringify({\n// grant_type: \"refresh_token\",\n// refresh_token: \"rt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\",\n// client_id: \"oac_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\",\n// }),\n// }).then(r => r.json())"
|
|
10911
10861
|
}
|
|
10912
10862
|
],
|
|
10913
10863
|
"requestBody": {
|
|
@@ -11137,11 +11087,6 @@
|
|
|
11137
11087
|
"lang": "bash",
|
|
11138
11088
|
"label": "wspc CLI",
|
|
11139
11089
|
"source": "wspc login # prompts for the code after request-code"
|
|
11140
|
-
},
|
|
11141
|
-
{
|
|
11142
|
-
"lang": "typescript",
|
|
11143
|
-
"label": "@wspc/client",
|
|
11144
|
-
"source": "import { AuthClient } from \"@wspc/client\"\nconst auth = new AuthClient({ baseUrl: \"https://api.wspc.ai\" })\nconst { api_key } = await auth.verifyCode(\"alice@example.com\", \"123456\")"
|
|
11145
11090
|
}
|
|
11146
11091
|
],
|
|
11147
11092
|
"requestBody": {
|
|
@@ -11583,11 +11528,6 @@
|
|
|
11583
11528
|
"lang": "bash",
|
|
11584
11529
|
"label": "wspc CLI",
|
|
11585
11530
|
"source": "wspc event add \"Lunch with Alice\" \\\n --start \"tomorrow 12:30pm\" --end \"tomorrow 1:30pm\" \\\n --location \"Taipei HQ\" \\\n --attendee \"Alice <alice@example.com>\""
|
|
11586
|
-
},
|
|
11587
|
-
{
|
|
11588
|
-
"lang": "typescript",
|
|
11589
|
-
"label": "@wspc/client",
|
|
11590
|
-
"source": "import { CalendarClient } from \"@wspc/client\"\nconst calendar = new CalendarClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait calendar.create({\n title: \"Lunch with Alice\",\n start: \"2026-06-01T12:30:00+08:00\",\n end: \"2026-06-01T13:30:00+08:00\",\n attendees: [{ email: \"alice@example.com\", display_name: \"Alice\" }],\n})"
|
|
11591
11531
|
}
|
|
11592
11532
|
],
|
|
11593
11533
|
"requestBody": {
|
|
@@ -12066,11 +12006,6 @@
|
|
|
12066
12006
|
"lang": "bash",
|
|
12067
12007
|
"label": "wspc CLI",
|
|
12068
12008
|
"source": "wspc event ls --from \"next Monday\" --to \"next Friday\""
|
|
12069
|
-
},
|
|
12070
|
-
{
|
|
12071
|
-
"lang": "typescript",
|
|
12072
|
-
"label": "@wspc/client",
|
|
12073
|
-
"source": "import { CalendarClient } from \"@wspc/client\"\nconst calendar = new CalendarClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait calendar.list({ start_from: \"2026-06-01T00:00:00+08:00\", start_to: \"2026-06-30T23:59:59+08:00\" })"
|
|
12074
12009
|
}
|
|
12075
12010
|
],
|
|
12076
12011
|
"parameters": [
|
|
@@ -12591,11 +12526,6 @@
|
|
|
12591
12526
|
"lang": "bash",
|
|
12592
12527
|
"label": "wspc CLI",
|
|
12593
12528
|
"source": "wspc event rm evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
12594
|
-
},
|
|
12595
|
-
{
|
|
12596
|
-
"lang": "typescript",
|
|
12597
|
-
"label": "@wspc/client",
|
|
12598
|
-
"source": "import { CalendarClient } from \"@wspc/client\"\nconst calendar = new CalendarClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait calendar.delete(\"evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\")"
|
|
12599
12529
|
}
|
|
12600
12530
|
],
|
|
12601
12531
|
"parameters": [
|
|
@@ -13021,11 +12951,6 @@
|
|
|
13021
12951
|
"lang": "bash",
|
|
13022
12952
|
"label": "wspc CLI",
|
|
13023
12953
|
"source": "wspc event show evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
13024
|
-
},
|
|
13025
|
-
{
|
|
13026
|
-
"lang": "typescript",
|
|
13027
|
-
"label": "@wspc/client",
|
|
13028
|
-
"source": "import { CalendarClient } from \"@wspc/client\"\nconst calendar = new CalendarClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait calendar.get(\"evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\")"
|
|
13029
12954
|
}
|
|
13030
12955
|
],
|
|
13031
12956
|
"parameters": [
|
|
@@ -13476,11 +13401,6 @@
|
|
|
13476
13401
|
"lang": "bash",
|
|
13477
13402
|
"label": "wspc CLI",
|
|
13478
13403
|
"source": "wspc event set evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F \\\n --start \"tomorrow 1pm\" --end \"tomorrow 2pm\""
|
|
13479
|
-
},
|
|
13480
|
-
{
|
|
13481
|
-
"lang": "typescript",
|
|
13482
|
-
"label": "@wspc/client",
|
|
13483
|
-
"source": "import { CalendarClient } from \"@wspc/client\"\nconst calendar = new CalendarClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait calendar.update(\"evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", {\n start: \"2026-06-01T13:00:00+08:00\",\n end: \"2026-06-01T14:00:00+08:00\",\n})"
|
|
13484
13404
|
}
|
|
13485
13405
|
],
|
|
13486
13406
|
"parameters": [
|
|
@@ -13937,11 +13857,6 @@
|
|
|
13937
13857
|
"lang": "bash",
|
|
13938
13858
|
"label": "wspc CLI",
|
|
13939
13859
|
"source": "wspc event ics evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F > event.ics"
|
|
13940
|
-
},
|
|
13941
|
-
{
|
|
13942
|
-
"lang": "typescript",
|
|
13943
|
-
"label": "@wspc/client",
|
|
13944
|
-
"source": "import { CalendarClient } from \"@wspc/client\"\nconst calendar = new CalendarClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nconst ics = await calendar.getIcs(\"evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\")"
|
|
13945
13860
|
}
|
|
13946
13861
|
],
|
|
13947
13862
|
"parameters": [
|
|
@@ -14315,11 +14230,6 @@
|
|
|
14315
14230
|
"lang": "shell",
|
|
14316
14231
|
"label": "curl",
|
|
14317
14232
|
"source": "curl -X POST https://api.wspc.ai/calendar/events/evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F/restore \\\n -H \"Authorization: Bearer $WSPC_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{}'"
|
|
14318
|
-
},
|
|
14319
|
-
{
|
|
14320
|
-
"lang": "typescript",
|
|
14321
|
-
"label": "@wspc/client",
|
|
14322
|
-
"source": "import { CalendarClient } from \"@wspc/client\"\nconst calendar = new CalendarClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait calendar.restore(\"evt_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\")"
|
|
14323
14233
|
}
|
|
14324
14234
|
],
|
|
14325
14235
|
"parameters": [
|
|
@@ -14755,11 +14665,6 @@
|
|
|
14755
14665
|
"lang": "bash",
|
|
14756
14666
|
"label": "wspc CLI",
|
|
14757
14667
|
"source": "wspc email alias create alice-shop@wspc.app"
|
|
14758
|
-
},
|
|
14759
|
-
{
|
|
14760
|
-
"lang": "typescript",
|
|
14761
|
-
"label": "@wspc/client",
|
|
14762
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.aliasCreate({ email: \"alice-shop@wspc.app\" })"
|
|
14763
14668
|
}
|
|
14764
14669
|
],
|
|
14765
14670
|
"requestBody": {
|
|
@@ -15042,11 +14947,6 @@
|
|
|
15042
14947
|
"lang": "bash",
|
|
15043
14948
|
"label": "wspc CLI",
|
|
15044
14949
|
"source": "wspc email alias ls"
|
|
15045
|
-
},
|
|
15046
|
-
{
|
|
15047
|
-
"lang": "typescript",
|
|
15048
|
-
"label": "@wspc/client",
|
|
15049
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.aliasList()"
|
|
15050
14950
|
}
|
|
15051
14951
|
],
|
|
15052
14952
|
"parameters": [
|
|
@@ -15310,11 +15210,6 @@
|
|
|
15310
15210
|
"lang": "bash",
|
|
15311
15211
|
"label": "wspc CLI",
|
|
15312
15212
|
"source": "wspc email alias rm alice-shop@wspc.app"
|
|
15313
|
-
},
|
|
15314
|
-
{
|
|
15315
|
-
"lang": "typescript",
|
|
15316
|
-
"label": "@wspc/client",
|
|
15317
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.aliasDelete(\"alice-shop@wspc.app\")"
|
|
15318
15213
|
}
|
|
15319
15214
|
],
|
|
15320
15215
|
"parameters": [
|
|
@@ -15548,11 +15443,6 @@
|
|
|
15548
15443
|
"lang": "bash",
|
|
15549
15444
|
"label": "wspc CLI",
|
|
15550
15445
|
"source": "wspc email rm eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3G"
|
|
15551
|
-
},
|
|
15552
|
-
{
|
|
15553
|
-
"lang": "typescript",
|
|
15554
|
-
"label": "@wspc/client",
|
|
15555
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.deleteMany([\"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", \"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3G\"])"
|
|
15556
15446
|
}
|
|
15557
15447
|
],
|
|
15558
15448
|
"requestBody": {
|
|
@@ -15828,11 +15718,6 @@
|
|
|
15828
15718
|
"lang": "bash",
|
|
15829
15719
|
"label": "wspc CLI",
|
|
15830
15720
|
"source": "wspc email attachment eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F 0 --output invoice.pdf"
|
|
15831
|
-
},
|
|
15832
|
-
{
|
|
15833
|
-
"lang": "typescript",
|
|
15834
|
-
"label": "@wspc/client",
|
|
15835
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nconst { bytes, filename, mime_type } = await email.attachment(\"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", 0)"
|
|
15836
15721
|
}
|
|
15837
15722
|
],
|
|
15838
15723
|
"parameters": [
|
|
@@ -16093,11 +15978,6 @@
|
|
|
16093
15978
|
"lang": "bash",
|
|
16094
15979
|
"label": "wspc CLI",
|
|
16095
15980
|
"source": "wspc email show eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
16096
|
-
},
|
|
16097
|
-
{
|
|
16098
|
-
"lang": "typescript",
|
|
16099
|
-
"label": "@wspc/client",
|
|
16100
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.get(\"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", { include_html: true })"
|
|
16101
15981
|
}
|
|
16102
15982
|
],
|
|
16103
15983
|
"parameters": [
|
|
@@ -16611,11 +16491,6 @@
|
|
|
16611
16491
|
"lang": "bash",
|
|
16612
16492
|
"label": "wspc CLI",
|
|
16613
16493
|
"source": "wspc email ls --unread --limit 20"
|
|
16614
|
-
},
|
|
16615
|
-
{
|
|
16616
|
-
"lang": "typescript",
|
|
16617
|
-
"label": "@wspc/client",
|
|
16618
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.list({ unread_only: true, limit: 20 })"
|
|
16619
16494
|
}
|
|
16620
16495
|
],
|
|
16621
16496
|
"parameters": [
|
|
@@ -17046,11 +16921,6 @@
|
|
|
17046
16921
|
"lang": "bash",
|
|
17047
16922
|
"label": "wspc CLI",
|
|
17048
16923
|
"source": "wspc email read eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3G"
|
|
17049
|
-
},
|
|
17050
|
-
{
|
|
17051
|
-
"lang": "typescript",
|
|
17052
|
-
"label": "@wspc/client",
|
|
17053
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.markRead([\"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", \"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3G\"])"
|
|
17054
16924
|
}
|
|
17055
16925
|
],
|
|
17056
16926
|
"requestBody": {
|
|
@@ -17338,11 +17208,6 @@
|
|
|
17338
17208
|
"lang": "bash",
|
|
17339
17209
|
"label": "wspc CLI",
|
|
17340
17210
|
"source": "wspc email unread eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
17341
|
-
},
|
|
17342
|
-
{
|
|
17343
|
-
"lang": "typescript",
|
|
17344
|
-
"label": "@wspc/client",
|
|
17345
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.markUnread([\"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\"])"
|
|
17346
17211
|
}
|
|
17347
17212
|
],
|
|
17348
17213
|
"requestBody": {
|
|
@@ -17613,11 +17478,6 @@
|
|
|
17613
17478
|
"lang": "shell",
|
|
17614
17479
|
"label": "curl",
|
|
17615
17480
|
"source": "curl -X POST https://api.wspc.ai/email/aliases/alice-shop%40wspc.app/restore \\\n -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
17616
|
-
},
|
|
17617
|
-
{
|
|
17618
|
-
"lang": "typescript",
|
|
17619
|
-
"label": "@wspc/client",
|
|
17620
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.aliasRestore(\"alice-shop@wspc.app\")"
|
|
17621
17481
|
}
|
|
17622
17482
|
],
|
|
17623
17483
|
"parameters": [
|
|
@@ -17819,11 +17679,6 @@
|
|
|
17819
17679
|
"lang": "shell",
|
|
17820
17680
|
"label": "curl",
|
|
17821
17681
|
"source": "curl -X POST https://api.wspc.ai/email/messages/restore \\\n -H \"Authorization: Bearer $WSPC_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"ids\":[\"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\"]}'"
|
|
17822
|
-
},
|
|
17823
|
-
{
|
|
17824
|
-
"lang": "typescript",
|
|
17825
|
-
"label": "@wspc/client",
|
|
17826
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.restoreMany([\"eml_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\"])"
|
|
17827
17682
|
}
|
|
17828
17683
|
],
|
|
17829
17684
|
"requestBody": {
|
|
@@ -18079,7 +17934,7 @@
|
|
|
18079
17934
|
"Emails"
|
|
18080
17935
|
],
|
|
18081
17936
|
"summary": "Send an outbound email",
|
|
18082
|
-
"description": "### Overview\nSubmits a single outbound email for delivery from one of the caller's active aliases. All details, including attachments (inline base64 blobs or references to existing inbound attachments), are verified
|
|
17937
|
+
"description": "### Overview\nSubmits a single outbound email for delivery from one of the caller's active aliases. All details, including attachments (inline base64 blobs or references to existing inbound attachments), are verified before sending. Platform-domain aliases use Cloudflare Email Service; verified custom-domain aliases use pete-mail.\n\n### When to Use\n- Use this endpoint to send new standalone emails or to reply to threaded inbound messages.\n- Use this in automated agent pipelines (like calendar invite generation or notifications) and CLI email send utilities.\n\n### Constraints\n- Requires a valid Bearer token in the `Authorization` header.\n- **Size Limits**: Individual attachments must not exceed 5 MiB, and the total size of all attachments per send must be 25 MiB or less.\n- **Security**: Up to 10 attachments are allowed. Outbound files with dangerous executable extensions (such as `.exe`, `.bat`, `.com`, `.scr`, `.cmd`, `.jar`, `.js`) are strictly blocked.\n- **Daily Quotas**: Sending is protected by per-user (100 sends/day) and per-alias (50 sends/day) daily quotas. Exceeding them triggers `RATE_LIMITED` or `QUOTA_EXCEEDED` errors.\n- **Custom Domains**: Platform-domain aliases use Cloudflare Email Service. Verified custom-domain aliases are routed through pete-mail. Custom domains must have `status = verified` and `sending_status = verified` or the send returns `CUSTOM_DOMAIN_NOT_READY`.\n- **Idempotency**: A stable `idempotency_key` (1-200 characters) must be supplied. Retrying a send with identical content and the same key returns `idempotent_replay: true` without sending duplicates. Reusing the key with changed content returns 409 `IDEMPOTENCY_KEY_REUSED`.\n\n### Troubleshooting\n- **401 Unauthorized**: Active Bearer token is invalid or has expired.\n- **404 Not Found**: The requested `from_alias_email` does not exist or has been soft-deleted, or the referenced `in_reply_to_email_id` is missing or belongs to a different user.\n- **409 Conflict / IDEMPOTENCY_KEY_REUSED**: An identical `idempotency_key` was reused with modified request payload. Use a fresh unique key.\n- **409 Conflict / CUSTOM_DOMAIN_NOT_READY**: The sender uses a custom domain that has not completed outbound sending verification.\n- **429 Too Many Requests / RATE_LIMITED**: The per-user rate limit or daily sending quota has been exceeded. Wait for quota reset.\n- **502 Bad Gateway**: The upstream outbound provider failed or rejected the message. The outbound row is persisted with `status: failed` along with provider-returned logs.",
|
|
18083
17938
|
"security": [
|
|
18084
17939
|
{
|
|
18085
17940
|
"bearerAuth": []
|
|
@@ -18099,11 +17954,6 @@
|
|
|
18099
17954
|
"lang": "bash",
|
|
18100
17955
|
"label": "wspc CLI",
|
|
18101
17956
|
"source": "wspc email send \\\n --from alice-shop@wspc.app \\\n --to alice@example.com \\\n --subject \"Welcome to WSPC\" \\\n --text \"Hi Alice — welcome aboard.\" \\\n --attach ./report.pdf \\\n --idempotency-key retry-20260601-001"
|
|
18102
|
-
},
|
|
18103
|
-
{
|
|
18104
|
-
"lang": "typescript",
|
|
18105
|
-
"label": "@wspc/client",
|
|
18106
|
-
"source": "import { EmailClient } from \"@wspc/client\"\nconst email = new EmailClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait email.send({\n from_alias_email: \"alice-shop@wspc.app\",\n to: [\"alice@example.com\"],\n subject: \"Welcome to WSPC\",\n text: \"Hi Alice — welcome aboard.\",\n idempotency_key: \"retry-20260601-001\",\n})"
|
|
18107
17957
|
}
|
|
18108
17958
|
],
|
|
18109
17959
|
"requestBody": {
|
|
@@ -18342,7 +18192,7 @@
|
|
|
18342
18192
|
}
|
|
18343
18193
|
},
|
|
18344
18194
|
"409": {
|
|
18345
|
-
"description": "
|
|
18195
|
+
"description": "Either an earlier send under this `idempotency_key` had different content, or the sender custom domain has not completed outbound sending verification.",
|
|
18346
18196
|
"content": {
|
|
18347
18197
|
"application/json": {
|
|
18348
18198
|
"schema": {
|
|
@@ -18514,11 +18364,6 @@
|
|
|
18514
18364
|
"lang": "bash",
|
|
18515
18365
|
"label": "wspc CLI",
|
|
18516
18366
|
"source": "wspc push config rm telegram"
|
|
18517
|
-
},
|
|
18518
|
-
{
|
|
18519
|
-
"lang": "typescript",
|
|
18520
|
-
"label": "@wspc/client",
|
|
18521
|
-
"source": "import { PushClient } from \"@wspc/client\"\nconst push = new PushClient({ baseUrl: \"https://push.wspc.app\", apiKey: process.env.WSPC_API_KEY! })\nawait push.configDelete(\"telegram\")"
|
|
18522
18367
|
}
|
|
18523
18368
|
],
|
|
18524
18369
|
"x-cli": {
|
|
@@ -18787,11 +18632,6 @@
|
|
|
18787
18632
|
"lang": "bash",
|
|
18788
18633
|
"label": "wspc CLI",
|
|
18789
18634
|
"source": "wspc push config set --transport telegram --target-bot @your_agent_bot"
|
|
18790
|
-
},
|
|
18791
|
-
{
|
|
18792
|
-
"lang": "typescript",
|
|
18793
|
-
"label": "@wspc/client",
|
|
18794
|
-
"source": "import { PushClient } from \"@wspc/client\"\nconst push = new PushClient({ baseUrl: \"https://push.wspc.app\", apiKey: process.env.WSPC_API_KEY! })\nawait push.configSet({ transport: \"telegram\", target_bot_username: \"@your_agent_bot\" })"
|
|
18795
18635
|
}
|
|
18796
18636
|
],
|
|
18797
18637
|
"x-cli": {
|
|
@@ -19103,11 +18943,6 @@
|
|
|
19103
18943
|
"lang": "bash",
|
|
19104
18944
|
"label": "wspc CLI",
|
|
19105
18945
|
"source": "wspc push config show"
|
|
19106
|
-
},
|
|
19107
|
-
{
|
|
19108
|
-
"lang": "typescript",
|
|
19109
|
-
"label": "@wspc/client",
|
|
19110
|
-
"source": "import { PushClient } from \"@wspc/client\"\nconst push = new PushClient({ baseUrl: \"https://push.wspc.app\", apiKey: process.env.WSPC_API_KEY! })\nconst { configs } = await push.configList()"
|
|
19111
18946
|
}
|
|
19112
18947
|
],
|
|
19113
18948
|
"x-cli": {
|
|
@@ -19393,11 +19228,6 @@
|
|
|
19393
19228
|
"lang": "bash",
|
|
19394
19229
|
"label": "wspc CLI",
|
|
19395
19230
|
"source": "wspc push test"
|
|
19396
|
-
},
|
|
19397
|
-
{
|
|
19398
|
-
"lang": "typescript",
|
|
19399
|
-
"label": "@wspc/client",
|
|
19400
|
-
"source": "import { PushClient } from \"@wspc/client\"\nconst push = new PushClient({ baseUrl: \"https://push.wspc.app\", apiKey: process.env.WSPC_API_KEY! })\nconst result = await push.test(\"telegram\")"
|
|
19401
19231
|
}
|
|
19402
19232
|
],
|
|
19403
19233
|
"x-cli": {
|
|
@@ -19694,36 +19524,36 @@
|
|
|
19694
19524
|
}
|
|
19695
19525
|
}
|
|
19696
19526
|
},
|
|
19697
|
-
"/todo/
|
|
19527
|
+
"/todo/items/{id}/comments": {
|
|
19698
19528
|
"post": {
|
|
19699
|
-
"operationId": "
|
|
19529
|
+
"operationId": "todo_comment_create",
|
|
19700
19530
|
"tags": [
|
|
19701
|
-
"
|
|
19531
|
+
"Comments"
|
|
19702
19532
|
],
|
|
19703
19533
|
"x-cli": {
|
|
19704
|
-
"command": "todo
|
|
19534
|
+
"command": "todo comment add",
|
|
19705
19535
|
"positional": [
|
|
19706
|
-
"
|
|
19536
|
+
"id",
|
|
19537
|
+
"content"
|
|
19707
19538
|
],
|
|
19708
19539
|
"examples": [
|
|
19709
|
-
"wspc todo
|
|
19540
|
+
"wspc todo comment add tod_01HW3K \"Verified on staging\""
|
|
19710
19541
|
],
|
|
19711
19542
|
"display": {
|
|
19712
19543
|
"shape": "object",
|
|
19713
19544
|
"format": {
|
|
19714
19545
|
"id": "id-short",
|
|
19715
|
-
"
|
|
19716
|
-
"
|
|
19717
|
-
"
|
|
19718
|
-
"name": "truncate",
|
|
19546
|
+
"todo_id": "id-short",
|
|
19547
|
+
"user_id": "id-short",
|
|
19548
|
+
"content": "truncate",
|
|
19719
19549
|
"created_at": "relative-time",
|
|
19720
19550
|
"updated_at": "relative-time",
|
|
19721
19551
|
"deleted_at": "relative-time"
|
|
19722
19552
|
}
|
|
19723
19553
|
}
|
|
19724
19554
|
},
|
|
19725
|
-
"summary": "
|
|
19726
|
-
"description": "### 🎯 Overview & Purpose\
|
|
19555
|
+
"summary": "Add a comment to a todo",
|
|
19556
|
+
"description": "### 🎯 Overview & Purpose\nAttach a free-text comment to a todo. Use this to record progress updates, notes, or remarks as a task moves along.\n\n### 💡 Key Features & Constraints\n* **Free text**: Comments are plain text up to 10000 characters; there is no separate \"progress\" vs \"remark\" type.\n* **Authorship**: The author is recorded as the calling user (`user_id`).\n\n### ⚠️ Common Errors & Troubleshooting\n* **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo does not exist or is soft-deleted.\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if content is empty or exceeds 10000 characters.",
|
|
19727
19557
|
"security": [
|
|
19728
19558
|
{
|
|
19729
19559
|
"bearerAuth": []
|
|
@@ -19733,37 +19563,38 @@
|
|
|
19733
19563
|
{
|
|
19734
19564
|
"lang": "shell",
|
|
19735
19565
|
"label": "curl",
|
|
19736
|
-
"source": "curl -X POST https://api.wspc.ai/todo/
|
|
19566
|
+
"source": "curl -X POST https://api.wspc.ai/todo/items/tod_01HW3K/comments -H \"Authorization: Bearer $WSPC_API_KEY\" -H \"Content-Type: application/json\" -d '{\"content\":\"Looks good\"}'"
|
|
19737
19567
|
},
|
|
19738
19568
|
{
|
|
19739
19569
|
"lang": "bash",
|
|
19740
19570
|
"label": "wspc CLI",
|
|
19741
|
-
"source": "wspc
|
|
19742
|
-
}
|
|
19571
|
+
"source": "wspc todo comment add tod_01HW3K \"Looks good\""
|
|
19572
|
+
}
|
|
19573
|
+
],
|
|
19574
|
+
"parameters": [
|
|
19743
19575
|
{
|
|
19744
|
-
"
|
|
19745
|
-
|
|
19746
|
-
|
|
19576
|
+
"schema": {
|
|
19577
|
+
"type": "string",
|
|
19578
|
+
"description": "Todo id (`tod_<ULID>`).",
|
|
19579
|
+
"example": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
19580
|
+
},
|
|
19581
|
+
"required": true,
|
|
19582
|
+
"description": "Todo id (`tod_<ULID>`).",
|
|
19583
|
+
"name": "id",
|
|
19584
|
+
"in": "path"
|
|
19747
19585
|
}
|
|
19748
19586
|
],
|
|
19749
19587
|
"requestBody": {
|
|
19750
19588
|
"content": {
|
|
19751
19589
|
"application/json": {
|
|
19752
19590
|
"schema": {
|
|
19753
|
-
"$ref": "#/components/schemas/
|
|
19591
|
+
"$ref": "#/components/schemas/CreateCommentBody"
|
|
19754
19592
|
},
|
|
19755
19593
|
"examples": {
|
|
19756
19594
|
"minimal": {
|
|
19757
|
-
"summary": "
|
|
19758
|
-
"value": {
|
|
19759
|
-
"name": "Launch plan"
|
|
19760
|
-
}
|
|
19761
|
-
},
|
|
19762
|
-
"explicitDefaultType": {
|
|
19763
|
-
"summary": "Explicit default todo type",
|
|
19595
|
+
"summary": "Plain comment",
|
|
19764
19596
|
"value": {
|
|
19765
|
-
"
|
|
19766
|
-
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
19597
|
+
"content": "Looks good"
|
|
19767
19598
|
}
|
|
19768
19599
|
}
|
|
19769
19600
|
}
|
|
@@ -19776,18 +19607,17 @@
|
|
|
19776
19607
|
"content": {
|
|
19777
19608
|
"application/json": {
|
|
19778
19609
|
"schema": {
|
|
19779
|
-
"$ref": "#/components/schemas/
|
|
19610
|
+
"$ref": "#/components/schemas/Comment"
|
|
19780
19611
|
},
|
|
19781
19612
|
"examples": {
|
|
19782
19613
|
"happyPath": {
|
|
19783
|
-
"summary": "Active
|
|
19614
|
+
"summary": "Active comment",
|
|
19784
19615
|
"value": {
|
|
19785
|
-
"id": "
|
|
19616
|
+
"id": "tdc_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
19617
|
+
"todo_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
19618
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
19786
19619
|
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
19787
|
-
"
|
|
19788
|
-
"name": "Launch plan",
|
|
19789
|
-
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
19790
|
-
"version": 1,
|
|
19620
|
+
"content": "Verified on staging, moving on.",
|
|
19791
19621
|
"created_at": 1748736000000,
|
|
19792
19622
|
"updated_at": 1748736000000
|
|
19793
19623
|
}
|
|
@@ -20122,32 +19952,32 @@
|
|
|
20122
19952
|
}
|
|
20123
19953
|
},
|
|
20124
19954
|
"get": {
|
|
20125
|
-
"operationId": "
|
|
19955
|
+
"operationId": "todo_comment_list",
|
|
20126
19956
|
"tags": [
|
|
20127
|
-
"
|
|
19957
|
+
"Comments"
|
|
20128
19958
|
],
|
|
20129
19959
|
"x-cli": {
|
|
20130
|
-
"command": "todo
|
|
19960
|
+
"command": "todo comment ls",
|
|
20131
19961
|
"examples": [
|
|
20132
|
-
"wspc todo
|
|
19962
|
+
"wspc todo comment ls tod_01HW3K"
|
|
20133
19963
|
],
|
|
20134
19964
|
"display": {
|
|
20135
19965
|
"shape": "list",
|
|
20136
19966
|
"columns": [
|
|
20137
19967
|
"id",
|
|
20138
|
-
"
|
|
20139
|
-
"
|
|
19968
|
+
"content",
|
|
19969
|
+
"created_at"
|
|
20140
19970
|
],
|
|
20141
19971
|
"format": {
|
|
20142
19972
|
"id": "id-short",
|
|
20143
|
-
"
|
|
20144
|
-
"
|
|
19973
|
+
"content": "truncate",
|
|
19974
|
+
"created_at": "relative-time"
|
|
20145
19975
|
},
|
|
20146
|
-
"emptyMessage": "no
|
|
19976
|
+
"emptyMessage": "no comments"
|
|
20147
19977
|
}
|
|
20148
19978
|
},
|
|
20149
|
-
"summary": "List
|
|
20150
|
-
"description": "### 🎯 Overview & Purpose\nList
|
|
19979
|
+
"summary": "List comments on a todo",
|
|
19980
|
+
"description": "### 🎯 Overview & Purpose\nList the comments attached to a todo, oldest-first by default.\n\n### 💡 Key Features & Constraints\n* **Ordering**: Defaults to chronological (`asc`). Pass `order=desc` for newest-first.\n* **Soft-deleted**: Hidden by default; pass `include_deleted=true` to include them.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`NOT_FOUND` (HTTP 404)**: Thrown if the target todo does not exist or is soft-deleted.",
|
|
20151
19981
|
"security": [
|
|
20152
19982
|
{
|
|
20153
19983
|
"bearerAuth": []
|
|
@@ -20157,28 +19987,43 @@
|
|
|
20157
19987
|
{
|
|
20158
19988
|
"lang": "shell",
|
|
20159
19989
|
"label": "curl",
|
|
20160
|
-
"source": "curl https://api.wspc.ai/todo/
|
|
19990
|
+
"source": "curl https://api.wspc.ai/todo/items/tod_01HW3K/comments -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
20161
19991
|
},
|
|
20162
19992
|
{
|
|
20163
19993
|
"lang": "bash",
|
|
20164
19994
|
"label": "wspc CLI",
|
|
20165
|
-
"source": "wspc
|
|
20166
|
-
},
|
|
20167
|
-
{
|
|
20168
|
-
"lang": "typescript",
|
|
20169
|
-
"label": "@wspc/client",
|
|
20170
|
-
"source": "await todo.projects.list()"
|
|
19995
|
+
"source": "wspc todo comment ls tod_01HW3K"
|
|
20171
19996
|
}
|
|
20172
19997
|
],
|
|
20173
19998
|
"parameters": [
|
|
20174
19999
|
{
|
|
20175
20000
|
"schema": {
|
|
20176
20001
|
"type": "string",
|
|
20177
|
-
"description": "
|
|
20178
|
-
"example": "
|
|
20002
|
+
"description": "Todo id (`tod_<ULID>`).",
|
|
20003
|
+
"example": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
20004
|
+
},
|
|
20005
|
+
"required": true,
|
|
20006
|
+
"description": "Todo id (`tod_<ULID>`).",
|
|
20007
|
+
"name": "id",
|
|
20008
|
+
"in": "path"
|
|
20009
|
+
},
|
|
20010
|
+
{
|
|
20011
|
+
"schema": {
|
|
20012
|
+
"type": "string",
|
|
20013
|
+
"enum": [
|
|
20014
|
+
"asc",
|
|
20015
|
+
"desc"
|
|
20016
|
+
]
|
|
20017
|
+
},
|
|
20018
|
+
"required": false,
|
|
20019
|
+
"name": "order",
|
|
20020
|
+
"in": "query"
|
|
20021
|
+
},
|
|
20022
|
+
{
|
|
20023
|
+
"schema": {
|
|
20024
|
+
"type": "string"
|
|
20179
20025
|
},
|
|
20180
20026
|
"required": false,
|
|
20181
|
-
"description": "Set to `true` to include soft-deleted projects in the response.",
|
|
20182
20027
|
"name": "include_deleted",
|
|
20183
20028
|
"in": "query"
|
|
20184
20029
|
}
|
|
@@ -20191,62 +20036,33 @@
|
|
|
20191
20036
|
"schema": {
|
|
20192
20037
|
"type": "object",
|
|
20193
20038
|
"properties": {
|
|
20194
|
-
"
|
|
20039
|
+
"comments": {
|
|
20195
20040
|
"type": "array",
|
|
20196
20041
|
"items": {
|
|
20197
|
-
"$ref": "#/components/schemas/
|
|
20042
|
+
"$ref": "#/components/schemas/Comment"
|
|
20198
20043
|
}
|
|
20199
20044
|
}
|
|
20200
20045
|
},
|
|
20201
20046
|
"required": [
|
|
20202
|
-
"
|
|
20047
|
+
"comments"
|
|
20203
20048
|
]
|
|
20204
20049
|
},
|
|
20205
20050
|
"examples": {
|
|
20206
|
-
"
|
|
20207
|
-
"summary": "
|
|
20051
|
+
"activeComments": {
|
|
20052
|
+
"summary": "Comments",
|
|
20208
20053
|
"value": {
|
|
20209
|
-
"
|
|
20054
|
+
"comments": [
|
|
20210
20055
|
{
|
|
20211
|
-
"id": "
|
|
20056
|
+
"id": "tdc_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20057
|
+
"todo_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20058
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20212
20059
|
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20213
|
-
"
|
|
20214
|
-
"name": "Launch plan",
|
|
20215
|
-
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20216
|
-
"version": 1,
|
|
20060
|
+
"content": "Verified on staging, moving on.",
|
|
20217
20061
|
"created_at": 1748736000000,
|
|
20218
20062
|
"updated_at": 1748736000000
|
|
20219
20063
|
}
|
|
20220
20064
|
]
|
|
20221
20065
|
}
|
|
20222
|
-
},
|
|
20223
|
-
"includeDeleted": {
|
|
20224
|
-
"summary": "Including soft-deleted projects",
|
|
20225
|
-
"value": {
|
|
20226
|
-
"projects": [
|
|
20227
|
-
{
|
|
20228
|
-
"id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20229
|
-
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20230
|
-
"creator_user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20231
|
-
"name": "Launch plan",
|
|
20232
|
-
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20233
|
-
"version": 1,
|
|
20234
|
-
"created_at": 1748736000000,
|
|
20235
|
-
"updated_at": 1748736000000
|
|
20236
|
-
},
|
|
20237
|
-
{
|
|
20238
|
-
"id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20239
|
-
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20240
|
-
"creator_user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20241
|
-
"name": "Launch plan",
|
|
20242
|
-
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20243
|
-
"version": 2,
|
|
20244
|
-
"created_at": 1748736000000,
|
|
20245
|
-
"updated_at": 1748739600000,
|
|
20246
|
-
"deleted_at": 1748739600000
|
|
20247
|
-
}
|
|
20248
|
-
]
|
|
20249
|
-
}
|
|
20250
20066
|
}
|
|
20251
20067
|
}
|
|
20252
20068
|
}
|
|
@@ -20578,18 +20394,36 @@
|
|
|
20578
20394
|
}
|
|
20579
20395
|
}
|
|
20580
20396
|
},
|
|
20581
|
-
"/todo/
|
|
20397
|
+
"/todo/projects": {
|
|
20582
20398
|
"post": {
|
|
20583
|
-
"operationId": "
|
|
20399
|
+
"operationId": "project_create",
|
|
20584
20400
|
"tags": [
|
|
20585
|
-
"
|
|
20401
|
+
"Projects"
|
|
20586
20402
|
],
|
|
20587
20403
|
"x-cli": {
|
|
20588
|
-
"command": "
|
|
20589
|
-
"
|
|
20404
|
+
"command": "todo project add",
|
|
20405
|
+
"positional": [
|
|
20406
|
+
"name"
|
|
20407
|
+
],
|
|
20408
|
+
"examples": [
|
|
20409
|
+
"wspc todo project add \"Personal\""
|
|
20410
|
+
],
|
|
20411
|
+
"display": {
|
|
20412
|
+
"shape": "object",
|
|
20413
|
+
"format": {
|
|
20414
|
+
"id": "id-short",
|
|
20415
|
+
"org_id": "id-short",
|
|
20416
|
+
"creator_user_id": "id-short",
|
|
20417
|
+
"default_todo_type_id": "id-short",
|
|
20418
|
+
"name": "truncate",
|
|
20419
|
+
"created_at": "relative-time",
|
|
20420
|
+
"updated_at": "relative-time",
|
|
20421
|
+
"deleted_at": "relative-time"
|
|
20422
|
+
}
|
|
20423
|
+
}
|
|
20590
20424
|
},
|
|
20591
|
-
"summary": "Create a
|
|
20592
|
-
"description": "### 🎯 Overview & Purpose\
|
|
20425
|
+
"summary": "Create a project",
|
|
20426
|
+
"description": "### 🎯 Overview & Purpose\nEstablish a new isolated project workspace.\n\n### 🔍 When to Use\n* Use this to set up a new domain, team project, or separate workspace area to isolate tasks, custom types, and recurrence rules.\n\n### 💡 Key Features & Constraints\n* **Project Partitioning**: Projects act as strict boundaries. Custom todo types and recurrence rules created under this project are strictly confined to it.\n* **Name Uniqueness**: Project names are free-form and do not have to be unique.\n* **Default Type Inheritance**: Omit `default_todo_type_id` to automatically inherit the Default Project's default task type.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing, if name is empty, or if name length constraints are violated.",
|
|
20593
20427
|
"security": [
|
|
20594
20428
|
{
|
|
20595
20429
|
"bearerAuth": []
|
|
@@ -20599,44 +20433,32 @@
|
|
|
20599
20433
|
{
|
|
20600
20434
|
"lang": "shell",
|
|
20601
20435
|
"label": "curl",
|
|
20602
|
-
"source": "curl -X POST https://api.wspc.ai/todo/
|
|
20436
|
+
"source": "curl -X POST https://api.wspc.ai/todo/projects -H \"Authorization: Bearer $WSPC_API_KEY\" -H \"Content-Type: application/json\" -d '{\"name\":\"Work\"}'"
|
|
20603
20437
|
},
|
|
20604
20438
|
{
|
|
20605
20439
|
"lang": "bash",
|
|
20606
20440
|
"label": "wspc CLI",
|
|
20607
|
-
"source": "wspc
|
|
20608
|
-
},
|
|
20609
|
-
{
|
|
20610
|
-
"lang": "typescript",
|
|
20611
|
-
"label": "@wspc/client",
|
|
20612
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.createRule({ title: \"Draft weekly review\", rrule: \"FREQ=WEEKLY;BYDAY=MO\", dtstart: \"2026-05-18\", project_id: \"prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\" })"
|
|
20441
|
+
"source": "wspc project create --name \"Work\""
|
|
20613
20442
|
}
|
|
20614
20443
|
],
|
|
20615
20444
|
"requestBody": {
|
|
20616
20445
|
"content": {
|
|
20617
20446
|
"application/json": {
|
|
20618
20447
|
"schema": {
|
|
20619
|
-
"$ref": "#/components/schemas/
|
|
20448
|
+
"$ref": "#/components/schemas/CreateProjectBody"
|
|
20620
20449
|
},
|
|
20621
20450
|
"examples": {
|
|
20622
20451
|
"minimal": {
|
|
20623
|
-
"summary": "
|
|
20452
|
+
"summary": "Name only",
|
|
20624
20453
|
"value": {
|
|
20625
|
-
"
|
|
20626
|
-
"dtstart": "2026-05-18",
|
|
20627
|
-
"title": "Draft weekly review",
|
|
20628
|
-
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
20454
|
+
"name": "Launch plan"
|
|
20629
20455
|
}
|
|
20630
20456
|
},
|
|
20631
|
-
"
|
|
20632
|
-
"summary": "
|
|
20457
|
+
"explicitDefaultType": {
|
|
20458
|
+
"summary": "Explicit default todo type",
|
|
20633
20459
|
"value": {
|
|
20634
|
-
"
|
|
20635
|
-
"
|
|
20636
|
-
"title": "Draft weekly review",
|
|
20637
|
-
"description": "See PRD for context",
|
|
20638
|
-
"parent_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20639
|
-
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
20460
|
+
"name": "Launch plan",
|
|
20461
|
+
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
20640
20462
|
}
|
|
20641
20463
|
}
|
|
20642
20464
|
}
|
|
@@ -20645,28 +20467,24 @@
|
|
|
20645
20467
|
},
|
|
20646
20468
|
"responses": {
|
|
20647
20469
|
"201": {
|
|
20648
|
-
"description": "
|
|
20470
|
+
"description": "Created",
|
|
20649
20471
|
"content": {
|
|
20650
20472
|
"application/json": {
|
|
20651
20473
|
"schema": {
|
|
20652
|
-
"$ref": "#/components/schemas/
|
|
20474
|
+
"$ref": "#/components/schemas/Project"
|
|
20653
20475
|
},
|
|
20654
20476
|
"examples": {
|
|
20655
20477
|
"happyPath": {
|
|
20656
|
-
"summary": "
|
|
20478
|
+
"summary": "Active project",
|
|
20657
20479
|
"value": {
|
|
20658
|
-
"
|
|
20659
|
-
|
|
20660
|
-
|
|
20661
|
-
|
|
20662
|
-
|
|
20663
|
-
|
|
20664
|
-
|
|
20665
|
-
|
|
20666
|
-
"updated_at": 1748736000000
|
|
20667
|
-
},
|
|
20668
|
-
"template_todo_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20669
|
-
"materialized_instance_count": 2
|
|
20480
|
+
"id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20481
|
+
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20482
|
+
"creator_user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20483
|
+
"name": "Launch plan",
|
|
20484
|
+
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20485
|
+
"version": 1,
|
|
20486
|
+
"created_at": 1748736000000,
|
|
20487
|
+
"updated_at": 1748736000000
|
|
20670
20488
|
}
|
|
20671
20489
|
}
|
|
20672
20490
|
}
|
|
@@ -20999,31 +20817,32 @@
|
|
|
20999
20817
|
}
|
|
21000
20818
|
},
|
|
21001
20819
|
"get": {
|
|
21002
|
-
"operationId": "
|
|
20820
|
+
"operationId": "project_list",
|
|
21003
20821
|
"tags": [
|
|
21004
|
-
"
|
|
20822
|
+
"Projects"
|
|
21005
20823
|
],
|
|
21006
20824
|
"x-cli": {
|
|
21007
|
-
"command": "todo
|
|
20825
|
+
"command": "todo project ls",
|
|
21008
20826
|
"examples": [
|
|
21009
|
-
"wspc todo
|
|
20827
|
+
"wspc todo project ls"
|
|
21010
20828
|
],
|
|
21011
20829
|
"display": {
|
|
21012
20830
|
"shape": "list",
|
|
21013
20831
|
"columns": [
|
|
21014
20832
|
"id",
|
|
21015
|
-
"
|
|
21016
|
-
"
|
|
20833
|
+
"name",
|
|
20834
|
+
"default_todo_type_id"
|
|
21017
20835
|
],
|
|
21018
20836
|
"format": {
|
|
21019
20837
|
"id": "id-short",
|
|
21020
|
-
"
|
|
20838
|
+
"name": "truncate",
|
|
20839
|
+
"default_todo_type_id": "id-short"
|
|
21021
20840
|
},
|
|
21022
|
-
"emptyMessage": "no
|
|
20841
|
+
"emptyMessage": "no projects"
|
|
21023
20842
|
}
|
|
21024
20843
|
},
|
|
21025
|
-
"summary": "List
|
|
21026
|
-
"description": "### 🎯 Overview & Purpose\
|
|
20844
|
+
"summary": "List projects",
|
|
20845
|
+
"description": "### 🎯 Overview & Purpose\nList all project workspaces available to the authenticated organization or user.\n\n### 🔍 When to Use\n* Use this to populate project switcher dropdown menus, load side navigation views, or find valid project IDs before listing other scoped resources.\n\n### 💡 Key Features & Constraints\n* **Archived Visibility**: Soft-deleted projects are omitted from default listings. Pass `include_deleted=true` to include them for auditing or recovery dashboards.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`AUTH_REQUIRED` (HTTP 401)**: Thrown if the caller is not authenticated.",
|
|
21027
20846
|
"security": [
|
|
21028
20847
|
{
|
|
21029
20848
|
"bearerAuth": []
|
|
@@ -21033,59 +20852,57 @@
|
|
|
21033
20852
|
{
|
|
21034
20853
|
"lang": "shell",
|
|
21035
20854
|
"label": "curl",
|
|
21036
|
-
"source": "curl https://api.wspc.ai/todo/
|
|
20855
|
+
"source": "curl https://api.wspc.ai/todo/projects -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
21037
20856
|
},
|
|
21038
20857
|
{
|
|
21039
20858
|
"lang": "bash",
|
|
21040
20859
|
"label": "wspc CLI",
|
|
21041
|
-
"source": "wspc
|
|
21042
|
-
},
|
|
21043
|
-
{
|
|
21044
|
-
"lang": "typescript",
|
|
21045
|
-
"label": "@wspc/client",
|
|
21046
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.listRules()"
|
|
20860
|
+
"source": "wspc project ls"
|
|
21047
20861
|
}
|
|
21048
20862
|
],
|
|
21049
20863
|
"parameters": [
|
|
21050
20864
|
{
|
|
21051
20865
|
"schema": {
|
|
21052
20866
|
"type": "string",
|
|
21053
|
-
"
|
|
21054
|
-
"
|
|
21055
|
-
},
|
|
21056
|
-
"required": true,
|
|
21057
|
-
"description": "Project id filter. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND.",
|
|
21058
|
-
"name": "project_id",
|
|
21059
|
-
"in": "query"
|
|
21060
|
-
},
|
|
21061
|
-
{
|
|
21062
|
-
"schema": {
|
|
21063
|
-
"type": "string"
|
|
20867
|
+
"description": "Set to `true` to include soft-deleted projects in the response.",
|
|
20868
|
+
"example": "true"
|
|
21064
20869
|
},
|
|
21065
20870
|
"required": false,
|
|
21066
|
-
"
|
|
20871
|
+
"description": "Set to `true` to include soft-deleted projects in the response.",
|
|
20872
|
+
"name": "include_deleted",
|
|
21067
20873
|
"in": "query"
|
|
21068
20874
|
}
|
|
21069
20875
|
],
|
|
21070
20876
|
"responses": {
|
|
21071
20877
|
"200": {
|
|
21072
|
-
"description": "
|
|
20878
|
+
"description": "List",
|
|
21073
20879
|
"content": {
|
|
21074
20880
|
"application/json": {
|
|
21075
20881
|
"schema": {
|
|
21076
|
-
"
|
|
20882
|
+
"type": "object",
|
|
20883
|
+
"properties": {
|
|
20884
|
+
"projects": {
|
|
20885
|
+
"type": "array",
|
|
20886
|
+
"items": {
|
|
20887
|
+
"$ref": "#/components/schemas/Project"
|
|
20888
|
+
}
|
|
20889
|
+
}
|
|
20890
|
+
},
|
|
20891
|
+
"required": [
|
|
20892
|
+
"projects"
|
|
20893
|
+
]
|
|
21077
20894
|
},
|
|
21078
20895
|
"examples": {
|
|
21079
|
-
"
|
|
21080
|
-
"summary": "
|
|
20896
|
+
"activeProjects": {
|
|
20897
|
+
"summary": "Active projects",
|
|
21081
20898
|
"value": {
|
|
21082
|
-
"
|
|
20899
|
+
"projects": [
|
|
21083
20900
|
{
|
|
21084
|
-
"id": "
|
|
21085
|
-
"
|
|
21086
|
-
"
|
|
21087
|
-
"
|
|
21088
|
-
"
|
|
20901
|
+
"id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20902
|
+
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20903
|
+
"creator_user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20904
|
+
"name": "Launch plan",
|
|
20905
|
+
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21089
20906
|
"version": 1,
|
|
21090
20907
|
"created_at": 1748736000000,
|
|
21091
20908
|
"updated_at": 1748736000000
|
|
@@ -21093,10 +20910,32 @@
|
|
|
21093
20910
|
]
|
|
21094
20911
|
}
|
|
21095
20912
|
},
|
|
21096
|
-
"
|
|
21097
|
-
"summary": "
|
|
20913
|
+
"includeDeleted": {
|
|
20914
|
+
"summary": "Including soft-deleted projects",
|
|
21098
20915
|
"value": {
|
|
21099
|
-
"
|
|
20916
|
+
"projects": [
|
|
20917
|
+
{
|
|
20918
|
+
"id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20919
|
+
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20920
|
+
"creator_user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20921
|
+
"name": "Launch plan",
|
|
20922
|
+
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20923
|
+
"version": 1,
|
|
20924
|
+
"created_at": 1748736000000,
|
|
20925
|
+
"updated_at": 1748736000000
|
|
20926
|
+
},
|
|
20927
|
+
{
|
|
20928
|
+
"id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20929
|
+
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20930
|
+
"creator_user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20931
|
+
"name": "Launch plan",
|
|
20932
|
+
"default_todo_type_id": "typ_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
20933
|
+
"version": 2,
|
|
20934
|
+
"created_at": 1748736000000,
|
|
20935
|
+
"updated_at": 1748739600000,
|
|
20936
|
+
"deleted_at": 1748739600000
|
|
20937
|
+
}
|
|
20938
|
+
]
|
|
21100
20939
|
}
|
|
21101
20940
|
}
|
|
21102
20941
|
}
|
|
@@ -21429,44 +21268,18 @@
|
|
|
21429
21268
|
}
|
|
21430
21269
|
}
|
|
21431
21270
|
},
|
|
21432
|
-
"/todo/
|
|
21271
|
+
"/todo/recurrence-rules": {
|
|
21433
21272
|
"post": {
|
|
21434
|
-
"operationId": "
|
|
21273
|
+
"operationId": "recurrence_rule_create",
|
|
21435
21274
|
"tags": [
|
|
21436
|
-
"
|
|
21275
|
+
"RecurrenceRules"
|
|
21437
21276
|
],
|
|
21438
21277
|
"x-cli": {
|
|
21439
|
-
"command": "
|
|
21440
|
-
"
|
|
21441
|
-
"title"
|
|
21442
|
-
],
|
|
21443
|
-
"aliases": {
|
|
21444
|
-
"project": "p"
|
|
21445
|
-
},
|
|
21446
|
-
"examples": [
|
|
21447
|
-
"wspc todo add \"Buy milk\"",
|
|
21448
|
-
"wspc todo add \"Buy milk\" --project prj_xxx"
|
|
21449
|
-
],
|
|
21450
|
-
"display": {
|
|
21451
|
-
"shape": "object",
|
|
21452
|
-
"format": {
|
|
21453
|
-
"id": "id-short",
|
|
21454
|
-
"user_id": "id-short",
|
|
21455
|
-
"project_id": "id-short",
|
|
21456
|
-
"parent_id": "id-short",
|
|
21457
|
-
"type_id": "id-short",
|
|
21458
|
-
"title": "truncate",
|
|
21459
|
-
"description": "truncate",
|
|
21460
|
-
"status": "status-badge",
|
|
21461
|
-
"due_at": "relative-time",
|
|
21462
|
-
"created_at": "relative-time",
|
|
21463
|
-
"updated_at": "relative-time",
|
|
21464
|
-
"deleted_at": "relative-time"
|
|
21465
|
-
}
|
|
21466
|
-
}
|
|
21278
|
+
"command": "_internal",
|
|
21279
|
+
"hidden": true
|
|
21467
21280
|
},
|
|
21468
|
-
"summary": "Create a todo",
|
|
21469
|
-
"description": "### 🎯 Overview & Purpose\nCreate a
|
|
21281
|
+
"summary": "Create a recurring todo rule",
|
|
21282
|
+
"description": "### 🎯 Overview & Purpose\nCreate a recurrence rule that materializes upcoming todo instances on a repeating schedule.\n\n### 🔍 When to Use\n* Use this to set up recurring work like a weekly Standup, monthly reporting, or cyclical maintenance. The server automatically materializes upcoming todo instances on a 14-day rolling horizon.\n\n### 💡 Key Features & Constraints\n* **RFC-5545 Conformity**: The `rrule` parameter must be a valid RFC-5545 schedule string (e.g., `FREQ=WEEKLY;BYDAY=MO`) and must **not** include the `DTSTART` or `TZID` directive.\n* **Anchor Date**: `dtstart` specifies the local calendar starting date (`YYYY-MM-DD`) where the schedule rule is anchored.\n* **Nesting Constraints**: Recurrence rules can only be bound to root-level tasks. Child tasks (subtasks) cannot have recurrence rules. Setting a child task as a parent will trigger `PARENT_IS_CHILD`.\n* **Instance Independence**: Once materialized, each todo instance is fully independent with its own `status` and `due_at`.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`RRULE_INVALID` (HTTP 400)**: Thrown if the `rrule` schedule string is broken or contains illegal `DTSTART` directives.\n* **`PARENT_IS_CHILD` (HTTP 400)**: Thrown if the specified `parent_id` points to a child task.\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if date format is invalid or required fields are missing.",
|
|
21470
21283
|
"security": [
|
|
21471
21284
|
{
|
|
21472
21285
|
"bearerAuth": []
|
|
@@ -21476,40 +21289,39 @@
|
|
|
21476
21289
|
{
|
|
21477
21290
|
"lang": "shell",
|
|
21478
21291
|
"label": "curl",
|
|
21479
|
-
"source": "curl -X POST https://api.wspc.ai/todo/
|
|
21292
|
+
"source": "curl -X POST https://api.wspc.ai/todo/recurrence-rules \\\n -H \"Authorization: Bearer $WSPC_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"title\":\"Draft weekly review\",\"rrule\":\"FREQ=WEEKLY;BYDAY=MO\",\"dtstart\":\"2026-05-18\",\"project_id\":\"prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\"}'"
|
|
21480
21293
|
},
|
|
21481
21294
|
{
|
|
21482
21295
|
"lang": "bash",
|
|
21483
21296
|
"label": "wspc CLI",
|
|
21484
|
-
"source": "wspc todo add \"
|
|
21485
|
-
},
|
|
21486
|
-
{
|
|
21487
|
-
"lang": "typescript",
|
|
21488
|
-
"label": "@wspc/client",
|
|
21489
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.create({ title: \"Buy milk\", due_at: \"2026-06-01\" })"
|
|
21297
|
+
"source": "wspc todo rrule add \"Draft weekly review\" --rrule \"FREQ=WEEKLY;BYDAY=MO\" --dtstart 2026-05-18 --project prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
21490
21298
|
}
|
|
21491
21299
|
],
|
|
21492
21300
|
"requestBody": {
|
|
21493
21301
|
"content": {
|
|
21494
21302
|
"application/json": {
|
|
21495
21303
|
"schema": {
|
|
21496
|
-
"$ref": "#/components/schemas/
|
|
21304
|
+
"$ref": "#/components/schemas/CreateRecurrenceRuleBody"
|
|
21497
21305
|
},
|
|
21498
21306
|
"examples": {
|
|
21499
21307
|
"minimal": {
|
|
21500
|
-
"summary": "
|
|
21308
|
+
"summary": "Weekly recurrence anchored on a Monday",
|
|
21501
21309
|
"value": {
|
|
21502
|
-
"
|
|
21503
|
-
|
|
21310
|
+
"rrule": "FREQ=WEEKLY;BYDAY=MO",
|
|
21311
|
+
"dtstart": "2026-05-18",
|
|
21312
|
+
"title": "Draft weekly review",
|
|
21313
|
+
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
21314
|
+
}
|
|
21504
21315
|
},
|
|
21505
21316
|
"full": {
|
|
21506
|
-
"summary": "
|
|
21317
|
+
"summary": "Weekly recurrence with description + parent",
|
|
21507
21318
|
"value": {
|
|
21508
|
-
"
|
|
21319
|
+
"rrule": "FREQ=WEEKLY;BYDAY=MO",
|
|
21320
|
+
"dtstart": "2026-05-18",
|
|
21321
|
+
"title": "Draft weekly review",
|
|
21509
21322
|
"description": "See PRD for context",
|
|
21510
21323
|
"parent_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21511
|
-
"
|
|
21512
|
-
"due_at": "2026-06-01"
|
|
21324
|
+
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
21513
21325
|
}
|
|
21514
21326
|
}
|
|
21515
21327
|
}
|
|
@@ -21518,28 +21330,28 @@
|
|
|
21518
21330
|
},
|
|
21519
21331
|
"responses": {
|
|
21520
21332
|
"201": {
|
|
21521
|
-
"description": "The
|
|
21333
|
+
"description": "The rule was created. `materialized_instance_count` reports how many todo instances were materialized immediately within the 14-day horizon.",
|
|
21522
21334
|
"content": {
|
|
21523
21335
|
"application/json": {
|
|
21524
21336
|
"schema": {
|
|
21525
|
-
"$ref": "#/components/schemas/
|
|
21337
|
+
"$ref": "#/components/schemas/CreateRecurrenceRuleResponse"
|
|
21526
21338
|
},
|
|
21527
21339
|
"examples": {
|
|
21528
21340
|
"happyPath": {
|
|
21529
|
-
"summary": "
|
|
21341
|
+
"summary": "Weekly rule with 2 instances materialized in the 14-day window",
|
|
21530
21342
|
"value": {
|
|
21531
|
-
"
|
|
21532
|
-
|
|
21533
|
-
|
|
21534
|
-
|
|
21535
|
-
|
|
21536
|
-
|
|
21537
|
-
|
|
21538
|
-
|
|
21539
|
-
|
|
21540
|
-
|
|
21541
|
-
"
|
|
21542
|
-
"
|
|
21343
|
+
"rule": {
|
|
21344
|
+
"id": "tdr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21345
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21346
|
+
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21347
|
+
"rrule": "FREQ=WEEKLY;BYDAY=MO",
|
|
21348
|
+
"dtstart": "2026-05-18",
|
|
21349
|
+
"version": 1,
|
|
21350
|
+
"created_at": 1748736000000,
|
|
21351
|
+
"updated_at": 1748736000000
|
|
21352
|
+
},
|
|
21353
|
+
"template_todo_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21354
|
+
"materialized_instance_count": 2
|
|
21543
21355
|
}
|
|
21544
21356
|
}
|
|
21545
21357
|
}
|
|
@@ -21872,40 +21684,31 @@
|
|
|
21872
21684
|
}
|
|
21873
21685
|
},
|
|
21874
21686
|
"get": {
|
|
21875
|
-
"operationId": "
|
|
21687
|
+
"operationId": "recurrence_rule_list",
|
|
21876
21688
|
"tags": [
|
|
21877
|
-
"
|
|
21689
|
+
"RecurrenceRules"
|
|
21878
21690
|
],
|
|
21879
21691
|
"x-cli": {
|
|
21880
|
-
"command": "todo ls",
|
|
21881
|
-
"aliases": {
|
|
21882
|
-
"project": "p",
|
|
21883
|
-
"status": "s"
|
|
21884
|
-
},
|
|
21692
|
+
"command": "todo rule ls",
|
|
21885
21693
|
"examples": [
|
|
21886
|
-
"wspc todo ls"
|
|
21887
|
-
"wspc todo ls --status open",
|
|
21888
|
-
"wspc todo ls --project prj_xxx"
|
|
21694
|
+
"wspc todo rule ls"
|
|
21889
21695
|
],
|
|
21890
21696
|
"display": {
|
|
21891
21697
|
"shape": "list",
|
|
21892
21698
|
"columns": [
|
|
21893
21699
|
"id",
|
|
21894
|
-
"
|
|
21895
|
-
"
|
|
21896
|
-
"due_at"
|
|
21700
|
+
"rrule",
|
|
21701
|
+
"dtstart"
|
|
21897
21702
|
],
|
|
21898
21703
|
"format": {
|
|
21899
21704
|
"id": "id-short",
|
|
21900
|
-
"
|
|
21901
|
-
"title": "truncate",
|
|
21902
|
-
"due_at": "relative-time"
|
|
21705
|
+
"rrule": "truncate"
|
|
21903
21706
|
},
|
|
21904
|
-
"emptyMessage": "no
|
|
21707
|
+
"emptyMessage": "no recurrence rules"
|
|
21905
21708
|
}
|
|
21906
21709
|
},
|
|
21907
|
-
"summary": "List
|
|
21908
|
-
"description": "### 🎯 Overview & Purpose\nReturn
|
|
21710
|
+
"summary": "List recurring todo rules",
|
|
21711
|
+
"description": "### 🎯 Overview & Purpose\nReturn all active recurrence rules within a specific project owned by the caller.\n\n### 🔍 When to Use\n* Use this to render rule management panels, list scheduled automation templates, or inspect active rules.\n\n### 💡 Key Features & Constraints\n* **Project Scope**: The `project_id` query parameter is strictly required.\n* **Exclusion**: Soft-deleted/archived rules are excluded from the response by default.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` query filter is omitted.",
|
|
21909
21712
|
"security": [
|
|
21910
21713
|
{
|
|
21911
21714
|
"bearerAuth": []
|
|
@@ -21915,17 +21718,12 @@
|
|
|
21915
21718
|
{
|
|
21916
21719
|
"lang": "shell",
|
|
21917
21720
|
"label": "curl",
|
|
21918
|
-
"source": "curl
|
|
21721
|
+
"source": "curl https://api.wspc.ai/todo/recurrence-rules \\\n -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
21919
21722
|
},
|
|
21920
21723
|
{
|
|
21921
21724
|
"lang": "bash",
|
|
21922
21725
|
"label": "wspc CLI",
|
|
21923
|
-
"source": "wspc todo ls
|
|
21924
|
-
},
|
|
21925
|
-
{
|
|
21926
|
-
"lang": "typescript",
|
|
21927
|
-
"label": "@wspc/client",
|
|
21928
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.list({ status: [\"open\", \"in_progress\"] })"
|
|
21726
|
+
"source": "wspc todo rrule ls"
|
|
21929
21727
|
}
|
|
21930
21728
|
],
|
|
21931
21729
|
"parameters": [
|
|
@@ -21933,10 +21731,10 @@
|
|
|
21933
21731
|
"schema": {
|
|
21934
21732
|
"type": "string",
|
|
21935
21733
|
"minLength": 1,
|
|
21936
|
-
"description": "
|
|
21734
|
+
"description": "Project id filter. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND."
|
|
21937
21735
|
},
|
|
21938
21736
|
"required": true,
|
|
21939
|
-
"description": "
|
|
21737
|
+
"description": "Project id filter. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND.",
|
|
21940
21738
|
"name": "project_id",
|
|
21941
21739
|
"in": "query"
|
|
21942
21740
|
},
|
|
@@ -21947,182 +21745,1848 @@
|
|
|
21947
21745
|
"required": false,
|
|
21948
21746
|
"name": "user_id",
|
|
21949
21747
|
"in": "query"
|
|
21950
|
-
}
|
|
21951
|
-
|
|
21952
|
-
|
|
21953
|
-
|
|
21954
|
-
|
|
21955
|
-
"
|
|
21956
|
-
|
|
21957
|
-
|
|
21958
|
-
|
|
21959
|
-
{
|
|
21960
|
-
"schema": {
|
|
21961
|
-
"anyOf": [
|
|
21962
|
-
{
|
|
21963
|
-
"type": "string"
|
|
21748
|
+
}
|
|
21749
|
+
],
|
|
21750
|
+
"responses": {
|
|
21751
|
+
"200": {
|
|
21752
|
+
"description": "Active recurrence rules for the caller. Empty `rules` array when none are configured.",
|
|
21753
|
+
"content": {
|
|
21754
|
+
"application/json": {
|
|
21755
|
+
"schema": {
|
|
21756
|
+
"$ref": "#/components/schemas/ListRecurrenceRulesResponse"
|
|
21964
21757
|
},
|
|
21965
|
-
{
|
|
21966
|
-
"
|
|
21967
|
-
|
|
21968
|
-
"
|
|
21758
|
+
"examples": {
|
|
21759
|
+
"happyPath": {
|
|
21760
|
+
"summary": "Single weekly rule configured",
|
|
21761
|
+
"value": {
|
|
21762
|
+
"rules": [
|
|
21763
|
+
{
|
|
21764
|
+
"id": "tdr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21765
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21766
|
+
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
21767
|
+
"rrule": "FREQ=WEEKLY;BYDAY=MO",
|
|
21768
|
+
"dtstart": "2026-05-18",
|
|
21769
|
+
"version": 1,
|
|
21770
|
+
"created_at": 1748736000000,
|
|
21771
|
+
"updated_at": 1748736000000
|
|
21772
|
+
}
|
|
21773
|
+
]
|
|
21774
|
+
}
|
|
21775
|
+
},
|
|
21776
|
+
"empty": {
|
|
21777
|
+
"summary": "No recurring rules",
|
|
21778
|
+
"value": {
|
|
21779
|
+
"rules": []
|
|
21780
|
+
}
|
|
21969
21781
|
}
|
|
21970
21782
|
}
|
|
21971
|
-
|
|
21972
|
-
}
|
|
21973
|
-
"required": false,
|
|
21974
|
-
"name": "status",
|
|
21975
|
-
"in": "query"
|
|
21783
|
+
}
|
|
21784
|
+
}
|
|
21976
21785
|
},
|
|
21977
|
-
{
|
|
21978
|
-
"
|
|
21979
|
-
|
|
21980
|
-
|
|
21981
|
-
|
|
21786
|
+
"400": {
|
|
21787
|
+
"description": "Request validation failed. The body, query, or path parameters did not match the operation's schema.",
|
|
21788
|
+
"content": {
|
|
21789
|
+
"application/json": {
|
|
21790
|
+
"schema": {
|
|
21791
|
+
"type": "object",
|
|
21792
|
+
"properties": {
|
|
21793
|
+
"error": {
|
|
21794
|
+
"type": "object",
|
|
21795
|
+
"properties": {
|
|
21796
|
+
"code": {
|
|
21797
|
+
"type": "string"
|
|
21798
|
+
},
|
|
21799
|
+
"message": {
|
|
21800
|
+
"type": "string"
|
|
21801
|
+
},
|
|
21802
|
+
"extra": {
|
|
21803
|
+
"type": "object",
|
|
21804
|
+
"additionalProperties": {}
|
|
21805
|
+
}
|
|
21806
|
+
},
|
|
21807
|
+
"required": [
|
|
21808
|
+
"code",
|
|
21809
|
+
"message"
|
|
21810
|
+
]
|
|
21811
|
+
}
|
|
21812
|
+
},
|
|
21813
|
+
"required": [
|
|
21814
|
+
"error"
|
|
21815
|
+
]
|
|
21982
21816
|
},
|
|
21983
|
-
{
|
|
21984
|
-
"
|
|
21985
|
-
|
|
21986
|
-
"
|
|
21817
|
+
"examples": {
|
|
21818
|
+
"validationError": {
|
|
21819
|
+
"summary": "Body failed schema validation",
|
|
21820
|
+
"value": {
|
|
21821
|
+
"error": {
|
|
21822
|
+
"code": "VALIDATION_ERROR",
|
|
21823
|
+
"message": "title must not be empty"
|
|
21824
|
+
}
|
|
21825
|
+
}
|
|
21987
21826
|
}
|
|
21988
21827
|
}
|
|
21989
|
-
|
|
21990
|
-
}
|
|
21991
|
-
"required": false,
|
|
21992
|
-
"name": "include_deleted",
|
|
21993
|
-
"in": "query"
|
|
21828
|
+
}
|
|
21829
|
+
}
|
|
21994
21830
|
},
|
|
21995
|
-
{
|
|
21996
|
-
"
|
|
21997
|
-
|
|
21998
|
-
|
|
21999
|
-
|
|
21831
|
+
"401": {
|
|
21832
|
+
"description": "Authentication is required but missing or invalid. The Bearer token (API key or OAuth access token) was absent, malformed, or rejected.",
|
|
21833
|
+
"content": {
|
|
21834
|
+
"application/json": {
|
|
21835
|
+
"schema": {
|
|
21836
|
+
"type": "object",
|
|
21837
|
+
"properties": {
|
|
21838
|
+
"error": {
|
|
21839
|
+
"type": "object",
|
|
21840
|
+
"properties": {
|
|
21841
|
+
"code": {
|
|
21842
|
+
"type": "string"
|
|
21843
|
+
},
|
|
21844
|
+
"message": {
|
|
21845
|
+
"type": "string"
|
|
21846
|
+
},
|
|
21847
|
+
"extra": {
|
|
21848
|
+
"type": "object",
|
|
21849
|
+
"additionalProperties": {}
|
|
21850
|
+
}
|
|
21851
|
+
},
|
|
21852
|
+
"required": [
|
|
21853
|
+
"code",
|
|
21854
|
+
"message"
|
|
21855
|
+
]
|
|
21856
|
+
}
|
|
21857
|
+
},
|
|
21858
|
+
"required": [
|
|
21859
|
+
"error"
|
|
21860
|
+
]
|
|
22000
21861
|
},
|
|
22001
|
-
{
|
|
22002
|
-
"
|
|
22003
|
-
|
|
22004
|
-
"
|
|
21862
|
+
"examples": {
|
|
21863
|
+
"authRequired": {
|
|
21864
|
+
"summary": "Missing Authorization header",
|
|
21865
|
+
"value": {
|
|
21866
|
+
"error": {
|
|
21867
|
+
"code": "AUTH_REQUIRED",
|
|
21868
|
+
"message": "missing bearer token"
|
|
21869
|
+
}
|
|
21870
|
+
}
|
|
22005
21871
|
}
|
|
22006
21872
|
}
|
|
22007
|
-
|
|
22008
|
-
}
|
|
22009
|
-
"required": false,
|
|
22010
|
-
"name": "include_templates",
|
|
22011
|
-
"in": "query"
|
|
21873
|
+
}
|
|
21874
|
+
}
|
|
22012
21875
|
},
|
|
22013
|
-
{
|
|
22014
|
-
"
|
|
22015
|
-
|
|
22016
|
-
|
|
22017
|
-
|
|
22018
|
-
|
|
21876
|
+
"403": {
|
|
21877
|
+
"description": "The caller is authenticated but not permitted to perform this operation on the target resource.",
|
|
21878
|
+
"content": {
|
|
21879
|
+
"application/json": {
|
|
21880
|
+
"schema": {
|
|
21881
|
+
"type": "object",
|
|
21882
|
+
"properties": {
|
|
21883
|
+
"error": {
|
|
21884
|
+
"type": "object",
|
|
21885
|
+
"properties": {
|
|
21886
|
+
"code": {
|
|
21887
|
+
"type": "string"
|
|
21888
|
+
},
|
|
21889
|
+
"message": {
|
|
21890
|
+
"type": "string"
|
|
21891
|
+
},
|
|
21892
|
+
"extra": {
|
|
21893
|
+
"type": "object",
|
|
21894
|
+
"additionalProperties": {}
|
|
21895
|
+
}
|
|
21896
|
+
},
|
|
21897
|
+
"required": [
|
|
21898
|
+
"code",
|
|
21899
|
+
"message"
|
|
21900
|
+
]
|
|
21901
|
+
}
|
|
21902
|
+
},
|
|
21903
|
+
"required": [
|
|
21904
|
+
"error"
|
|
21905
|
+
]
|
|
21906
|
+
},
|
|
21907
|
+
"examples": {
|
|
21908
|
+
"forbidden": {
|
|
21909
|
+
"summary": "Caller does not own the resource",
|
|
21910
|
+
"value": {
|
|
21911
|
+
"error": {
|
|
21912
|
+
"code": "FORBIDDEN",
|
|
21913
|
+
"message": "not allowed"
|
|
21914
|
+
}
|
|
21915
|
+
}
|
|
21916
|
+
}
|
|
21917
|
+
}
|
|
21918
|
+
}
|
|
21919
|
+
}
|
|
21920
|
+
},
|
|
21921
|
+
"404": {
|
|
21922
|
+
"description": "The target resource does not exist or is not visible to the caller. Soft-deleted resources are treated as not found unless an `include_deleted` flag is set.",
|
|
21923
|
+
"content": {
|
|
21924
|
+
"application/json": {
|
|
21925
|
+
"schema": {
|
|
21926
|
+
"type": "object",
|
|
21927
|
+
"properties": {
|
|
21928
|
+
"error": {
|
|
21929
|
+
"type": "object",
|
|
21930
|
+
"properties": {
|
|
21931
|
+
"code": {
|
|
21932
|
+
"type": "string"
|
|
21933
|
+
},
|
|
21934
|
+
"message": {
|
|
21935
|
+
"type": "string"
|
|
21936
|
+
},
|
|
21937
|
+
"extra": {
|
|
21938
|
+
"type": "object",
|
|
21939
|
+
"additionalProperties": {}
|
|
21940
|
+
}
|
|
21941
|
+
},
|
|
21942
|
+
"required": [
|
|
21943
|
+
"code",
|
|
21944
|
+
"message"
|
|
21945
|
+
]
|
|
21946
|
+
}
|
|
21947
|
+
},
|
|
21948
|
+
"required": [
|
|
21949
|
+
"error"
|
|
21950
|
+
]
|
|
21951
|
+
},
|
|
21952
|
+
"examples": {
|
|
21953
|
+
"notFound": {
|
|
21954
|
+
"summary": "Resource id is unknown to the service",
|
|
21955
|
+
"value": {
|
|
21956
|
+
"error": {
|
|
21957
|
+
"code": "NOT_FOUND",
|
|
21958
|
+
"message": "todo not found"
|
|
21959
|
+
}
|
|
21960
|
+
}
|
|
21961
|
+
}
|
|
21962
|
+
}
|
|
21963
|
+
}
|
|
21964
|
+
}
|
|
21965
|
+
},
|
|
21966
|
+
"409": {
|
|
21967
|
+
"description": "Optimistic-lock conflict. The supplied `expected_version` does not match the server's current version. Refetch the resource and retry.",
|
|
21968
|
+
"content": {
|
|
21969
|
+
"application/json": {
|
|
21970
|
+
"schema": {
|
|
21971
|
+
"type": "object",
|
|
21972
|
+
"properties": {
|
|
21973
|
+
"error": {
|
|
21974
|
+
"type": "object",
|
|
21975
|
+
"properties": {
|
|
21976
|
+
"code": {
|
|
21977
|
+
"type": "string"
|
|
21978
|
+
},
|
|
21979
|
+
"message": {
|
|
21980
|
+
"type": "string"
|
|
21981
|
+
},
|
|
21982
|
+
"extra": {
|
|
21983
|
+
"type": "object",
|
|
21984
|
+
"additionalProperties": {}
|
|
21985
|
+
}
|
|
21986
|
+
},
|
|
21987
|
+
"required": [
|
|
21988
|
+
"code",
|
|
21989
|
+
"message"
|
|
21990
|
+
]
|
|
21991
|
+
}
|
|
21992
|
+
},
|
|
21993
|
+
"required": [
|
|
21994
|
+
"error"
|
|
21995
|
+
]
|
|
21996
|
+
},
|
|
21997
|
+
"examples": {
|
|
21998
|
+
"versionConflict": {
|
|
21999
|
+
"summary": "expected_version does not match server version",
|
|
22000
|
+
"value": {
|
|
22001
|
+
"error": {
|
|
22002
|
+
"code": "VERSION_CONFLICT",
|
|
22003
|
+
"message": "expected_version 3 but current is 4",
|
|
22004
|
+
"extra": {
|
|
22005
|
+
"expected_version": 3,
|
|
22006
|
+
"actual_version": 4
|
|
22007
|
+
}
|
|
22008
|
+
}
|
|
22009
|
+
}
|
|
22010
|
+
}
|
|
22011
|
+
}
|
|
22012
|
+
}
|
|
22013
|
+
}
|
|
22014
|
+
},
|
|
22015
|
+
"429": {
|
|
22016
|
+
"description": "Rate limit exceeded. Retry after the duration in `error.extra.retry_after_seconds`. `limit_kind` identifies which bucket was exhausted.",
|
|
22017
|
+
"content": {
|
|
22018
|
+
"application/json": {
|
|
22019
|
+
"schema": {
|
|
22020
|
+
"type": "object",
|
|
22021
|
+
"properties": {
|
|
22022
|
+
"error": {
|
|
22023
|
+
"type": "object",
|
|
22024
|
+
"properties": {
|
|
22025
|
+
"code": {
|
|
22026
|
+
"type": "string"
|
|
22027
|
+
},
|
|
22028
|
+
"message": {
|
|
22029
|
+
"type": "string"
|
|
22030
|
+
},
|
|
22031
|
+
"extra": {
|
|
22032
|
+
"type": "object",
|
|
22033
|
+
"additionalProperties": {}
|
|
22034
|
+
}
|
|
22035
|
+
},
|
|
22036
|
+
"required": [
|
|
22037
|
+
"code",
|
|
22038
|
+
"message"
|
|
22039
|
+
]
|
|
22040
|
+
}
|
|
22041
|
+
},
|
|
22042
|
+
"required": [
|
|
22043
|
+
"error"
|
|
22044
|
+
]
|
|
22045
|
+
},
|
|
22046
|
+
"examples": {
|
|
22047
|
+
"rateLimited": {
|
|
22048
|
+
"summary": "Per-key rate limit hit",
|
|
22049
|
+
"value": {
|
|
22050
|
+
"error": {
|
|
22051
|
+
"code": "RATE_LIMITED",
|
|
22052
|
+
"message": "rate limit exceeded",
|
|
22053
|
+
"extra": {
|
|
22054
|
+
"retry_after_seconds": 60,
|
|
22055
|
+
"limit_kind": "authenticated_per_key"
|
|
22056
|
+
}
|
|
22057
|
+
}
|
|
22058
|
+
}
|
|
22059
|
+
}
|
|
22060
|
+
}
|
|
22061
|
+
}
|
|
22062
|
+
}
|
|
22063
|
+
},
|
|
22064
|
+
"500": {
|
|
22065
|
+
"description": "Unhandled server error. The request was well-formed but the service failed unexpectedly. Safe to retry idempotent operations.",
|
|
22066
|
+
"content": {
|
|
22067
|
+
"application/json": {
|
|
22068
|
+
"schema": {
|
|
22069
|
+
"type": "object",
|
|
22070
|
+
"properties": {
|
|
22071
|
+
"error": {
|
|
22072
|
+
"type": "object",
|
|
22073
|
+
"properties": {
|
|
22074
|
+
"code": {
|
|
22075
|
+
"type": "string"
|
|
22076
|
+
},
|
|
22077
|
+
"message": {
|
|
22078
|
+
"type": "string"
|
|
22079
|
+
},
|
|
22080
|
+
"extra": {
|
|
22081
|
+
"type": "object",
|
|
22082
|
+
"additionalProperties": {}
|
|
22083
|
+
}
|
|
22084
|
+
},
|
|
22085
|
+
"required": [
|
|
22086
|
+
"code",
|
|
22087
|
+
"message"
|
|
22088
|
+
]
|
|
22089
|
+
}
|
|
22090
|
+
},
|
|
22091
|
+
"required": [
|
|
22092
|
+
"error"
|
|
22093
|
+
]
|
|
22094
|
+
},
|
|
22095
|
+
"examples": {
|
|
22096
|
+
"internalError": {
|
|
22097
|
+
"summary": "Unhandled exception",
|
|
22098
|
+
"value": {
|
|
22099
|
+
"error": {
|
|
22100
|
+
"code": "INTERNAL_ERROR",
|
|
22101
|
+
"message": "internal error"
|
|
22102
|
+
}
|
|
22103
|
+
}
|
|
22104
|
+
}
|
|
22105
|
+
}
|
|
22106
|
+
}
|
|
22107
|
+
}
|
|
22108
|
+
}
|
|
22109
|
+
}
|
|
22110
|
+
}
|
|
22111
|
+
},
|
|
22112
|
+
"/todo/items": {
|
|
22113
|
+
"post": {
|
|
22114
|
+
"operationId": "todo_create",
|
|
22115
|
+
"tags": [
|
|
22116
|
+
"Todos"
|
|
22117
|
+
],
|
|
22118
|
+
"x-cli": {
|
|
22119
|
+
"command": "todo add",
|
|
22120
|
+
"positional": [
|
|
22121
|
+
"title"
|
|
22122
|
+
],
|
|
22123
|
+
"aliases": {
|
|
22124
|
+
"project": "p"
|
|
22125
|
+
},
|
|
22126
|
+
"examples": [
|
|
22127
|
+
"wspc todo add \"Buy milk\"",
|
|
22128
|
+
"wspc todo add \"Buy milk\" --project prj_xxx"
|
|
22129
|
+
],
|
|
22130
|
+
"display": {
|
|
22131
|
+
"shape": "object",
|
|
22132
|
+
"format": {
|
|
22133
|
+
"id": "id-short",
|
|
22134
|
+
"user_id": "id-short",
|
|
22135
|
+
"project_id": "id-short",
|
|
22136
|
+
"parent_id": "id-short",
|
|
22137
|
+
"type_id": "id-short",
|
|
22138
|
+
"title": "truncate",
|
|
22139
|
+
"description": "truncate",
|
|
22140
|
+
"status": "status-badge",
|
|
22141
|
+
"due_at": "relative-time",
|
|
22142
|
+
"created_at": "relative-time",
|
|
22143
|
+
"updated_at": "relative-time",
|
|
22144
|
+
"deleted_at": "relative-time"
|
|
22145
|
+
}
|
|
22146
|
+
}
|
|
22147
|
+
},
|
|
22148
|
+
"summary": "Create a todo",
|
|
22149
|
+
"description": "### 🎯 Overview & Purpose\nCreate a new todo item under a specified project. This can either be a standalone root-level todo or a nested subtask attached to an existing root todo.\n\n### 🔍 When to Use\n* Use this to capture a fresh work item, document an ongoing task, or break a larger root todo into subtasks by creating child todos under it.\n\n### 💡 Key Features & Constraints\n* **One-Level Nesting Limit**: WSPC supports a maximum of one level of task nesting (Root ➔ Child). A root-level todo can have children, but a child todo cannot have further subtasks. Setting a child todo as a parent will fail and trigger a `PARENT_IS_CHILD` error.\n* **Description Handling**: Passing a non-empty string stores the description; passing `\"\"` explicitly stores an empty string. Passing `null` is strictly rejected.\n* **Due Date Format**: Accepts an ISO-8601 date-only format (`YYYY-MM-DD`). Pass `\"\"` or omit the field to skip setting a due date.\n* **Project Binding**: Every todo must belong to a valid active project (`project_id`).\n\n### ⚠️ Common Errors & Troubleshooting\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing, if `due_at` violates the `YYYY-MM-DD` format, or if `title` exceeds 500 characters.\n* **`PARENT_IS_CHILD` (HTTP 400)**: Thrown if the target `parent_id` refers to a todo that is itself already a child todo.\n* **`WOULD_CREATE_CYCLE` (HTTP 400)**: Thrown if `parent_id` points to the todo's own ID.\n* **`NOT_FOUND` (HTTP 404)**: Thrown if the specified `project_id` or `parent_id` does not exist or has been soft-deleted.",
|
|
22150
|
+
"security": [
|
|
22151
|
+
{
|
|
22152
|
+
"bearerAuth": []
|
|
22153
|
+
}
|
|
22154
|
+
],
|
|
22155
|
+
"x-codeSamples": [
|
|
22156
|
+
{
|
|
22157
|
+
"lang": "shell",
|
|
22158
|
+
"label": "curl",
|
|
22159
|
+
"source": "curl -X POST https://api.wspc.ai/todo/items \\\n -H \"Authorization: Bearer $WSPC_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"title\":\"Buy milk\",\"due_at\":\"2026-06-01\"}'"
|
|
22160
|
+
},
|
|
22161
|
+
{
|
|
22162
|
+
"lang": "bash",
|
|
22163
|
+
"label": "wspc CLI",
|
|
22164
|
+
"source": "wspc todo add \"Buy milk\" --due 2026-06-01"
|
|
22165
|
+
}
|
|
22166
|
+
],
|
|
22167
|
+
"requestBody": {
|
|
22168
|
+
"content": {
|
|
22169
|
+
"application/json": {
|
|
22170
|
+
"schema": {
|
|
22171
|
+
"$ref": "#/components/schemas/CreateTodoBody"
|
|
22172
|
+
},
|
|
22173
|
+
"examples": {
|
|
22174
|
+
"minimal": {
|
|
22175
|
+
"summary": "Create a root-level todo with just a title",
|
|
22176
|
+
"value": {
|
|
22177
|
+
"title": "Buy milk"
|
|
22178
|
+
}
|
|
22179
|
+
},
|
|
22180
|
+
"full": {
|
|
22181
|
+
"summary": "Create a child todo with description, status, and due date",
|
|
22182
|
+
"value": {
|
|
22183
|
+
"title": "Draft outline",
|
|
22184
|
+
"description": "See PRD for context",
|
|
22185
|
+
"parent_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22186
|
+
"status": "in_progress",
|
|
22187
|
+
"due_at": "2026-06-01"
|
|
22188
|
+
}
|
|
22189
|
+
}
|
|
22190
|
+
}
|
|
22191
|
+
}
|
|
22192
|
+
}
|
|
22193
|
+
},
|
|
22194
|
+
"responses": {
|
|
22195
|
+
"201": {
|
|
22196
|
+
"description": "The todo was created. The response carries the full row including server-assigned `id`, `version`, and `created_at`.",
|
|
22197
|
+
"content": {
|
|
22198
|
+
"application/json": {
|
|
22199
|
+
"schema": {
|
|
22200
|
+
"$ref": "#/components/schemas/Todo"
|
|
22201
|
+
},
|
|
22202
|
+
"examples": {
|
|
22203
|
+
"happyPath": {
|
|
22204
|
+
"summary": "Active todo with a due date",
|
|
22205
|
+
"value": {
|
|
22206
|
+
"id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22207
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22208
|
+
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22209
|
+
"title": "Buy milk",
|
|
22210
|
+
"description": "Use refundable rate",
|
|
22211
|
+
"status": "open",
|
|
22212
|
+
"parent_id": null,
|
|
22213
|
+
"child_count": 0,
|
|
22214
|
+
"version": 1,
|
|
22215
|
+
"created_at": 1748736000000,
|
|
22216
|
+
"updated_at": 1748736000000,
|
|
22217
|
+
"due_at": "2026-06-01"
|
|
22218
|
+
}
|
|
22219
|
+
}
|
|
22220
|
+
}
|
|
22221
|
+
}
|
|
22222
|
+
}
|
|
22223
|
+
},
|
|
22224
|
+
"400": {
|
|
22225
|
+
"description": "Request validation failed. The body, query, or path parameters did not match the operation's schema.",
|
|
22226
|
+
"content": {
|
|
22227
|
+
"application/json": {
|
|
22228
|
+
"schema": {
|
|
22229
|
+
"type": "object",
|
|
22230
|
+
"properties": {
|
|
22231
|
+
"error": {
|
|
22232
|
+
"type": "object",
|
|
22233
|
+
"properties": {
|
|
22234
|
+
"code": {
|
|
22235
|
+
"type": "string"
|
|
22236
|
+
},
|
|
22237
|
+
"message": {
|
|
22238
|
+
"type": "string"
|
|
22239
|
+
},
|
|
22240
|
+
"extra": {
|
|
22241
|
+
"type": "object",
|
|
22242
|
+
"additionalProperties": {}
|
|
22243
|
+
}
|
|
22244
|
+
},
|
|
22245
|
+
"required": [
|
|
22246
|
+
"code",
|
|
22247
|
+
"message"
|
|
22248
|
+
]
|
|
22249
|
+
}
|
|
22250
|
+
},
|
|
22251
|
+
"required": [
|
|
22252
|
+
"error"
|
|
22253
|
+
]
|
|
22254
|
+
},
|
|
22255
|
+
"examples": {
|
|
22256
|
+
"validationError": {
|
|
22257
|
+
"summary": "Body failed schema validation",
|
|
22258
|
+
"value": {
|
|
22259
|
+
"error": {
|
|
22260
|
+
"code": "VALIDATION_ERROR",
|
|
22261
|
+
"message": "title must not be empty"
|
|
22262
|
+
}
|
|
22263
|
+
}
|
|
22264
|
+
}
|
|
22265
|
+
}
|
|
22266
|
+
}
|
|
22267
|
+
}
|
|
22268
|
+
},
|
|
22269
|
+
"401": {
|
|
22270
|
+
"description": "Authentication is required but missing or invalid. The Bearer token (API key or OAuth access token) was absent, malformed, or rejected.",
|
|
22271
|
+
"content": {
|
|
22272
|
+
"application/json": {
|
|
22273
|
+
"schema": {
|
|
22274
|
+
"type": "object",
|
|
22275
|
+
"properties": {
|
|
22276
|
+
"error": {
|
|
22277
|
+
"type": "object",
|
|
22278
|
+
"properties": {
|
|
22279
|
+
"code": {
|
|
22280
|
+
"type": "string"
|
|
22281
|
+
},
|
|
22282
|
+
"message": {
|
|
22283
|
+
"type": "string"
|
|
22284
|
+
},
|
|
22285
|
+
"extra": {
|
|
22286
|
+
"type": "object",
|
|
22287
|
+
"additionalProperties": {}
|
|
22288
|
+
}
|
|
22289
|
+
},
|
|
22290
|
+
"required": [
|
|
22291
|
+
"code",
|
|
22292
|
+
"message"
|
|
22293
|
+
]
|
|
22294
|
+
}
|
|
22295
|
+
},
|
|
22296
|
+
"required": [
|
|
22297
|
+
"error"
|
|
22298
|
+
]
|
|
22299
|
+
},
|
|
22300
|
+
"examples": {
|
|
22301
|
+
"authRequired": {
|
|
22302
|
+
"summary": "Missing Authorization header",
|
|
22303
|
+
"value": {
|
|
22304
|
+
"error": {
|
|
22305
|
+
"code": "AUTH_REQUIRED",
|
|
22306
|
+
"message": "missing bearer token"
|
|
22307
|
+
}
|
|
22308
|
+
}
|
|
22309
|
+
}
|
|
22310
|
+
}
|
|
22311
|
+
}
|
|
22312
|
+
}
|
|
22313
|
+
},
|
|
22314
|
+
"403": {
|
|
22315
|
+
"description": "The caller is authenticated but not permitted to perform this operation on the target resource.",
|
|
22316
|
+
"content": {
|
|
22317
|
+
"application/json": {
|
|
22318
|
+
"schema": {
|
|
22319
|
+
"type": "object",
|
|
22320
|
+
"properties": {
|
|
22321
|
+
"error": {
|
|
22322
|
+
"type": "object",
|
|
22323
|
+
"properties": {
|
|
22324
|
+
"code": {
|
|
22325
|
+
"type": "string"
|
|
22326
|
+
},
|
|
22327
|
+
"message": {
|
|
22328
|
+
"type": "string"
|
|
22329
|
+
},
|
|
22330
|
+
"extra": {
|
|
22331
|
+
"type": "object",
|
|
22332
|
+
"additionalProperties": {}
|
|
22333
|
+
}
|
|
22334
|
+
},
|
|
22335
|
+
"required": [
|
|
22336
|
+
"code",
|
|
22337
|
+
"message"
|
|
22338
|
+
]
|
|
22339
|
+
}
|
|
22340
|
+
},
|
|
22341
|
+
"required": [
|
|
22342
|
+
"error"
|
|
22343
|
+
]
|
|
22344
|
+
},
|
|
22345
|
+
"examples": {
|
|
22346
|
+
"forbidden": {
|
|
22347
|
+
"summary": "Caller does not own the resource",
|
|
22348
|
+
"value": {
|
|
22349
|
+
"error": {
|
|
22350
|
+
"code": "FORBIDDEN",
|
|
22351
|
+
"message": "not allowed"
|
|
22352
|
+
}
|
|
22353
|
+
}
|
|
22354
|
+
}
|
|
22355
|
+
}
|
|
22356
|
+
}
|
|
22357
|
+
}
|
|
22358
|
+
},
|
|
22359
|
+
"404": {
|
|
22360
|
+
"description": "The target resource does not exist or is not visible to the caller. Soft-deleted resources are treated as not found unless an `include_deleted` flag is set.",
|
|
22361
|
+
"content": {
|
|
22362
|
+
"application/json": {
|
|
22363
|
+
"schema": {
|
|
22364
|
+
"type": "object",
|
|
22365
|
+
"properties": {
|
|
22366
|
+
"error": {
|
|
22367
|
+
"type": "object",
|
|
22368
|
+
"properties": {
|
|
22369
|
+
"code": {
|
|
22370
|
+
"type": "string"
|
|
22371
|
+
},
|
|
22372
|
+
"message": {
|
|
22373
|
+
"type": "string"
|
|
22374
|
+
},
|
|
22375
|
+
"extra": {
|
|
22376
|
+
"type": "object",
|
|
22377
|
+
"additionalProperties": {}
|
|
22378
|
+
}
|
|
22379
|
+
},
|
|
22380
|
+
"required": [
|
|
22381
|
+
"code",
|
|
22382
|
+
"message"
|
|
22383
|
+
]
|
|
22384
|
+
}
|
|
22385
|
+
},
|
|
22386
|
+
"required": [
|
|
22387
|
+
"error"
|
|
22388
|
+
]
|
|
22389
|
+
},
|
|
22390
|
+
"examples": {
|
|
22391
|
+
"notFound": {
|
|
22392
|
+
"summary": "Resource id is unknown to the service",
|
|
22393
|
+
"value": {
|
|
22394
|
+
"error": {
|
|
22395
|
+
"code": "NOT_FOUND",
|
|
22396
|
+
"message": "todo not found"
|
|
22397
|
+
}
|
|
22398
|
+
}
|
|
22399
|
+
}
|
|
22400
|
+
}
|
|
22401
|
+
}
|
|
22402
|
+
}
|
|
22403
|
+
},
|
|
22404
|
+
"409": {
|
|
22405
|
+
"description": "Optimistic-lock conflict. The supplied `expected_version` does not match the server's current version. Refetch the resource and retry.",
|
|
22406
|
+
"content": {
|
|
22407
|
+
"application/json": {
|
|
22408
|
+
"schema": {
|
|
22409
|
+
"type": "object",
|
|
22410
|
+
"properties": {
|
|
22411
|
+
"error": {
|
|
22412
|
+
"type": "object",
|
|
22413
|
+
"properties": {
|
|
22414
|
+
"code": {
|
|
22415
|
+
"type": "string"
|
|
22416
|
+
},
|
|
22417
|
+
"message": {
|
|
22418
|
+
"type": "string"
|
|
22419
|
+
},
|
|
22420
|
+
"extra": {
|
|
22421
|
+
"type": "object",
|
|
22422
|
+
"additionalProperties": {}
|
|
22423
|
+
}
|
|
22424
|
+
},
|
|
22425
|
+
"required": [
|
|
22426
|
+
"code",
|
|
22427
|
+
"message"
|
|
22428
|
+
]
|
|
22429
|
+
}
|
|
22430
|
+
},
|
|
22431
|
+
"required": [
|
|
22432
|
+
"error"
|
|
22433
|
+
]
|
|
22434
|
+
},
|
|
22435
|
+
"examples": {
|
|
22436
|
+
"versionConflict": {
|
|
22437
|
+
"summary": "expected_version does not match server version",
|
|
22438
|
+
"value": {
|
|
22439
|
+
"error": {
|
|
22440
|
+
"code": "VERSION_CONFLICT",
|
|
22441
|
+
"message": "expected_version 3 but current is 4",
|
|
22442
|
+
"extra": {
|
|
22443
|
+
"expected_version": 3,
|
|
22444
|
+
"actual_version": 4
|
|
22445
|
+
}
|
|
22446
|
+
}
|
|
22447
|
+
}
|
|
22448
|
+
}
|
|
22449
|
+
}
|
|
22450
|
+
}
|
|
22451
|
+
}
|
|
22452
|
+
},
|
|
22453
|
+
"429": {
|
|
22454
|
+
"description": "Rate limit exceeded. Retry after the duration in `error.extra.retry_after_seconds`. `limit_kind` identifies which bucket was exhausted.",
|
|
22455
|
+
"content": {
|
|
22456
|
+
"application/json": {
|
|
22457
|
+
"schema": {
|
|
22458
|
+
"type": "object",
|
|
22459
|
+
"properties": {
|
|
22460
|
+
"error": {
|
|
22461
|
+
"type": "object",
|
|
22462
|
+
"properties": {
|
|
22463
|
+
"code": {
|
|
22464
|
+
"type": "string"
|
|
22465
|
+
},
|
|
22466
|
+
"message": {
|
|
22467
|
+
"type": "string"
|
|
22468
|
+
},
|
|
22469
|
+
"extra": {
|
|
22470
|
+
"type": "object",
|
|
22471
|
+
"additionalProperties": {}
|
|
22472
|
+
}
|
|
22473
|
+
},
|
|
22474
|
+
"required": [
|
|
22475
|
+
"code",
|
|
22476
|
+
"message"
|
|
22477
|
+
]
|
|
22478
|
+
}
|
|
22479
|
+
},
|
|
22480
|
+
"required": [
|
|
22481
|
+
"error"
|
|
22482
|
+
]
|
|
22483
|
+
},
|
|
22484
|
+
"examples": {
|
|
22485
|
+
"rateLimited": {
|
|
22486
|
+
"summary": "Per-key rate limit hit",
|
|
22487
|
+
"value": {
|
|
22488
|
+
"error": {
|
|
22489
|
+
"code": "RATE_LIMITED",
|
|
22490
|
+
"message": "rate limit exceeded",
|
|
22491
|
+
"extra": {
|
|
22492
|
+
"retry_after_seconds": 60,
|
|
22493
|
+
"limit_kind": "authenticated_per_key"
|
|
22494
|
+
}
|
|
22495
|
+
}
|
|
22496
|
+
}
|
|
22497
|
+
}
|
|
22498
|
+
}
|
|
22499
|
+
}
|
|
22500
|
+
}
|
|
22501
|
+
},
|
|
22502
|
+
"500": {
|
|
22503
|
+
"description": "Unhandled server error. The request was well-formed but the service failed unexpectedly. Safe to retry idempotent operations.",
|
|
22504
|
+
"content": {
|
|
22505
|
+
"application/json": {
|
|
22506
|
+
"schema": {
|
|
22507
|
+
"type": "object",
|
|
22508
|
+
"properties": {
|
|
22509
|
+
"error": {
|
|
22510
|
+
"type": "object",
|
|
22511
|
+
"properties": {
|
|
22512
|
+
"code": {
|
|
22513
|
+
"type": "string"
|
|
22514
|
+
},
|
|
22515
|
+
"message": {
|
|
22516
|
+
"type": "string"
|
|
22517
|
+
},
|
|
22518
|
+
"extra": {
|
|
22519
|
+
"type": "object",
|
|
22520
|
+
"additionalProperties": {}
|
|
22521
|
+
}
|
|
22522
|
+
},
|
|
22523
|
+
"required": [
|
|
22524
|
+
"code",
|
|
22525
|
+
"message"
|
|
22526
|
+
]
|
|
22527
|
+
}
|
|
22528
|
+
},
|
|
22529
|
+
"required": [
|
|
22530
|
+
"error"
|
|
22531
|
+
]
|
|
22532
|
+
},
|
|
22533
|
+
"examples": {
|
|
22534
|
+
"internalError": {
|
|
22535
|
+
"summary": "Unhandled exception",
|
|
22536
|
+
"value": {
|
|
22537
|
+
"error": {
|
|
22538
|
+
"code": "INTERNAL_ERROR",
|
|
22539
|
+
"message": "internal error"
|
|
22540
|
+
}
|
|
22541
|
+
}
|
|
22542
|
+
}
|
|
22543
|
+
}
|
|
22544
|
+
}
|
|
22545
|
+
}
|
|
22546
|
+
}
|
|
22547
|
+
}
|
|
22548
|
+
},
|
|
22549
|
+
"get": {
|
|
22550
|
+
"operationId": "todo_list",
|
|
22551
|
+
"tags": [
|
|
22552
|
+
"Todos"
|
|
22553
|
+
],
|
|
22554
|
+
"x-cli": {
|
|
22555
|
+
"command": "todo ls",
|
|
22556
|
+
"aliases": {
|
|
22557
|
+
"project": "p",
|
|
22558
|
+
"status": "s"
|
|
22559
|
+
},
|
|
22560
|
+
"examples": [
|
|
22561
|
+
"wspc todo ls",
|
|
22562
|
+
"wspc todo ls --status open",
|
|
22563
|
+
"wspc todo ls --project prj_xxx"
|
|
22564
|
+
],
|
|
22565
|
+
"display": {
|
|
22566
|
+
"shape": "list",
|
|
22567
|
+
"columns": [
|
|
22568
|
+
"id",
|
|
22569
|
+
"status",
|
|
22570
|
+
"title",
|
|
22571
|
+
"due_at"
|
|
22572
|
+
],
|
|
22573
|
+
"format": {
|
|
22574
|
+
"id": "id-short",
|
|
22575
|
+
"status": "status-badge",
|
|
22576
|
+
"title": "truncate",
|
|
22577
|
+
"due_at": "relative-time"
|
|
22578
|
+
},
|
|
22579
|
+
"emptyMessage": "no todos"
|
|
22580
|
+
}
|
|
22581
|
+
},
|
|
22582
|
+
"summary": "List todos with filters",
|
|
22583
|
+
"description": "### 🎯 Overview & Purpose\nReturn the caller's active or archived todos, with comprehensive options to filter by project, parent task, status, due-date window, and template visibility.\n\n### 🔍 When to Use\n* Use this to render the main todo board dashboard, query items due in a specific timeframe (using `due_after` and `due_before`), or lazy-load subtasks for an expanded parent todo by passing its ID.\n\n### 💡 Key Features & Constraints\n* **Required Parameter**: The `project_id` query parameter is strictly required and must match an active project.\n* **Parent Tasks**: Omitting `parent_id` lists root-level todos by default. Pass a todo id to list direct children of that specific task.\n* **Multi-Status Filters**: Multi-value `status` query is supported by repeating the parameter, e.g., `?status=open&status=in_progress`.\n* **Due-Date Windowing**: The `due_after` filter is inclusive, while `due_before` is exclusive, forming a half-open window `[due_after, due_before)`. Both parameters exclude todos with no due date.\n* **Template & Soft-Delete Visibility**: Soft-deleted todos are hidden unless `include_deleted=true`. Template todos backing recurrence rules are hidden unless `include_templates=true`.\n* **Custom-Field Filters (`cf.<key>=<value>`)**: Repeatable dynamic-prefix query parameters whose name follows the `cf.<key>` pattern (e.g. `?cf.priority=high&cf.team=eng`). Each pair is ANDed; for `string_array` custom fields the match is positive when the array contains the value. Keys must be declared on the project's todo type schema. Because the prefix is dynamic, these parameters cannot be expressed in the JSON Schema below — clients must construct them from the URL query string directly.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` is missing, or if query parameters fail schema validation.",
|
|
22584
|
+
"security": [
|
|
22585
|
+
{
|
|
22586
|
+
"bearerAuth": []
|
|
22587
|
+
}
|
|
22588
|
+
],
|
|
22589
|
+
"x-codeSamples": [
|
|
22590
|
+
{
|
|
22591
|
+
"lang": "shell",
|
|
22592
|
+
"label": "curl",
|
|
22593
|
+
"source": "curl -G https://api.wspc.ai/todo/items \\\n -H \"Authorization: Bearer $WSPC_API_KEY\" \\\n --data-urlencode \"status=open\" \\\n --data-urlencode \"status=in_progress\""
|
|
22594
|
+
},
|
|
22595
|
+
{
|
|
22596
|
+
"lang": "bash",
|
|
22597
|
+
"label": "wspc CLI",
|
|
22598
|
+
"source": "wspc todo ls --status open in_progress"
|
|
22599
|
+
}
|
|
22600
|
+
],
|
|
22601
|
+
"parameters": [
|
|
22602
|
+
{
|
|
22603
|
+
"schema": {
|
|
22604
|
+
"type": "string",
|
|
22605
|
+
"minLength": 1,
|
|
22606
|
+
"description": "Filter by project. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND."
|
|
22607
|
+
},
|
|
22608
|
+
"required": true,
|
|
22609
|
+
"description": "Filter by project. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND.",
|
|
22610
|
+
"name": "project_id",
|
|
22611
|
+
"in": "query"
|
|
22612
|
+
},
|
|
22613
|
+
{
|
|
22614
|
+
"schema": {
|
|
22615
|
+
"type": "string"
|
|
22616
|
+
},
|
|
22617
|
+
"required": false,
|
|
22618
|
+
"name": "user_id",
|
|
22619
|
+
"in": "query"
|
|
22620
|
+
},
|
|
22621
|
+
{
|
|
22622
|
+
"schema": {
|
|
22623
|
+
"type": "string"
|
|
22624
|
+
},
|
|
22625
|
+
"required": false,
|
|
22626
|
+
"name": "parent_id",
|
|
22627
|
+
"in": "query"
|
|
22628
|
+
},
|
|
22629
|
+
{
|
|
22630
|
+
"schema": {
|
|
22631
|
+
"anyOf": [
|
|
22632
|
+
{
|
|
22633
|
+
"type": "string"
|
|
22634
|
+
},
|
|
22635
|
+
{
|
|
22636
|
+
"type": "array",
|
|
22637
|
+
"items": {
|
|
22638
|
+
"type": "string"
|
|
22639
|
+
}
|
|
22640
|
+
}
|
|
22641
|
+
]
|
|
22642
|
+
},
|
|
22643
|
+
"required": false,
|
|
22644
|
+
"name": "status",
|
|
22645
|
+
"in": "query"
|
|
22646
|
+
},
|
|
22647
|
+
{
|
|
22648
|
+
"schema": {
|
|
22649
|
+
"anyOf": [
|
|
22650
|
+
{
|
|
22651
|
+
"type": "string"
|
|
22652
|
+
},
|
|
22653
|
+
{
|
|
22654
|
+
"type": "array",
|
|
22655
|
+
"items": {
|
|
22656
|
+
"type": "string"
|
|
22657
|
+
}
|
|
22658
|
+
}
|
|
22659
|
+
]
|
|
22660
|
+
},
|
|
22661
|
+
"required": false,
|
|
22662
|
+
"name": "include_deleted",
|
|
22663
|
+
"in": "query"
|
|
22664
|
+
},
|
|
22665
|
+
{
|
|
22666
|
+
"schema": {
|
|
22667
|
+
"anyOf": [
|
|
22668
|
+
{
|
|
22669
|
+
"type": "string"
|
|
22670
|
+
},
|
|
22671
|
+
{
|
|
22672
|
+
"type": "array",
|
|
22673
|
+
"items": {
|
|
22674
|
+
"type": "string"
|
|
22675
|
+
}
|
|
22676
|
+
}
|
|
22677
|
+
]
|
|
22678
|
+
},
|
|
22679
|
+
"required": false,
|
|
22680
|
+
"name": "include_templates",
|
|
22681
|
+
"in": "query"
|
|
22682
|
+
},
|
|
22683
|
+
{
|
|
22684
|
+
"schema": {
|
|
22685
|
+
"type": "string"
|
|
22686
|
+
},
|
|
22687
|
+
"required": false,
|
|
22688
|
+
"name": "due_after",
|
|
22689
|
+
"in": "query"
|
|
22690
|
+
},
|
|
22691
|
+
{
|
|
22692
|
+
"schema": {
|
|
22693
|
+
"type": "string"
|
|
22694
|
+
},
|
|
22695
|
+
"required": false,
|
|
22696
|
+
"name": "due_before",
|
|
22697
|
+
"in": "query"
|
|
22698
|
+
},
|
|
22699
|
+
{
|
|
22700
|
+
"schema": {
|
|
22701
|
+
"type": "string",
|
|
22702
|
+
"minLength": 1
|
|
22703
|
+
},
|
|
22704
|
+
"required": false,
|
|
22705
|
+
"name": "type_id",
|
|
22706
|
+
"in": "query"
|
|
22707
|
+
},
|
|
22708
|
+
{
|
|
22709
|
+
"schema": {
|
|
22710
|
+
"type": "string",
|
|
22711
|
+
"minLength": 1
|
|
22712
|
+
},
|
|
22713
|
+
"required": false,
|
|
22714
|
+
"name": "sort_by",
|
|
22715
|
+
"in": "query"
|
|
22716
|
+
},
|
|
22717
|
+
{
|
|
22718
|
+
"schema": {
|
|
22719
|
+
"type": "string",
|
|
22720
|
+
"enum": [
|
|
22721
|
+
"asc",
|
|
22722
|
+
"desc"
|
|
22723
|
+
]
|
|
22724
|
+
},
|
|
22725
|
+
"required": false,
|
|
22726
|
+
"name": "order",
|
|
22727
|
+
"in": "query"
|
|
22728
|
+
},
|
|
22729
|
+
{
|
|
22730
|
+
"schema": {
|
|
22731
|
+
"anyOf": [
|
|
22732
|
+
{
|
|
22733
|
+
"type": "string"
|
|
22734
|
+
},
|
|
22735
|
+
{
|
|
22736
|
+
"type": "array",
|
|
22737
|
+
"items": {
|
|
22738
|
+
"type": "string"
|
|
22739
|
+
}
|
|
22740
|
+
}
|
|
22741
|
+
]
|
|
22742
|
+
},
|
|
22743
|
+
"required": false,
|
|
22744
|
+
"name": "include_orphan_fields",
|
|
22019
22745
|
"in": "query"
|
|
22746
|
+
}
|
|
22747
|
+
],
|
|
22748
|
+
"responses": {
|
|
22749
|
+
"200": {
|
|
22750
|
+
"description": "List of todos matching the filters. Empty `todos` array when nothing matches.",
|
|
22751
|
+
"content": {
|
|
22752
|
+
"application/json": {
|
|
22753
|
+
"schema": {
|
|
22754
|
+
"$ref": "#/components/schemas/ListTodosResponse"
|
|
22755
|
+
},
|
|
22756
|
+
"examples": {
|
|
22757
|
+
"happyPath": {
|
|
22758
|
+
"summary": "Two active root-level todos",
|
|
22759
|
+
"value": {
|
|
22760
|
+
"todos": [
|
|
22761
|
+
{
|
|
22762
|
+
"id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22763
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22764
|
+
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22765
|
+
"title": "Buy milk",
|
|
22766
|
+
"description": "Use refundable rate",
|
|
22767
|
+
"status": "open",
|
|
22768
|
+
"parent_id": null,
|
|
22769
|
+
"child_count": 0,
|
|
22770
|
+
"version": 1,
|
|
22771
|
+
"created_at": 1748736000000,
|
|
22772
|
+
"updated_at": 1748736000000,
|
|
22773
|
+
"due_at": "2026-06-01"
|
|
22774
|
+
},
|
|
22775
|
+
{
|
|
22776
|
+
"id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3G",
|
|
22777
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22778
|
+
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22779
|
+
"title": "Submit expenses",
|
|
22780
|
+
"status": "in_progress",
|
|
22781
|
+
"parent_id": null,
|
|
22782
|
+
"child_count": 0,
|
|
22783
|
+
"version": 1,
|
|
22784
|
+
"created_at": 1748736000000,
|
|
22785
|
+
"updated_at": 1748736000000
|
|
22786
|
+
}
|
|
22787
|
+
]
|
|
22788
|
+
}
|
|
22789
|
+
},
|
|
22790
|
+
"empty": {
|
|
22791
|
+
"summary": "No matching todos",
|
|
22792
|
+
"value": {
|
|
22793
|
+
"todos": []
|
|
22794
|
+
}
|
|
22795
|
+
}
|
|
22796
|
+
}
|
|
22797
|
+
}
|
|
22798
|
+
}
|
|
22799
|
+
},
|
|
22800
|
+
"400": {
|
|
22801
|
+
"description": "Request validation failed. The body, query, or path parameters did not match the operation's schema.",
|
|
22802
|
+
"content": {
|
|
22803
|
+
"application/json": {
|
|
22804
|
+
"schema": {
|
|
22805
|
+
"type": "object",
|
|
22806
|
+
"properties": {
|
|
22807
|
+
"error": {
|
|
22808
|
+
"type": "object",
|
|
22809
|
+
"properties": {
|
|
22810
|
+
"code": {
|
|
22811
|
+
"type": "string"
|
|
22812
|
+
},
|
|
22813
|
+
"message": {
|
|
22814
|
+
"type": "string"
|
|
22815
|
+
},
|
|
22816
|
+
"extra": {
|
|
22817
|
+
"type": "object",
|
|
22818
|
+
"additionalProperties": {}
|
|
22819
|
+
}
|
|
22820
|
+
},
|
|
22821
|
+
"required": [
|
|
22822
|
+
"code",
|
|
22823
|
+
"message"
|
|
22824
|
+
]
|
|
22825
|
+
}
|
|
22826
|
+
},
|
|
22827
|
+
"required": [
|
|
22828
|
+
"error"
|
|
22829
|
+
]
|
|
22830
|
+
},
|
|
22831
|
+
"examples": {
|
|
22832
|
+
"validationError": {
|
|
22833
|
+
"summary": "Body failed schema validation",
|
|
22834
|
+
"value": {
|
|
22835
|
+
"error": {
|
|
22836
|
+
"code": "VALIDATION_ERROR",
|
|
22837
|
+
"message": "title must not be empty"
|
|
22838
|
+
}
|
|
22839
|
+
}
|
|
22840
|
+
}
|
|
22841
|
+
}
|
|
22842
|
+
}
|
|
22843
|
+
}
|
|
22844
|
+
},
|
|
22845
|
+
"401": {
|
|
22846
|
+
"description": "Authentication is required but missing or invalid. The Bearer token (API key or OAuth access token) was absent, malformed, or rejected.",
|
|
22847
|
+
"content": {
|
|
22848
|
+
"application/json": {
|
|
22849
|
+
"schema": {
|
|
22850
|
+
"type": "object",
|
|
22851
|
+
"properties": {
|
|
22852
|
+
"error": {
|
|
22853
|
+
"type": "object",
|
|
22854
|
+
"properties": {
|
|
22855
|
+
"code": {
|
|
22856
|
+
"type": "string"
|
|
22857
|
+
},
|
|
22858
|
+
"message": {
|
|
22859
|
+
"type": "string"
|
|
22860
|
+
},
|
|
22861
|
+
"extra": {
|
|
22862
|
+
"type": "object",
|
|
22863
|
+
"additionalProperties": {}
|
|
22864
|
+
}
|
|
22865
|
+
},
|
|
22866
|
+
"required": [
|
|
22867
|
+
"code",
|
|
22868
|
+
"message"
|
|
22869
|
+
]
|
|
22870
|
+
}
|
|
22871
|
+
},
|
|
22872
|
+
"required": [
|
|
22873
|
+
"error"
|
|
22874
|
+
]
|
|
22875
|
+
},
|
|
22876
|
+
"examples": {
|
|
22877
|
+
"authRequired": {
|
|
22878
|
+
"summary": "Missing Authorization header",
|
|
22879
|
+
"value": {
|
|
22880
|
+
"error": {
|
|
22881
|
+
"code": "AUTH_REQUIRED",
|
|
22882
|
+
"message": "missing bearer token"
|
|
22883
|
+
}
|
|
22884
|
+
}
|
|
22885
|
+
}
|
|
22886
|
+
}
|
|
22887
|
+
}
|
|
22888
|
+
}
|
|
22889
|
+
},
|
|
22890
|
+
"403": {
|
|
22891
|
+
"description": "The caller is authenticated but not permitted to perform this operation on the target resource.",
|
|
22892
|
+
"content": {
|
|
22893
|
+
"application/json": {
|
|
22894
|
+
"schema": {
|
|
22895
|
+
"type": "object",
|
|
22896
|
+
"properties": {
|
|
22897
|
+
"error": {
|
|
22898
|
+
"type": "object",
|
|
22899
|
+
"properties": {
|
|
22900
|
+
"code": {
|
|
22901
|
+
"type": "string"
|
|
22902
|
+
},
|
|
22903
|
+
"message": {
|
|
22904
|
+
"type": "string"
|
|
22905
|
+
},
|
|
22906
|
+
"extra": {
|
|
22907
|
+
"type": "object",
|
|
22908
|
+
"additionalProperties": {}
|
|
22909
|
+
}
|
|
22910
|
+
},
|
|
22911
|
+
"required": [
|
|
22912
|
+
"code",
|
|
22913
|
+
"message"
|
|
22914
|
+
]
|
|
22915
|
+
}
|
|
22916
|
+
},
|
|
22917
|
+
"required": [
|
|
22918
|
+
"error"
|
|
22919
|
+
]
|
|
22920
|
+
},
|
|
22921
|
+
"examples": {
|
|
22922
|
+
"forbidden": {
|
|
22923
|
+
"summary": "Caller does not own the resource",
|
|
22924
|
+
"value": {
|
|
22925
|
+
"error": {
|
|
22926
|
+
"code": "FORBIDDEN",
|
|
22927
|
+
"message": "not allowed"
|
|
22928
|
+
}
|
|
22929
|
+
}
|
|
22930
|
+
}
|
|
22931
|
+
}
|
|
22932
|
+
}
|
|
22933
|
+
}
|
|
22934
|
+
},
|
|
22935
|
+
"404": {
|
|
22936
|
+
"description": "The target resource does not exist or is not visible to the caller. Soft-deleted resources are treated as not found unless an `include_deleted` flag is set.",
|
|
22937
|
+
"content": {
|
|
22938
|
+
"application/json": {
|
|
22939
|
+
"schema": {
|
|
22940
|
+
"type": "object",
|
|
22941
|
+
"properties": {
|
|
22942
|
+
"error": {
|
|
22943
|
+
"type": "object",
|
|
22944
|
+
"properties": {
|
|
22945
|
+
"code": {
|
|
22946
|
+
"type": "string"
|
|
22947
|
+
},
|
|
22948
|
+
"message": {
|
|
22949
|
+
"type": "string"
|
|
22950
|
+
},
|
|
22951
|
+
"extra": {
|
|
22952
|
+
"type": "object",
|
|
22953
|
+
"additionalProperties": {}
|
|
22954
|
+
}
|
|
22955
|
+
},
|
|
22956
|
+
"required": [
|
|
22957
|
+
"code",
|
|
22958
|
+
"message"
|
|
22959
|
+
]
|
|
22960
|
+
}
|
|
22961
|
+
},
|
|
22962
|
+
"required": [
|
|
22963
|
+
"error"
|
|
22964
|
+
]
|
|
22965
|
+
},
|
|
22966
|
+
"examples": {
|
|
22967
|
+
"notFound": {
|
|
22968
|
+
"summary": "Resource id is unknown to the service",
|
|
22969
|
+
"value": {
|
|
22970
|
+
"error": {
|
|
22971
|
+
"code": "NOT_FOUND",
|
|
22972
|
+
"message": "todo not found"
|
|
22973
|
+
}
|
|
22974
|
+
}
|
|
22975
|
+
}
|
|
22976
|
+
}
|
|
22977
|
+
}
|
|
22978
|
+
}
|
|
22979
|
+
},
|
|
22980
|
+
"409": {
|
|
22981
|
+
"description": "Optimistic-lock conflict. The supplied `expected_version` does not match the server's current version. Refetch the resource and retry.",
|
|
22982
|
+
"content": {
|
|
22983
|
+
"application/json": {
|
|
22984
|
+
"schema": {
|
|
22985
|
+
"type": "object",
|
|
22986
|
+
"properties": {
|
|
22987
|
+
"error": {
|
|
22988
|
+
"type": "object",
|
|
22989
|
+
"properties": {
|
|
22990
|
+
"code": {
|
|
22991
|
+
"type": "string"
|
|
22992
|
+
},
|
|
22993
|
+
"message": {
|
|
22994
|
+
"type": "string"
|
|
22995
|
+
},
|
|
22996
|
+
"extra": {
|
|
22997
|
+
"type": "object",
|
|
22998
|
+
"additionalProperties": {}
|
|
22999
|
+
}
|
|
23000
|
+
},
|
|
23001
|
+
"required": [
|
|
23002
|
+
"code",
|
|
23003
|
+
"message"
|
|
23004
|
+
]
|
|
23005
|
+
}
|
|
23006
|
+
},
|
|
23007
|
+
"required": [
|
|
23008
|
+
"error"
|
|
23009
|
+
]
|
|
23010
|
+
},
|
|
23011
|
+
"examples": {
|
|
23012
|
+
"versionConflict": {
|
|
23013
|
+
"summary": "expected_version does not match server version",
|
|
23014
|
+
"value": {
|
|
23015
|
+
"error": {
|
|
23016
|
+
"code": "VERSION_CONFLICT",
|
|
23017
|
+
"message": "expected_version 3 but current is 4",
|
|
23018
|
+
"extra": {
|
|
23019
|
+
"expected_version": 3,
|
|
23020
|
+
"actual_version": 4
|
|
23021
|
+
}
|
|
23022
|
+
}
|
|
23023
|
+
}
|
|
23024
|
+
}
|
|
23025
|
+
}
|
|
23026
|
+
}
|
|
23027
|
+
}
|
|
23028
|
+
},
|
|
23029
|
+
"429": {
|
|
23030
|
+
"description": "Rate limit exceeded. Retry after the duration in `error.extra.retry_after_seconds`. `limit_kind` identifies which bucket was exhausted.",
|
|
23031
|
+
"content": {
|
|
23032
|
+
"application/json": {
|
|
23033
|
+
"schema": {
|
|
23034
|
+
"type": "object",
|
|
23035
|
+
"properties": {
|
|
23036
|
+
"error": {
|
|
23037
|
+
"type": "object",
|
|
23038
|
+
"properties": {
|
|
23039
|
+
"code": {
|
|
23040
|
+
"type": "string"
|
|
23041
|
+
},
|
|
23042
|
+
"message": {
|
|
23043
|
+
"type": "string"
|
|
23044
|
+
},
|
|
23045
|
+
"extra": {
|
|
23046
|
+
"type": "object",
|
|
23047
|
+
"additionalProperties": {}
|
|
23048
|
+
}
|
|
23049
|
+
},
|
|
23050
|
+
"required": [
|
|
23051
|
+
"code",
|
|
23052
|
+
"message"
|
|
23053
|
+
]
|
|
23054
|
+
}
|
|
23055
|
+
},
|
|
23056
|
+
"required": [
|
|
23057
|
+
"error"
|
|
23058
|
+
]
|
|
23059
|
+
},
|
|
23060
|
+
"examples": {
|
|
23061
|
+
"rateLimited": {
|
|
23062
|
+
"summary": "Per-key rate limit hit",
|
|
23063
|
+
"value": {
|
|
23064
|
+
"error": {
|
|
23065
|
+
"code": "RATE_LIMITED",
|
|
23066
|
+
"message": "rate limit exceeded",
|
|
23067
|
+
"extra": {
|
|
23068
|
+
"retry_after_seconds": 60,
|
|
23069
|
+
"limit_kind": "authenticated_per_key"
|
|
23070
|
+
}
|
|
23071
|
+
}
|
|
23072
|
+
}
|
|
23073
|
+
}
|
|
23074
|
+
}
|
|
23075
|
+
}
|
|
23076
|
+
}
|
|
23077
|
+
},
|
|
23078
|
+
"500": {
|
|
23079
|
+
"description": "Unhandled server error. The request was well-formed but the service failed unexpectedly. Safe to retry idempotent operations.",
|
|
23080
|
+
"content": {
|
|
23081
|
+
"application/json": {
|
|
23082
|
+
"schema": {
|
|
23083
|
+
"type": "object",
|
|
23084
|
+
"properties": {
|
|
23085
|
+
"error": {
|
|
23086
|
+
"type": "object",
|
|
23087
|
+
"properties": {
|
|
23088
|
+
"code": {
|
|
23089
|
+
"type": "string"
|
|
23090
|
+
},
|
|
23091
|
+
"message": {
|
|
23092
|
+
"type": "string"
|
|
23093
|
+
},
|
|
23094
|
+
"extra": {
|
|
23095
|
+
"type": "object",
|
|
23096
|
+
"additionalProperties": {}
|
|
23097
|
+
}
|
|
23098
|
+
},
|
|
23099
|
+
"required": [
|
|
23100
|
+
"code",
|
|
23101
|
+
"message"
|
|
23102
|
+
]
|
|
23103
|
+
}
|
|
23104
|
+
},
|
|
23105
|
+
"required": [
|
|
23106
|
+
"error"
|
|
23107
|
+
]
|
|
23108
|
+
},
|
|
23109
|
+
"examples": {
|
|
23110
|
+
"internalError": {
|
|
23111
|
+
"summary": "Unhandled exception",
|
|
23112
|
+
"value": {
|
|
23113
|
+
"error": {
|
|
23114
|
+
"code": "INTERNAL_ERROR",
|
|
23115
|
+
"message": "internal error"
|
|
23116
|
+
}
|
|
23117
|
+
}
|
|
23118
|
+
}
|
|
23119
|
+
}
|
|
23120
|
+
}
|
|
23121
|
+
}
|
|
23122
|
+
}
|
|
23123
|
+
}
|
|
23124
|
+
}
|
|
23125
|
+
},
|
|
23126
|
+
"/todo/types": {
|
|
23127
|
+
"post": {
|
|
23128
|
+
"operationId": "todo_type_create",
|
|
23129
|
+
"tags": [
|
|
23130
|
+
"TodoTypes"
|
|
23131
|
+
],
|
|
23132
|
+
"x-cli": {
|
|
23133
|
+
"command": "_internal",
|
|
23134
|
+
"hidden": true
|
|
23135
|
+
},
|
|
23136
|
+
"summary": "Create a todo type",
|
|
23137
|
+
"description": "### 🎯 Overview & Purpose\nCreate a new custom todo type. This allows you to define specialized category schemas (e.g. \"Bug Report\") and configure custom field constraints.\n\n### 🔍 When to Use\n* Use this to set up customized task behaviors (e.g. tracking choices, additional metadata, or enforcing hidden fields) tailored to a project.\n\n### 💡 Key Features & Constraints\n* **Automatic Seeding**: The first project initialization will lazily seed a `Default Project` and a `Default` todo type if they do not already exist.\n* **Metadata Schema**: Custom field keys mapped here are evaluated during task creation/update.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if required fields are missing or schema constraints are violated.",
|
|
23138
|
+
"security": [
|
|
23139
|
+
{
|
|
23140
|
+
"bearerAuth": []
|
|
23141
|
+
}
|
|
23142
|
+
],
|
|
23143
|
+
"x-codeSamples": [
|
|
23144
|
+
{
|
|
23145
|
+
"lang": "shell",
|
|
23146
|
+
"label": "curl",
|
|
23147
|
+
"source": "curl -X POST https://api.wspc.ai/todo/types -H \"Authorization: Bearer $WSPC_API_KEY\" -H \"Content-Type: application/json\" -d '{\"label\":\"Task\"}'"
|
|
23148
|
+
},
|
|
23149
|
+
{
|
|
23150
|
+
"lang": "bash",
|
|
23151
|
+
"label": "wspc CLI",
|
|
23152
|
+
"source": "wspc todo types create \"Task\""
|
|
23153
|
+
}
|
|
23154
|
+
],
|
|
23155
|
+
"requestBody": {
|
|
23156
|
+
"content": {
|
|
23157
|
+
"application/json": {
|
|
23158
|
+
"schema": {
|
|
23159
|
+
"$ref": "#/components/schemas/CreateTodoTypeBody"
|
|
23160
|
+
}
|
|
23161
|
+
}
|
|
23162
|
+
}
|
|
23163
|
+
},
|
|
23164
|
+
"responses": {
|
|
23165
|
+
"201": {
|
|
23166
|
+
"description": "Created",
|
|
23167
|
+
"content": {
|
|
23168
|
+
"application/json": {
|
|
23169
|
+
"schema": {
|
|
23170
|
+
"$ref": "#/components/schemas/TodoType"
|
|
23171
|
+
}
|
|
23172
|
+
}
|
|
23173
|
+
}
|
|
23174
|
+
},
|
|
23175
|
+
"400": {
|
|
23176
|
+
"description": "Request validation failed. The body, query, or path parameters did not match the operation's schema.",
|
|
23177
|
+
"content": {
|
|
23178
|
+
"application/json": {
|
|
23179
|
+
"schema": {
|
|
23180
|
+
"type": "object",
|
|
23181
|
+
"properties": {
|
|
23182
|
+
"error": {
|
|
23183
|
+
"type": "object",
|
|
23184
|
+
"properties": {
|
|
23185
|
+
"code": {
|
|
23186
|
+
"type": "string"
|
|
23187
|
+
},
|
|
23188
|
+
"message": {
|
|
23189
|
+
"type": "string"
|
|
23190
|
+
},
|
|
23191
|
+
"extra": {
|
|
23192
|
+
"type": "object",
|
|
23193
|
+
"additionalProperties": {}
|
|
23194
|
+
}
|
|
23195
|
+
},
|
|
23196
|
+
"required": [
|
|
23197
|
+
"code",
|
|
23198
|
+
"message"
|
|
23199
|
+
]
|
|
23200
|
+
}
|
|
23201
|
+
},
|
|
23202
|
+
"required": [
|
|
23203
|
+
"error"
|
|
23204
|
+
]
|
|
23205
|
+
},
|
|
23206
|
+
"examples": {
|
|
23207
|
+
"validationError": {
|
|
23208
|
+
"summary": "Body failed schema validation",
|
|
23209
|
+
"value": {
|
|
23210
|
+
"error": {
|
|
23211
|
+
"code": "VALIDATION_ERROR",
|
|
23212
|
+
"message": "title must not be empty"
|
|
23213
|
+
}
|
|
23214
|
+
}
|
|
23215
|
+
}
|
|
23216
|
+
}
|
|
23217
|
+
}
|
|
23218
|
+
}
|
|
23219
|
+
},
|
|
23220
|
+
"401": {
|
|
23221
|
+
"description": "Authentication is required but missing or invalid. The Bearer token (API key or OAuth access token) was absent, malformed, or rejected.",
|
|
23222
|
+
"content": {
|
|
23223
|
+
"application/json": {
|
|
23224
|
+
"schema": {
|
|
23225
|
+
"type": "object",
|
|
23226
|
+
"properties": {
|
|
23227
|
+
"error": {
|
|
23228
|
+
"type": "object",
|
|
23229
|
+
"properties": {
|
|
23230
|
+
"code": {
|
|
23231
|
+
"type": "string"
|
|
23232
|
+
},
|
|
23233
|
+
"message": {
|
|
23234
|
+
"type": "string"
|
|
23235
|
+
},
|
|
23236
|
+
"extra": {
|
|
23237
|
+
"type": "object",
|
|
23238
|
+
"additionalProperties": {}
|
|
23239
|
+
}
|
|
23240
|
+
},
|
|
23241
|
+
"required": [
|
|
23242
|
+
"code",
|
|
23243
|
+
"message"
|
|
23244
|
+
]
|
|
23245
|
+
}
|
|
23246
|
+
},
|
|
23247
|
+
"required": [
|
|
23248
|
+
"error"
|
|
23249
|
+
]
|
|
23250
|
+
},
|
|
23251
|
+
"examples": {
|
|
23252
|
+
"authRequired": {
|
|
23253
|
+
"summary": "Missing Authorization header",
|
|
23254
|
+
"value": {
|
|
23255
|
+
"error": {
|
|
23256
|
+
"code": "AUTH_REQUIRED",
|
|
23257
|
+
"message": "missing bearer token"
|
|
23258
|
+
}
|
|
23259
|
+
}
|
|
23260
|
+
}
|
|
23261
|
+
}
|
|
23262
|
+
}
|
|
23263
|
+
}
|
|
23264
|
+
},
|
|
23265
|
+
"403": {
|
|
23266
|
+
"description": "The caller is authenticated but not permitted to perform this operation on the target resource.",
|
|
23267
|
+
"content": {
|
|
23268
|
+
"application/json": {
|
|
23269
|
+
"schema": {
|
|
23270
|
+
"type": "object",
|
|
23271
|
+
"properties": {
|
|
23272
|
+
"error": {
|
|
23273
|
+
"type": "object",
|
|
23274
|
+
"properties": {
|
|
23275
|
+
"code": {
|
|
23276
|
+
"type": "string"
|
|
23277
|
+
},
|
|
23278
|
+
"message": {
|
|
23279
|
+
"type": "string"
|
|
23280
|
+
},
|
|
23281
|
+
"extra": {
|
|
23282
|
+
"type": "object",
|
|
23283
|
+
"additionalProperties": {}
|
|
23284
|
+
}
|
|
23285
|
+
},
|
|
23286
|
+
"required": [
|
|
23287
|
+
"code",
|
|
23288
|
+
"message"
|
|
23289
|
+
]
|
|
23290
|
+
}
|
|
23291
|
+
},
|
|
23292
|
+
"required": [
|
|
23293
|
+
"error"
|
|
23294
|
+
]
|
|
23295
|
+
},
|
|
23296
|
+
"examples": {
|
|
23297
|
+
"forbidden": {
|
|
23298
|
+
"summary": "Caller does not own the resource",
|
|
23299
|
+
"value": {
|
|
23300
|
+
"error": {
|
|
23301
|
+
"code": "FORBIDDEN",
|
|
23302
|
+
"message": "not allowed"
|
|
23303
|
+
}
|
|
23304
|
+
}
|
|
23305
|
+
}
|
|
23306
|
+
}
|
|
23307
|
+
}
|
|
23308
|
+
}
|
|
22020
23309
|
},
|
|
22021
|
-
{
|
|
22022
|
-
"
|
|
22023
|
-
|
|
22024
|
-
|
|
22025
|
-
|
|
22026
|
-
|
|
22027
|
-
|
|
23310
|
+
"404": {
|
|
23311
|
+
"description": "The target resource does not exist or is not visible to the caller. Soft-deleted resources are treated as not found unless an `include_deleted` flag is set.",
|
|
23312
|
+
"content": {
|
|
23313
|
+
"application/json": {
|
|
23314
|
+
"schema": {
|
|
23315
|
+
"type": "object",
|
|
23316
|
+
"properties": {
|
|
23317
|
+
"error": {
|
|
23318
|
+
"type": "object",
|
|
23319
|
+
"properties": {
|
|
23320
|
+
"code": {
|
|
23321
|
+
"type": "string"
|
|
23322
|
+
},
|
|
23323
|
+
"message": {
|
|
23324
|
+
"type": "string"
|
|
23325
|
+
},
|
|
23326
|
+
"extra": {
|
|
23327
|
+
"type": "object",
|
|
23328
|
+
"additionalProperties": {}
|
|
23329
|
+
}
|
|
23330
|
+
},
|
|
23331
|
+
"required": [
|
|
23332
|
+
"code",
|
|
23333
|
+
"message"
|
|
23334
|
+
]
|
|
23335
|
+
}
|
|
23336
|
+
},
|
|
23337
|
+
"required": [
|
|
23338
|
+
"error"
|
|
23339
|
+
]
|
|
23340
|
+
},
|
|
23341
|
+
"examples": {
|
|
23342
|
+
"notFound": {
|
|
23343
|
+
"summary": "Resource id is unknown to the service",
|
|
23344
|
+
"value": {
|
|
23345
|
+
"error": {
|
|
23346
|
+
"code": "NOT_FOUND",
|
|
23347
|
+
"message": "todo not found"
|
|
23348
|
+
}
|
|
23349
|
+
}
|
|
23350
|
+
}
|
|
23351
|
+
}
|
|
23352
|
+
}
|
|
23353
|
+
}
|
|
22028
23354
|
},
|
|
22029
|
-
{
|
|
22030
|
-
"
|
|
22031
|
-
|
|
22032
|
-
"
|
|
23355
|
+
"409": {
|
|
23356
|
+
"description": "Optimistic-lock conflict. The supplied `expected_version` does not match the server's current version. Refetch the resource and retry.",
|
|
23357
|
+
"content": {
|
|
23358
|
+
"application/json": {
|
|
23359
|
+
"schema": {
|
|
23360
|
+
"type": "object",
|
|
23361
|
+
"properties": {
|
|
23362
|
+
"error": {
|
|
23363
|
+
"type": "object",
|
|
23364
|
+
"properties": {
|
|
23365
|
+
"code": {
|
|
23366
|
+
"type": "string"
|
|
23367
|
+
},
|
|
23368
|
+
"message": {
|
|
23369
|
+
"type": "string"
|
|
23370
|
+
},
|
|
23371
|
+
"extra": {
|
|
23372
|
+
"type": "object",
|
|
23373
|
+
"additionalProperties": {}
|
|
23374
|
+
}
|
|
23375
|
+
},
|
|
23376
|
+
"required": [
|
|
23377
|
+
"code",
|
|
23378
|
+
"message"
|
|
23379
|
+
]
|
|
23380
|
+
}
|
|
23381
|
+
},
|
|
23382
|
+
"required": [
|
|
23383
|
+
"error"
|
|
23384
|
+
]
|
|
23385
|
+
},
|
|
23386
|
+
"examples": {
|
|
23387
|
+
"versionConflict": {
|
|
23388
|
+
"summary": "expected_version does not match server version",
|
|
23389
|
+
"value": {
|
|
23390
|
+
"error": {
|
|
23391
|
+
"code": "VERSION_CONFLICT",
|
|
23392
|
+
"message": "expected_version 3 but current is 4",
|
|
23393
|
+
"extra": {
|
|
23394
|
+
"expected_version": 3,
|
|
23395
|
+
"actual_version": 4
|
|
23396
|
+
}
|
|
23397
|
+
}
|
|
23398
|
+
}
|
|
23399
|
+
}
|
|
23400
|
+
}
|
|
23401
|
+
}
|
|
23402
|
+
}
|
|
23403
|
+
},
|
|
23404
|
+
"429": {
|
|
23405
|
+
"description": "Rate limit exceeded. Retry after the duration in `error.extra.retry_after_seconds`. `limit_kind` identifies which bucket was exhausted.",
|
|
23406
|
+
"content": {
|
|
23407
|
+
"application/json": {
|
|
23408
|
+
"schema": {
|
|
23409
|
+
"type": "object",
|
|
23410
|
+
"properties": {
|
|
23411
|
+
"error": {
|
|
23412
|
+
"type": "object",
|
|
23413
|
+
"properties": {
|
|
23414
|
+
"code": {
|
|
23415
|
+
"type": "string"
|
|
23416
|
+
},
|
|
23417
|
+
"message": {
|
|
23418
|
+
"type": "string"
|
|
23419
|
+
},
|
|
23420
|
+
"extra": {
|
|
23421
|
+
"type": "object",
|
|
23422
|
+
"additionalProperties": {}
|
|
23423
|
+
}
|
|
23424
|
+
},
|
|
23425
|
+
"required": [
|
|
23426
|
+
"code",
|
|
23427
|
+
"message"
|
|
23428
|
+
]
|
|
23429
|
+
}
|
|
23430
|
+
},
|
|
23431
|
+
"required": [
|
|
23432
|
+
"error"
|
|
23433
|
+
]
|
|
23434
|
+
},
|
|
23435
|
+
"examples": {
|
|
23436
|
+
"rateLimited": {
|
|
23437
|
+
"summary": "Per-key rate limit hit",
|
|
23438
|
+
"value": {
|
|
23439
|
+
"error": {
|
|
23440
|
+
"code": "RATE_LIMITED",
|
|
23441
|
+
"message": "rate limit exceeded",
|
|
23442
|
+
"extra": {
|
|
23443
|
+
"retry_after_seconds": 60,
|
|
23444
|
+
"limit_kind": "authenticated_per_key"
|
|
23445
|
+
}
|
|
23446
|
+
}
|
|
23447
|
+
}
|
|
23448
|
+
}
|
|
23449
|
+
}
|
|
23450
|
+
}
|
|
23451
|
+
}
|
|
23452
|
+
},
|
|
23453
|
+
"500": {
|
|
23454
|
+
"description": "Unhandled server error. The request was well-formed but the service failed unexpectedly. Safe to retry idempotent operations.",
|
|
23455
|
+
"content": {
|
|
23456
|
+
"application/json": {
|
|
23457
|
+
"schema": {
|
|
23458
|
+
"type": "object",
|
|
23459
|
+
"properties": {
|
|
23460
|
+
"error": {
|
|
23461
|
+
"type": "object",
|
|
23462
|
+
"properties": {
|
|
23463
|
+
"code": {
|
|
23464
|
+
"type": "string"
|
|
23465
|
+
},
|
|
23466
|
+
"message": {
|
|
23467
|
+
"type": "string"
|
|
23468
|
+
},
|
|
23469
|
+
"extra": {
|
|
23470
|
+
"type": "object",
|
|
23471
|
+
"additionalProperties": {}
|
|
23472
|
+
}
|
|
23473
|
+
},
|
|
23474
|
+
"required": [
|
|
23475
|
+
"code",
|
|
23476
|
+
"message"
|
|
23477
|
+
]
|
|
23478
|
+
}
|
|
23479
|
+
},
|
|
23480
|
+
"required": [
|
|
23481
|
+
"error"
|
|
23482
|
+
]
|
|
23483
|
+
},
|
|
23484
|
+
"examples": {
|
|
23485
|
+
"internalError": {
|
|
23486
|
+
"summary": "Unhandled exception",
|
|
23487
|
+
"value": {
|
|
23488
|
+
"error": {
|
|
23489
|
+
"code": "INTERNAL_ERROR",
|
|
23490
|
+
"message": "internal error"
|
|
23491
|
+
}
|
|
23492
|
+
}
|
|
23493
|
+
}
|
|
23494
|
+
}
|
|
23495
|
+
}
|
|
23496
|
+
}
|
|
23497
|
+
}
|
|
23498
|
+
}
|
|
23499
|
+
},
|
|
23500
|
+
"get": {
|
|
23501
|
+
"operationId": "todo_type_list",
|
|
23502
|
+
"tags": [
|
|
23503
|
+
"TodoTypes"
|
|
23504
|
+
],
|
|
23505
|
+
"x-cli": {
|
|
23506
|
+
"command": "todo type ls",
|
|
23507
|
+
"examples": [
|
|
23508
|
+
"wspc todo type ls"
|
|
23509
|
+
],
|
|
23510
|
+
"display": {
|
|
23511
|
+
"shape": "list",
|
|
23512
|
+
"columns": [
|
|
23513
|
+
"id",
|
|
23514
|
+
"label"
|
|
23515
|
+
],
|
|
23516
|
+
"format": {
|
|
23517
|
+
"id": "id-short",
|
|
23518
|
+
"label": "truncate"
|
|
22033
23519
|
},
|
|
22034
|
-
"
|
|
22035
|
-
|
|
22036
|
-
|
|
23520
|
+
"emptyMessage": "no todo types"
|
|
23521
|
+
}
|
|
23522
|
+
},
|
|
23523
|
+
"summary": "List todo types",
|
|
23524
|
+
"description": "### 🎯 Overview & Purpose\nList custom todo types defined within a project.\n\n### 🔍 When to Use\n* Use this to populate task type selection dropdown elements or load category metadata for dynamic custom forms.\n\n### 💡 Key Features & Constraints\n* **Required Parameter**: The `project_id` filter is strictly required and must match an active project.\n* **Exclusion**: Soft-deleted types are excluded by default. Pass `include_deleted=true` to surface archived rows for a recovery UI.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if `project_id` query parameter is omitted.",
|
|
23525
|
+
"security": [
|
|
23526
|
+
{
|
|
23527
|
+
"bearerAuth": []
|
|
23528
|
+
}
|
|
23529
|
+
],
|
|
23530
|
+
"x-codeSamples": [
|
|
23531
|
+
{
|
|
23532
|
+
"lang": "shell",
|
|
23533
|
+
"label": "curl",
|
|
23534
|
+
"source": "curl https://api.wspc.ai/todo/types -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
22037
23535
|
},
|
|
23536
|
+
{
|
|
23537
|
+
"lang": "bash",
|
|
23538
|
+
"label": "wspc CLI",
|
|
23539
|
+
"source": "wspc todo types ls"
|
|
23540
|
+
}
|
|
23541
|
+
],
|
|
23542
|
+
"parameters": [
|
|
22038
23543
|
{
|
|
22039
23544
|
"schema": {
|
|
22040
23545
|
"type": "string",
|
|
22041
|
-
"minLength": 1
|
|
23546
|
+
"minLength": 1,
|
|
23547
|
+
"description": "Project id filter. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND."
|
|
22042
23548
|
},
|
|
22043
|
-
"required":
|
|
22044
|
-
"
|
|
23549
|
+
"required": true,
|
|
23550
|
+
"description": "Project id filter. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND.",
|
|
23551
|
+
"name": "project_id",
|
|
22045
23552
|
"in": "query"
|
|
22046
23553
|
},
|
|
22047
23554
|
{
|
|
22048
23555
|
"schema": {
|
|
22049
23556
|
"type": "string",
|
|
22050
|
-
"
|
|
22051
|
-
"asc",
|
|
22052
|
-
"desc"
|
|
22053
|
-
]
|
|
23557
|
+
"minLength": 1
|
|
22054
23558
|
},
|
|
22055
23559
|
"required": false,
|
|
22056
|
-
"name": "
|
|
23560
|
+
"name": "user_id",
|
|
22057
23561
|
"in": "query"
|
|
22058
23562
|
},
|
|
22059
23563
|
{
|
|
22060
23564
|
"schema": {
|
|
22061
|
-
"
|
|
22062
|
-
{
|
|
22063
|
-
"type": "string"
|
|
22064
|
-
},
|
|
22065
|
-
{
|
|
22066
|
-
"type": "array",
|
|
22067
|
-
"items": {
|
|
22068
|
-
"type": "string"
|
|
22069
|
-
}
|
|
22070
|
-
}
|
|
22071
|
-
]
|
|
23565
|
+
"type": "string"
|
|
22072
23566
|
},
|
|
22073
23567
|
"required": false,
|
|
22074
|
-
"name": "
|
|
23568
|
+
"name": "include_deleted",
|
|
22075
23569
|
"in": "query"
|
|
22076
23570
|
}
|
|
22077
23571
|
],
|
|
22078
23572
|
"responses": {
|
|
22079
23573
|
"200": {
|
|
22080
|
-
"description": "List
|
|
23574
|
+
"description": "List",
|
|
22081
23575
|
"content": {
|
|
22082
23576
|
"application/json": {
|
|
22083
23577
|
"schema": {
|
|
22084
|
-
"
|
|
22085
|
-
|
|
22086
|
-
|
|
22087
|
-
|
|
22088
|
-
|
|
22089
|
-
|
|
22090
|
-
|
|
22091
|
-
{
|
|
22092
|
-
"id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22093
|
-
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22094
|
-
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22095
|
-
"title": "Buy milk",
|
|
22096
|
-
"description": "Use refundable rate",
|
|
22097
|
-
"status": "open",
|
|
22098
|
-
"parent_id": null,
|
|
22099
|
-
"child_count": 0,
|
|
22100
|
-
"version": 1,
|
|
22101
|
-
"created_at": 1748736000000,
|
|
22102
|
-
"updated_at": 1748736000000,
|
|
22103
|
-
"due_at": "2026-06-01"
|
|
22104
|
-
},
|
|
22105
|
-
{
|
|
22106
|
-
"id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3G",
|
|
22107
|
-
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22108
|
-
"project_id": "prj_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
22109
|
-
"title": "Submit expenses",
|
|
22110
|
-
"status": "in_progress",
|
|
22111
|
-
"parent_id": null,
|
|
22112
|
-
"child_count": 0,
|
|
22113
|
-
"version": 1,
|
|
22114
|
-
"created_at": 1748736000000,
|
|
22115
|
-
"updated_at": 1748736000000
|
|
22116
|
-
}
|
|
22117
|
-
]
|
|
23578
|
+
"type": "object",
|
|
23579
|
+
"properties": {
|
|
23580
|
+
"types": {
|
|
23581
|
+
"type": "array",
|
|
23582
|
+
"items": {
|
|
23583
|
+
"$ref": "#/components/schemas/TodoType"
|
|
23584
|
+
}
|
|
22118
23585
|
}
|
|
22119
23586
|
},
|
|
22120
|
-
"
|
|
22121
|
-
"
|
|
22122
|
-
|
|
22123
|
-
"todos": []
|
|
22124
|
-
}
|
|
22125
|
-
}
|
|
23587
|
+
"required": [
|
|
23588
|
+
"types"
|
|
23589
|
+
]
|
|
22126
23590
|
}
|
|
22127
23591
|
}
|
|
22128
23592
|
}
|
|
@@ -22453,18 +23917,35 @@
|
|
|
22453
23917
|
}
|
|
22454
23918
|
}
|
|
22455
23919
|
},
|
|
22456
|
-
"/todo/
|
|
22457
|
-
"
|
|
22458
|
-
"operationId": "
|
|
23920
|
+
"/todo/comments/{id}": {
|
|
23921
|
+
"delete": {
|
|
23922
|
+
"operationId": "todo_comment_delete",
|
|
22459
23923
|
"tags": [
|
|
22460
|
-
"
|
|
23924
|
+
"Comments"
|
|
22461
23925
|
],
|
|
22462
23926
|
"x-cli": {
|
|
22463
|
-
"command": "
|
|
22464
|
-
"
|
|
23927
|
+
"command": "todo comment rm",
|
|
23928
|
+
"positional": [
|
|
23929
|
+
"id"
|
|
23930
|
+
],
|
|
23931
|
+
"examples": [
|
|
23932
|
+
"wspc todo comment rm tdc_01HW3K"
|
|
23933
|
+
],
|
|
23934
|
+
"display": {
|
|
23935
|
+
"shape": "object",
|
|
23936
|
+
"format": {
|
|
23937
|
+
"id": "id-short",
|
|
23938
|
+
"todo_id": "id-short",
|
|
23939
|
+
"user_id": "id-short",
|
|
23940
|
+
"content": "truncate",
|
|
23941
|
+
"created_at": "relative-time",
|
|
23942
|
+
"updated_at": "relative-time",
|
|
23943
|
+
"deleted_at": "relative-time"
|
|
23944
|
+
}
|
|
23945
|
+
}
|
|
22465
23946
|
},
|
|
22466
|
-
"summary": "
|
|
22467
|
-
"description": "### 🎯 Overview & Purpose\
|
|
23947
|
+
"summary": "Soft-delete a comment",
|
|
23948
|
+
"description": "### 🎯 Overview & Purpose\nSoft-delete a comment.\n\n### 💡 Key Features & Constraints\n* **Soft delete**: The comment is hidden from default listings but retained; there is no restore endpoint.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`COMMENT_NOT_FOUND` (HTTP 404)**: Thrown if the comment id is unknown, already deleted, or not in the caller's organization.",
|
|
22468
23949
|
"security": [
|
|
22469
23950
|
{
|
|
22470
23951
|
"bearerAuth": []
|
|
@@ -22474,35 +23955,49 @@
|
|
|
22474
23955
|
{
|
|
22475
23956
|
"lang": "shell",
|
|
22476
23957
|
"label": "curl",
|
|
22477
|
-
"source": "curl -X
|
|
23958
|
+
"source": "curl -X DELETE https://api.wspc.ai/todo/comments/tdc_01HW3K -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
22478
23959
|
},
|
|
22479
23960
|
{
|
|
22480
23961
|
"lang": "bash",
|
|
22481
23962
|
"label": "wspc CLI",
|
|
22482
|
-
"source": "wspc todo
|
|
22483
|
-
},
|
|
22484
|
-
{
|
|
22485
|
-
"lang": "typescript",
|
|
22486
|
-
"label": "@wspc/client",
|
|
22487
|
-
"source": "await todo.types.create({ label: \"Task\" })"
|
|
23963
|
+
"source": "wspc todo comment rm tdc_01HW3K"
|
|
22488
23964
|
}
|
|
22489
23965
|
],
|
|
22490
|
-
"
|
|
22491
|
-
|
|
22492
|
-
"
|
|
22493
|
-
"
|
|
22494
|
-
|
|
22495
|
-
|
|
22496
|
-
}
|
|
23966
|
+
"parameters": [
|
|
23967
|
+
{
|
|
23968
|
+
"schema": {
|
|
23969
|
+
"type": "string",
|
|
23970
|
+
"description": "Comment id (`tdc_<ULID>`).",
|
|
23971
|
+
"example": "tdc_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
23972
|
+
},
|
|
23973
|
+
"required": true,
|
|
23974
|
+
"description": "Comment id (`tdc_<ULID>`).",
|
|
23975
|
+
"name": "id",
|
|
23976
|
+
"in": "path"
|
|
22497
23977
|
}
|
|
22498
|
-
|
|
23978
|
+
],
|
|
22499
23979
|
"responses": {
|
|
22500
|
-
"
|
|
22501
|
-
"description": "
|
|
23980
|
+
"200": {
|
|
23981
|
+
"description": "Soft-deleted",
|
|
22502
23982
|
"content": {
|
|
22503
23983
|
"application/json": {
|
|
22504
23984
|
"schema": {
|
|
22505
|
-
"$ref": "#/components/schemas/
|
|
23985
|
+
"$ref": "#/components/schemas/Comment"
|
|
23986
|
+
},
|
|
23987
|
+
"examples": {
|
|
23988
|
+
"softDeleted": {
|
|
23989
|
+
"summary": "Soft-deleted comment",
|
|
23990
|
+
"value": {
|
|
23991
|
+
"id": "tdc_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
23992
|
+
"todo_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
23993
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
23994
|
+
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
23995
|
+
"content": "Verified on staging, moving on.",
|
|
23996
|
+
"created_at": 1748736000000,
|
|
23997
|
+
"updated_at": 1748736000000,
|
|
23998
|
+
"deleted_at": 1748739600000
|
|
23999
|
+
}
|
|
24000
|
+
}
|
|
22506
24001
|
}
|
|
22507
24002
|
}
|
|
22508
24003
|
}
|
|
@@ -22832,31 +24327,35 @@
|
|
|
22832
24327
|
}
|
|
22833
24328
|
}
|
|
22834
24329
|
},
|
|
22835
|
-
"
|
|
22836
|
-
"operationId": "
|
|
24330
|
+
"patch": {
|
|
24331
|
+
"operationId": "todo_comment_update",
|
|
22837
24332
|
"tags": [
|
|
22838
|
-
"
|
|
24333
|
+
"Comments"
|
|
22839
24334
|
],
|
|
22840
24335
|
"x-cli": {
|
|
22841
|
-
"command": "todo
|
|
24336
|
+
"command": "todo comment edit",
|
|
24337
|
+
"positional": [
|
|
24338
|
+
"id",
|
|
24339
|
+
"content"
|
|
24340
|
+
],
|
|
22842
24341
|
"examples": [
|
|
22843
|
-
"wspc todo
|
|
24342
|
+
"wspc todo comment edit tdc_01HW3K \"Edited note\""
|
|
22844
24343
|
],
|
|
22845
24344
|
"display": {
|
|
22846
|
-
"shape": "
|
|
22847
|
-
"columns": [
|
|
22848
|
-
"id",
|
|
22849
|
-
"label"
|
|
22850
|
-
],
|
|
24345
|
+
"shape": "object",
|
|
22851
24346
|
"format": {
|
|
22852
24347
|
"id": "id-short",
|
|
22853
|
-
"
|
|
22854
|
-
|
|
22855
|
-
|
|
24348
|
+
"todo_id": "id-short",
|
|
24349
|
+
"user_id": "id-short",
|
|
24350
|
+
"content": "truncate",
|
|
24351
|
+
"created_at": "relative-time",
|
|
24352
|
+
"updated_at": "relative-time",
|
|
24353
|
+
"deleted_at": "relative-time"
|
|
24354
|
+
}
|
|
22856
24355
|
}
|
|
22857
24356
|
},
|
|
22858
|
-
"summary": "
|
|
22859
|
-
"description": "### 🎯 Overview & Purpose\
|
|
24357
|
+
"summary": "Edit a comment",
|
|
24358
|
+
"description": "### 🎯 Overview & Purpose\nEdit the body of an existing comment.\n\n### 💡 Key Features & Constraints\n* **Last write wins**: There is no optimistic-lock version on comments; the latest edit replaces the content.\n\n### ⚠️ Common Errors & Troubleshooting\n* **`COMMENT_NOT_FOUND` (HTTP 404)**: Thrown if the comment id is unknown, soft-deleted, or not in the caller's organization.\n* **`VALIDATION_ERROR` (HTTP 400)**: Thrown if content is empty or exceeds 10000 characters.",
|
|
22860
24359
|
"security": [
|
|
22861
24360
|
{
|
|
22862
24361
|
"bearerAuth": []
|
|
@@ -22866,67 +24365,65 @@
|
|
|
22866
24365
|
{
|
|
22867
24366
|
"lang": "shell",
|
|
22868
24367
|
"label": "curl",
|
|
22869
|
-
"source": "curl https://api.wspc.ai/todo/
|
|
24368
|
+
"source": "curl -X PATCH https://api.wspc.ai/todo/comments/tdc_01HW3K -H \"Authorization: Bearer $WSPC_API_KEY\" -H \"Content-Type: application/json\" -d '{\"content\":\"Edited\"}'"
|
|
22870
24369
|
},
|
|
22871
24370
|
{
|
|
22872
24371
|
"lang": "bash",
|
|
22873
24372
|
"label": "wspc CLI",
|
|
22874
|
-
"source": "wspc todo
|
|
22875
|
-
},
|
|
22876
|
-
{
|
|
22877
|
-
"lang": "typescript",
|
|
22878
|
-
"label": "@wspc/client",
|
|
22879
|
-
"source": "await todo.types.list()"
|
|
24373
|
+
"source": "wspc todo comment edit tdc_01HW3K \"Edited\""
|
|
22880
24374
|
}
|
|
22881
24375
|
],
|
|
22882
24376
|
"parameters": [
|
|
22883
24377
|
{
|
|
22884
24378
|
"schema": {
|
|
22885
24379
|
"type": "string",
|
|
22886
|
-
"
|
|
22887
|
-
"
|
|
24380
|
+
"description": "Comment id (`tdc_<ULID>`).",
|
|
24381
|
+
"example": "tdc_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
22888
24382
|
},
|
|
22889
24383
|
"required": true,
|
|
22890
|
-
"description": "
|
|
22891
|
-
"name": "
|
|
22892
|
-
"in": "
|
|
22893
|
-
},
|
|
22894
|
-
{
|
|
22895
|
-
"schema": {
|
|
22896
|
-
"type": "string",
|
|
22897
|
-
"minLength": 1
|
|
22898
|
-
},
|
|
22899
|
-
"required": false,
|
|
22900
|
-
"name": "user_id",
|
|
22901
|
-
"in": "query"
|
|
22902
|
-
},
|
|
22903
|
-
{
|
|
22904
|
-
"schema": {
|
|
22905
|
-
"type": "string"
|
|
22906
|
-
},
|
|
22907
|
-
"required": false,
|
|
22908
|
-
"name": "include_deleted",
|
|
22909
|
-
"in": "query"
|
|
24384
|
+
"description": "Comment id (`tdc_<ULID>`).",
|
|
24385
|
+
"name": "id",
|
|
24386
|
+
"in": "path"
|
|
22910
24387
|
}
|
|
22911
24388
|
],
|
|
24389
|
+
"requestBody": {
|
|
24390
|
+
"content": {
|
|
24391
|
+
"application/json": {
|
|
24392
|
+
"schema": {
|
|
24393
|
+
"$ref": "#/components/schemas/UpdateCommentBody"
|
|
24394
|
+
},
|
|
24395
|
+
"examples": {
|
|
24396
|
+
"edit": {
|
|
24397
|
+
"summary": "Edit body",
|
|
24398
|
+
"value": {
|
|
24399
|
+
"content": "Edited note"
|
|
24400
|
+
}
|
|
24401
|
+
}
|
|
24402
|
+
}
|
|
24403
|
+
}
|
|
24404
|
+
}
|
|
24405
|
+
},
|
|
22912
24406
|
"responses": {
|
|
22913
24407
|
"200": {
|
|
22914
|
-
"description": "
|
|
24408
|
+
"description": "Updated",
|
|
22915
24409
|
"content": {
|
|
22916
24410
|
"application/json": {
|
|
22917
24411
|
"schema": {
|
|
22918
|
-
"
|
|
22919
|
-
|
|
22920
|
-
|
|
22921
|
-
|
|
22922
|
-
|
|
22923
|
-
|
|
22924
|
-
|
|
24412
|
+
"$ref": "#/components/schemas/Comment"
|
|
24413
|
+
},
|
|
24414
|
+
"examples": {
|
|
24415
|
+
"happyPath": {
|
|
24416
|
+
"summary": "Active comment",
|
|
24417
|
+
"value": {
|
|
24418
|
+
"id": "tdc_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
24419
|
+
"todo_id": "tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
24420
|
+
"user_id": "usr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
24421
|
+
"org_id": "org_01HW3K4N9V5G6Z8C2Q7B1Y0M3F",
|
|
24422
|
+
"content": "Verified on staging, moving on.",
|
|
24423
|
+
"created_at": 1748736000000,
|
|
24424
|
+
"updated_at": 1748736000000
|
|
22925
24425
|
}
|
|
22926
|
-
}
|
|
22927
|
-
"required": [
|
|
22928
|
-
"types"
|
|
22929
|
-
]
|
|
24426
|
+
}
|
|
22930
24427
|
}
|
|
22931
24428
|
}
|
|
22932
24429
|
}
|
|
@@ -23284,11 +24781,6 @@
|
|
|
23284
24781
|
"lang": "bash",
|
|
23285
24782
|
"label": "wspc CLI",
|
|
23286
24783
|
"source": "wspc project rm prj_01HW3K"
|
|
23287
|
-
},
|
|
23288
|
-
{
|
|
23289
|
-
"lang": "typescript",
|
|
23290
|
-
"label": "@wspc/client",
|
|
23291
|
-
"source": "await todo.projects.delete(\"prj_01HW3K\")"
|
|
23292
24784
|
}
|
|
23293
24785
|
],
|
|
23294
24786
|
"parameters": [
|
|
@@ -23682,11 +25174,6 @@
|
|
|
23682
25174
|
"lang": "bash",
|
|
23683
25175
|
"label": "wspc CLI",
|
|
23684
25176
|
"source": "wspc project show prj_01HW3K"
|
|
23685
|
-
},
|
|
23686
|
-
{
|
|
23687
|
-
"lang": "typescript",
|
|
23688
|
-
"label": "@wspc/client",
|
|
23689
|
-
"source": "await todo.projects.get(\"prj_01HW3K\")"
|
|
23690
25177
|
}
|
|
23691
25178
|
],
|
|
23692
25179
|
"parameters": [
|
|
@@ -24079,11 +25566,6 @@
|
|
|
24079
25566
|
"lang": "bash",
|
|
24080
25567
|
"label": "wspc CLI",
|
|
24081
25568
|
"source": "wspc project update prj_01HW3K --name \"Renamed\""
|
|
24082
|
-
},
|
|
24083
|
-
{
|
|
24084
|
-
"lang": "typescript",
|
|
24085
|
-
"label": "@wspc/client",
|
|
24086
|
-
"source": "await todo.projects.update(\"prj_01HW3K\", { name: \"Renamed\" })"
|
|
24087
25569
|
}
|
|
24088
25570
|
],
|
|
24089
25571
|
"parameters": [
|
|
@@ -24508,11 +25990,6 @@
|
|
|
24508
25990
|
"lang": "bash",
|
|
24509
25991
|
"label": "wspc CLI",
|
|
24510
25992
|
"source": "wspc todo rrule rm tdr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
24511
|
-
},
|
|
24512
|
-
{
|
|
24513
|
-
"lang": "typescript",
|
|
24514
|
-
"label": "@wspc/client",
|
|
24515
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.deleteRule(\"tdr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\")"
|
|
24516
25993
|
}
|
|
24517
25994
|
],
|
|
24518
25995
|
"parameters": [
|
|
@@ -24916,11 +26393,6 @@
|
|
|
24916
26393
|
"lang": "bash",
|
|
24917
26394
|
"label": "wspc CLI",
|
|
24918
26395
|
"source": "wspc todo rrule show tdr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
24919
|
-
},
|
|
24920
|
-
{
|
|
24921
|
-
"lang": "typescript",
|
|
24922
|
-
"label": "@wspc/client",
|
|
24923
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.getRule(\"tdr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\")"
|
|
24924
26396
|
}
|
|
24925
26397
|
],
|
|
24926
26398
|
"parameters": [
|
|
@@ -25325,11 +26797,6 @@
|
|
|
25325
26797
|
"lang": "bash",
|
|
25326
26798
|
"label": "wspc CLI",
|
|
25327
26799
|
"source": "wspc todo rrule set tdr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F --rrule \"FREQ=WEEKLY;BYDAY=FR\""
|
|
25328
|
-
},
|
|
25329
|
-
{
|
|
25330
|
-
"lang": "typescript",
|
|
25331
|
-
"label": "@wspc/client",
|
|
25332
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.updateRule(\"tdr_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", { rrule: \"FREQ=WEEKLY;BYDAY=FR\" })"
|
|
25333
26800
|
}
|
|
25334
26801
|
],
|
|
25335
26802
|
"parameters": [
|
|
@@ -25771,11 +27238,6 @@
|
|
|
25771
27238
|
"lang": "bash",
|
|
25772
27239
|
"label": "wspc CLI",
|
|
25773
27240
|
"source": "wspc todo rm tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F --cascade"
|
|
25774
|
-
},
|
|
25775
|
-
{
|
|
25776
|
-
"lang": "typescript",
|
|
25777
|
-
"label": "@wspc/client",
|
|
25778
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.delete(\"tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", { cascade: true })"
|
|
25779
27241
|
}
|
|
25780
27242
|
],
|
|
25781
27243
|
"parameters": [
|
|
@@ -26210,11 +27672,6 @@
|
|
|
26210
27672
|
"lang": "bash",
|
|
26211
27673
|
"label": "wspc CLI",
|
|
26212
27674
|
"source": "wspc todo show tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
26213
|
-
},
|
|
26214
|
-
{
|
|
26215
|
-
"lang": "typescript",
|
|
26216
|
-
"label": "@wspc/client",
|
|
26217
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.get(\"tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\")"
|
|
26218
27675
|
}
|
|
26219
27676
|
],
|
|
26220
27677
|
"parameters": [
|
|
@@ -26667,11 +28124,6 @@
|
|
|
26667
28124
|
"lang": "bash",
|
|
26668
28125
|
"label": "wspc CLI",
|
|
26669
28126
|
"source": "wspc todo done tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F"
|
|
26670
|
-
},
|
|
26671
|
-
{
|
|
26672
|
-
"lang": "typescript",
|
|
26673
|
-
"label": "@wspc/client",
|
|
26674
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.update(\"tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", { status: \"done\" })"
|
|
26675
28127
|
}
|
|
26676
28128
|
],
|
|
26677
28129
|
"parameters": [
|
|
@@ -27101,11 +28553,6 @@
|
|
|
27101
28553
|
"lang": "bash",
|
|
27102
28554
|
"label": "wspc CLI",
|
|
27103
28555
|
"source": "wspc todo types rm typ_01HW3K"
|
|
27104
|
-
},
|
|
27105
|
-
{
|
|
27106
|
-
"lang": "typescript",
|
|
27107
|
-
"label": "@wspc/client",
|
|
27108
|
-
"source": "await todo.types.delete(\"typ_01HW3K\")"
|
|
27109
28556
|
}
|
|
27110
28557
|
],
|
|
27111
28558
|
"parameters": [
|
|
@@ -27480,11 +28927,6 @@
|
|
|
27480
28927
|
"lang": "bash",
|
|
27481
28928
|
"label": "wspc CLI",
|
|
27482
28929
|
"source": "wspc todo types show typ_01HW3K"
|
|
27483
|
-
},
|
|
27484
|
-
{
|
|
27485
|
-
"lang": "typescript",
|
|
27486
|
-
"label": "@wspc/client",
|
|
27487
|
-
"source": "await todo.types.get(\"typ_01HW3K\")"
|
|
27488
28930
|
}
|
|
27489
28931
|
],
|
|
27490
28932
|
"parameters": [
|
|
@@ -27859,11 +29301,6 @@
|
|
|
27859
29301
|
"lang": "bash",
|
|
27860
29302
|
"label": "wspc CLI",
|
|
27861
29303
|
"source": "wspc todo types update typ_01HW3K --label \"Renamed\""
|
|
27862
|
-
},
|
|
27863
|
-
{
|
|
27864
|
-
"lang": "typescript",
|
|
27865
|
-
"label": "@wspc/client",
|
|
27866
|
-
"source": "await todo.types.update(\"typ_01HW3K\", { label: \"Renamed\" })"
|
|
27867
29304
|
}
|
|
27868
29305
|
],
|
|
27869
29306
|
"parameters": [
|
|
@@ -28244,11 +29681,6 @@
|
|
|
28244
29681
|
"lang": "shell",
|
|
28245
29682
|
"label": "curl",
|
|
28246
29683
|
"source": "curl -X POST https://api.wspc.ai/todo/projects/prj_01HW3K/restore -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
28247
|
-
},
|
|
28248
|
-
{
|
|
28249
|
-
"lang": "typescript",
|
|
28250
|
-
"label": "@wspc/client",
|
|
28251
|
-
"source": "await todo.projects.restore(\"prj_01HW3K\")"
|
|
28252
29684
|
}
|
|
28253
29685
|
],
|
|
28254
29686
|
"parameters": [
|
|
@@ -28638,11 +30070,6 @@
|
|
|
28638
30070
|
"lang": "shell",
|
|
28639
30071
|
"label": "curl",
|
|
28640
30072
|
"source": "curl -X POST https://api.wspc.ai/todo/items/tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F/restore \\\n -H \"Authorization: Bearer $WSPC_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{}'"
|
|
28641
|
-
},
|
|
28642
|
-
{
|
|
28643
|
-
"lang": "typescript",
|
|
28644
|
-
"label": "@wspc/client",
|
|
28645
|
-
"source": "import { TodoClient } from \"@wspc/client\"\nconst todo = new TodoClient({ baseUrl: \"https://api.wspc.ai\", apiKey: process.env.WSPC_API_KEY! })\nawait todo.restore(\"tod_01HW3K4N9V5G6Z8C2Q7B1Y0M3F\", {})"
|
|
28646
30073
|
}
|
|
28647
30074
|
],
|
|
28648
30075
|
"parameters": [
|
|
@@ -29054,11 +30481,6 @@
|
|
|
29054
30481
|
"lang": "shell",
|
|
29055
30482
|
"label": "curl",
|
|
29056
30483
|
"source": "curl -X POST https://api.wspc.ai/todo/types/typ_01HW3K/restore -H \"Authorization: Bearer $WSPC_API_KEY\""
|
|
29057
|
-
},
|
|
29058
|
-
{
|
|
29059
|
-
"lang": "typescript",
|
|
29060
|
-
"label": "@wspc/client",
|
|
29061
|
-
"source": "await todo.types.restore(\"typ_01HW3K\")"
|
|
29062
30484
|
}
|
|
29063
30485
|
],
|
|
29064
30486
|
"parameters": [
|
|
@@ -29415,6 +30837,10 @@
|
|
|
29415
30837
|
"name": "Auth",
|
|
29416
30838
|
"description": "Email magic-code login: request code, verify code, current user."
|
|
29417
30839
|
},
|
|
30840
|
+
{
|
|
30841
|
+
"name": "Comments",
|
|
30842
|
+
"description": "Comments endpoints."
|
|
30843
|
+
},
|
|
29418
30844
|
{
|
|
29419
30845
|
"name": "EmailAliases",
|
|
29420
30846
|
"description": "User-managed @wspc.app email aliases that route inbound mail to the user's inbox."
|