@37signals/basecamp 0.18.0 → 0.19.0
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/README.md +94 -2
- package/dist/client.d.ts +6 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +11 -5
- package/dist/client.js.map +1 -1
- package/dist/download.js +1 -1
- package/dist/errors.d.ts +10 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +42 -13
- package/dist/errors.js.map +1 -1
- package/dist/generated/metadata.d.ts +1 -2
- package/dist/generated/metadata.d.ts.map +1 -1
- package/dist/generated/metadata.js +47 -1
- package/dist/generated/metadata.js.map +1 -1
- package/dist/generated/metadata.ts +48 -3
- package/dist/generated/openapi-stripped.json +772 -16
- package/dist/generated/path-mapping.d.ts.map +1 -1
- package/dist/generated/path-mapping.js +7 -4
- package/dist/generated/path-mapping.js.map +1 -1
- package/dist/generated/path-mapping.ts +8 -5
- package/dist/generated/person-id-sites.d.ts +2 -0
- package/dist/generated/person-id-sites.d.ts.map +1 -0
- package/dist/generated/person-id-sites.js +689 -0
- package/dist/generated/person-id-sites.js.map +1 -0
- package/dist/generated/person-id-sites.ts +690 -0
- package/dist/generated/schema.d.ts +643 -12
- package/dist/generated/services/event-feed.d.ts +92 -0
- package/dist/generated/services/event-feed.d.ts.map +1 -0
- package/dist/generated/services/event-feed.js +80 -0
- package/dist/generated/services/event-feed.js.map +1 -0
- package/dist/generated/services/event-feed.ts +153 -0
- package/dist/generated/services/gauges.d.ts +7 -3
- package/dist/generated/services/gauges.d.ts.map +1 -1
- package/dist/generated/services/gauges.js +4 -1
- package/dist/generated/services/gauges.js.map +1 -1
- package/dist/generated/services/gauges.ts +10 -3
- package/dist/generated/services/index.d.ts +1 -0
- package/dist/generated/services/index.d.ts.map +1 -1
- package/dist/generated/services/index.js +1 -0
- package/dist/generated/services/index.js.map +1 -1
- package/dist/generated/services/index.ts +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/person-id.d.ts +133 -0
- package/dist/person-id.d.ts.map +1 -0
- package/dist/person-id.js +163 -0
- package/dist/person-id.js.map +1 -0
- package/dist/retry.d.ts +2 -1
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +21 -11
- package/dist/retry.js.map +1 -1
- package/dist/services/base.d.ts +35 -0
- package/dist/services/base.d.ts.map +1 -1
- package/dist/services/base.js +387 -55
- package/dist/services/base.js.map +1 -1
- package/dist/services/comments-extensions.d.ts +89 -0
- package/dist/services/comments-extensions.d.ts.map +1 -0
- package/dist/services/comments-extensions.js +166 -0
- package/dist/services/comments-extensions.js.map +1 -0
- package/dist/services/mentions.d.ts +255 -0
- package/dist/services/mentions.d.ts.map +1 -0
- package/dist/services/mentions.js +1431 -0
- package/dist/services/mentions.js.map +1 -0
- package/dist/services/merge-safe.d.ts +13 -5
- package/dist/services/merge-safe.d.ts.map +1 -1
- package/dist/services/merge-safe.js +71 -13
- package/dist/services/merge-safe.js.map +1 -1
- package/dist/services/recordings-extensions.d.ts +354 -0
- package/dist/services/recordings-extensions.d.ts.map +1 -0
- package/dist/services/recordings-extensions.js +1940 -0
- package/dist/services/recordings-extensions.js.map +1 -0
- package/package.json +4 -4
- package/src/generated/metadata.ts +48 -3
- package/src/generated/openapi-stripped.json +772 -16
- package/src/generated/path-mapping.ts +8 -5
- package/src/generated/person-id-sites.ts +690 -0
- package/src/generated/schema.d.ts +643 -12
- package/src/generated/services/event-feed.ts +153 -0
- package/src/generated/services/gauges.ts +10 -3
- package/src/generated/services/index.ts +1 -0
|
@@ -4396,6 +4396,9 @@
|
|
|
4396
4396
|
}
|
|
4397
4397
|
}
|
|
4398
4398
|
},
|
|
4399
|
+
"tags": [
|
|
4400
|
+
"Card Tables"
|
|
4401
|
+
],
|
|
4399
4402
|
"x-basecamp-idempotent": {
|
|
4400
4403
|
"natural": true
|
|
4401
4404
|
},
|
|
@@ -4478,6 +4481,9 @@
|
|
|
4478
4481
|
}
|
|
4479
4482
|
}
|
|
4480
4483
|
},
|
|
4484
|
+
"tags": [
|
|
4485
|
+
"Card Tables"
|
|
4486
|
+
],
|
|
4481
4487
|
"x-basecamp-idempotent": {
|
|
4482
4488
|
"natural": true
|
|
4483
4489
|
},
|
|
@@ -7833,6 +7839,259 @@
|
|
|
7833
7839
|
}
|
|
7834
7840
|
}
|
|
7835
7841
|
},
|
|
7842
|
+
"/events.json": {
|
|
7843
|
+
"get": {
|
|
7844
|
+
"description": "Poll the account event feed for events after a position (oldest first, strict event-id order, up to 100 per page).\n\n**Entry.** With neither `since` nor `position` the feed begins at the present\n(equivalent to `since=now`). `since=<event id>` starts after that id and\n`since=0` replays all served history back to the feed's epoch; `since` is a\nsigned 64-bit integer written in decimal, or the literal `now`. `position`\nresumes from a token a previous page issued — signed, opaque, bound to the\naccount and the filter set.\n\n**Pagination**: cursor style — the body envelope, not the Link header.\n`position` is the durable cursor (persist it only after processing the\npage's events); `next` is an absolute continuation URL present only while\nthis walk has more to serve. One call answers one page; no generator emits\na walk for the cursor style — see the section note.\n\n**Errors.** 400 (FeedRequestError) for a malformed position (resume with\n`since=`) or a malformed filter (fix the filters; a position reset will not\nhelp), told apart by its optional `reason` and undifferentiated when `reason`\nis absent. 409 (FeedFilterMismatchError) when the position was minted for a\ndifferent filter set. 410 (FeedPositionGoneError) when the position predates\nthe feed's epoch; its `resume` re-enters at the epoch.",
|
|
7845
|
+
"operationId": "PollEvents",
|
|
7846
|
+
"parameters": [
|
|
7847
|
+
{
|
|
7848
|
+
"name": "since",
|
|
7849
|
+
"in": "query",
|
|
7850
|
+
"description": "Entry point: a decimal event id (start after it; `0` replays served\nhistory back to the epoch), or the literal `now` (skip history). Mutually\nexclusive with `position` in practice; omit both to enter at the present.",
|
|
7851
|
+
"schema": {
|
|
7852
|
+
"type": "string",
|
|
7853
|
+
"description": "Entry point: a decimal event id (start after it; `0` replays served\nhistory back to the epoch), or the literal `now` (skip history). Mutually\nexclusive with `position` in practice; omit both to enter at the present."
|
|
7854
|
+
}
|
|
7855
|
+
},
|
|
7856
|
+
{
|
|
7857
|
+
"name": "position",
|
|
7858
|
+
"in": "query",
|
|
7859
|
+
"description": "Resume token from a previous page's `position`. Opaque and signed; never\nconstructed or parsed client-side.",
|
|
7860
|
+
"schema": {
|
|
7861
|
+
"type": "string",
|
|
7862
|
+
"description": "Resume token from a previous page's `position`. Opaque and signed; never\nconstructed or parsed client-side."
|
|
7863
|
+
}
|
|
7864
|
+
},
|
|
7865
|
+
{
|
|
7866
|
+
"name": "types",
|
|
7867
|
+
"in": "query",
|
|
7868
|
+
"description": "Comma-separated event types from the catalog (e.g. `message.created,comment.created`).",
|
|
7869
|
+
"schema": {
|
|
7870
|
+
"type": "string",
|
|
7871
|
+
"description": "Comma-separated event types from the catalog (e.g. `message.created,comment.created`)."
|
|
7872
|
+
}
|
|
7873
|
+
},
|
|
7874
|
+
{
|
|
7875
|
+
"name": "buckets",
|
|
7876
|
+
"in": "query",
|
|
7877
|
+
"description": "Comma-separated bucket (project) ids, at most 100.",
|
|
7878
|
+
"schema": {
|
|
7879
|
+
"type": "string",
|
|
7880
|
+
"description": "Comma-separated bucket (project) ids, at most 100."
|
|
7881
|
+
}
|
|
7882
|
+
},
|
|
7883
|
+
{
|
|
7884
|
+
"name": "creators",
|
|
7885
|
+
"in": "query",
|
|
7886
|
+
"description": "Comma-separated creator person ids, at most 100.",
|
|
7887
|
+
"schema": {
|
|
7888
|
+
"type": "string",
|
|
7889
|
+
"description": "Comma-separated creator person ids, at most 100."
|
|
7890
|
+
}
|
|
7891
|
+
},
|
|
7892
|
+
{
|
|
7893
|
+
"name": "performers",
|
|
7894
|
+
"in": "query",
|
|
7895
|
+
"description": "Comma-separated effective-performer ids (the agent on a delegated action,\nelse the creator), at most 100. The literal `self` means the request's own\neffective actor and is resolved server-side before filtering.",
|
|
7896
|
+
"schema": {
|
|
7897
|
+
"type": "string",
|
|
7898
|
+
"description": "Comma-separated effective-performer ids (the agent on a delegated action,\nelse the creator), at most 100. The literal `self` means the request's own\neffective actor and is resolved server-side before filtering."
|
|
7899
|
+
}
|
|
7900
|
+
},
|
|
7901
|
+
{
|
|
7902
|
+
"name": "exclude_performers",
|
|
7903
|
+
"in": "query",
|
|
7904
|
+
"description": "Comma-separated effective-performer ids to exclude, at most 100; `self`\nas on `performers`. `exclude_performers=self` is the loop guard for an\nagent that acts on what it hears.",
|
|
7905
|
+
"schema": {
|
|
7906
|
+
"type": "string",
|
|
7907
|
+
"description": "Comma-separated effective-performer ids to exclude, at most 100; `self`\nas on `performers`. `exclude_performers=self` is the loop guard for an\nagent that acts on what it hears."
|
|
7908
|
+
}
|
|
7909
|
+
},
|
|
7910
|
+
{
|
|
7911
|
+
"name": "actor_types",
|
|
7912
|
+
"in": "query",
|
|
7913
|
+
"description": "Comma-separated actor kinds: `agent`, `person`, or both. A filter, not a\ndefault — agent activity is real account activity.",
|
|
7914
|
+
"schema": {
|
|
7915
|
+
"type": "string",
|
|
7916
|
+
"description": "Comma-separated actor kinds: `agent`, `person`, or both. A filter, not a\ndefault — agent activity is real account activity."
|
|
7917
|
+
}
|
|
7918
|
+
}
|
|
7919
|
+
],
|
|
7920
|
+
"responses": {
|
|
7921
|
+
"200": {
|
|
7922
|
+
"description": "PollEvents 200 response",
|
|
7923
|
+
"content": {
|
|
7924
|
+
"application/json": {
|
|
7925
|
+
"schema": {
|
|
7926
|
+
"$ref": "#/components/schemas/PollEventsResponseContent"
|
|
7927
|
+
}
|
|
7928
|
+
}
|
|
7929
|
+
}
|
|
7930
|
+
},
|
|
7931
|
+
"400": {
|
|
7932
|
+
"description": "FeedRequestError 400 response",
|
|
7933
|
+
"content": {
|
|
7934
|
+
"application/json": {
|
|
7935
|
+
"schema": {
|
|
7936
|
+
"$ref": "#/components/schemas/FeedRequestErrorResponseContent"
|
|
7937
|
+
}
|
|
7938
|
+
}
|
|
7939
|
+
}
|
|
7940
|
+
},
|
|
7941
|
+
"401": {
|
|
7942
|
+
"description": "UnauthorizedError 401 response",
|
|
7943
|
+
"content": {
|
|
7944
|
+
"application/json": {
|
|
7945
|
+
"schema": {
|
|
7946
|
+
"$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
|
|
7947
|
+
}
|
|
7948
|
+
}
|
|
7949
|
+
}
|
|
7950
|
+
},
|
|
7951
|
+
"403": {
|
|
7952
|
+
"description": "ForbiddenError 403 response",
|
|
7953
|
+
"content": {
|
|
7954
|
+
"application/json": {
|
|
7955
|
+
"schema": {
|
|
7956
|
+
"$ref": "#/components/schemas/ForbiddenErrorResponseContent"
|
|
7957
|
+
}
|
|
7958
|
+
}
|
|
7959
|
+
}
|
|
7960
|
+
},
|
|
7961
|
+
"409": {
|
|
7962
|
+
"description": "FeedFilterMismatchError 409 response",
|
|
7963
|
+
"content": {
|
|
7964
|
+
"application/json": {
|
|
7965
|
+
"schema": {
|
|
7966
|
+
"$ref": "#/components/schemas/FeedFilterMismatchErrorResponseContent"
|
|
7967
|
+
}
|
|
7968
|
+
}
|
|
7969
|
+
}
|
|
7970
|
+
},
|
|
7971
|
+
"410": {
|
|
7972
|
+
"description": "FeedPositionGoneError 410 response",
|
|
7973
|
+
"content": {
|
|
7974
|
+
"application/json": {
|
|
7975
|
+
"schema": {
|
|
7976
|
+
"$ref": "#/components/schemas/FeedPositionGoneErrorResponseContent"
|
|
7977
|
+
}
|
|
7978
|
+
}
|
|
7979
|
+
}
|
|
7980
|
+
},
|
|
7981
|
+
"429": {
|
|
7982
|
+
"description": "RateLimitError 429 response",
|
|
7983
|
+
"content": {
|
|
7984
|
+
"application/json": {
|
|
7985
|
+
"schema": {
|
|
7986
|
+
"$ref": "#/components/schemas/RateLimitErrorResponseContent"
|
|
7987
|
+
}
|
|
7988
|
+
}
|
|
7989
|
+
}
|
|
7990
|
+
},
|
|
7991
|
+
"500": {
|
|
7992
|
+
"description": "InternalServerError 500 response",
|
|
7993
|
+
"content": {
|
|
7994
|
+
"application/json": {
|
|
7995
|
+
"schema": {
|
|
7996
|
+
"$ref": "#/components/schemas/InternalServerErrorResponseContent"
|
|
7997
|
+
}
|
|
7998
|
+
}
|
|
7999
|
+
}
|
|
8000
|
+
}
|
|
8001
|
+
},
|
|
8002
|
+
"tags": [
|
|
8003
|
+
"EventFeed"
|
|
8004
|
+
],
|
|
8005
|
+
"x-basecamp-pagination": {
|
|
8006
|
+
"style": "cursor",
|
|
8007
|
+
"key": "events",
|
|
8008
|
+
"maxPageSize": 100
|
|
8009
|
+
},
|
|
8010
|
+
"x-basecamp-retry": {
|
|
8011
|
+
"maxAttempts": 3,
|
|
8012
|
+
"baseDelayMs": 1000,
|
|
8013
|
+
"backoff": "exponential",
|
|
8014
|
+
"retryOn": [
|
|
8015
|
+
429,
|
|
8016
|
+
503
|
|
8017
|
+
]
|
|
8018
|
+
}
|
|
8019
|
+
}
|
|
8020
|
+
},
|
|
8021
|
+
"/events/stream_ticket.json": {
|
|
8022
|
+
"post": {
|
|
8023
|
+
"description": "Mint a short-lived stream ticket and the exact WebSocket URL to open a live event stream with.\n\nThe ticket is signed and lives about two minutes; the response's `url` is\nthe one to connect to. Connect to `url` verbatim — never assemble the WebSocket URL (scheme, host,\npath, account prefix) client-side; the topology is the server's to change.\nMint a fresh ticket for every connection attempt: tickets expire and are not\nrefreshed by an open socket. The mint is a stateless signed capability with\nno server-side consumption, so a replayed POST is harmless and the operation\nis marked idempotent (safe to retry) — deliberately not a claim that two\nmints return the same ticket. The ticket is a replayable bearer credential\nwithin its window; `ticket` and `url` are marked sensitive (see StreamTicket).\n\nServes agent principals as well as people: an agent's client-credentials\ntoken can mint tickets for its own live stream. A ticket minted on a\ndelegated request carries its agent, so `self` on the socket it opens\nresolves to that agent.",
|
|
8024
|
+
"operationId": "CreateStreamTicket",
|
|
8025
|
+
"parameters": [],
|
|
8026
|
+
"responses": {
|
|
8027
|
+
"200": {
|
|
8028
|
+
"description": "CreateStreamTicket 200 response",
|
|
8029
|
+
"content": {
|
|
8030
|
+
"application/json": {
|
|
8031
|
+
"schema": {
|
|
8032
|
+
"$ref": "#/components/schemas/CreateStreamTicketResponseContent"
|
|
8033
|
+
}
|
|
8034
|
+
}
|
|
8035
|
+
}
|
|
8036
|
+
},
|
|
8037
|
+
"401": {
|
|
8038
|
+
"description": "UnauthorizedError 401 response",
|
|
8039
|
+
"content": {
|
|
8040
|
+
"application/json": {
|
|
8041
|
+
"schema": {
|
|
8042
|
+
"$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
|
|
8043
|
+
}
|
|
8044
|
+
}
|
|
8045
|
+
}
|
|
8046
|
+
},
|
|
8047
|
+
"403": {
|
|
8048
|
+
"description": "ForbiddenError 403 response",
|
|
8049
|
+
"content": {
|
|
8050
|
+
"application/json": {
|
|
8051
|
+
"schema": {
|
|
8052
|
+
"$ref": "#/components/schemas/ForbiddenErrorResponseContent"
|
|
8053
|
+
}
|
|
8054
|
+
}
|
|
8055
|
+
}
|
|
8056
|
+
},
|
|
8057
|
+
"429": {
|
|
8058
|
+
"description": "RateLimitError 429 response",
|
|
8059
|
+
"content": {
|
|
8060
|
+
"application/json": {
|
|
8061
|
+
"schema": {
|
|
8062
|
+
"$ref": "#/components/schemas/RateLimitErrorResponseContent"
|
|
8063
|
+
}
|
|
8064
|
+
}
|
|
8065
|
+
}
|
|
8066
|
+
},
|
|
8067
|
+
"500": {
|
|
8068
|
+
"description": "InternalServerError 500 response",
|
|
8069
|
+
"content": {
|
|
8070
|
+
"application/json": {
|
|
8071
|
+
"schema": {
|
|
8072
|
+
"$ref": "#/components/schemas/InternalServerErrorResponseContent"
|
|
8073
|
+
}
|
|
8074
|
+
}
|
|
8075
|
+
}
|
|
8076
|
+
}
|
|
8077
|
+
},
|
|
8078
|
+
"tags": [
|
|
8079
|
+
"EventFeed"
|
|
8080
|
+
],
|
|
8081
|
+
"x-basecamp-idempotent": {
|
|
8082
|
+
"natural": true
|
|
8083
|
+
},
|
|
8084
|
+
"x-basecamp-retry": {
|
|
8085
|
+
"maxAttempts": 3,
|
|
8086
|
+
"baseDelayMs": 1000,
|
|
8087
|
+
"backoff": "exponential",
|
|
8088
|
+
"retryOn": [
|
|
8089
|
+
429,
|
|
8090
|
+
503
|
|
8091
|
+
]
|
|
8092
|
+
}
|
|
8093
|
+
}
|
|
8094
|
+
},
|
|
7836
8095
|
"/files.json": {
|
|
7837
8096
|
"get": {
|
|
7838
8097
|
"description": "Get every file recording across all accessible projects, newest-first (paginated).\nHeterogeneous: uploads and Basecamp documents carry their\nstandard recording shapes, while rich-text attachments are wrapped in a\nrecording envelope plus an `attachable_sgid` and blob metadata. Modeled as\nan optional-field superset (EverythingFile) so one element type decodes any\nvariant.",
|
|
@@ -8206,7 +8465,8 @@
|
|
|
8206
8465
|
"$ref": "#/components/schemas/UpdateGaugeNeedleRequestContent"
|
|
8207
8466
|
}
|
|
8208
8467
|
}
|
|
8209
|
-
}
|
|
8468
|
+
},
|
|
8469
|
+
"required": true
|
|
8210
8470
|
},
|
|
8211
8471
|
"parameters": [
|
|
8212
8472
|
{
|
|
@@ -8495,6 +8755,151 @@
|
|
|
8495
8755
|
}
|
|
8496
8756
|
}
|
|
8497
8757
|
},
|
|
8758
|
+
"/inbox.json": {
|
|
8759
|
+
"get": {
|
|
8760
|
+
"description": "Poll the authenticated agent's inbox for the items that addressed it (oldest first, strict item-id order); people receive 403.\n\nThe inbox is the low-noise \"someone addressed you\" lane as its own resource\nrather than a filter over the account feed. **Agents only for now**: any\nother principal receives 403.\n\nAn item is a first-class delivery with its own identity: one event can\naddress the same principal for several reasons, and each reason is its own\nitem. Deduplicate by `addressing_id`, never by event id. Items are never\nself-addressed, are kept for 30 days, and are dropped at read time when the\nevent is no longer readable.\n\n**Entry**: `since=0` replays the earliest retained items, `since=now` enters\nat the present, `position` resumes. Inbox positions are bound to the\naccount, the principal, and the filter set, and are never interchangeable\nwith feed positions.\n\n**Pagination**: cursor style, exactly as PollEvents — the body envelope\n(`items`, `position`, `next`), not the Link header and not the generic\npaginator. Up to 100 items per page.\n\n**Errors** follow PollEvents (FeedRequestError 400, FeedFilterMismatchError\n409), except that 403 carries no body — the agent guard's bare\n`head :forbidden` (BareForbiddenError) — and that the 410 is the inbox's own\nInboxPositionGoneError: the position fell behind the retention window, there\nis no epoch, and `resume` re-enters at `since=0`, the earliest retained item\n— not the feed's recovery, and not interchangeable with it.",
|
|
8761
|
+
"operationId": "PollInbox",
|
|
8762
|
+
"parameters": [
|
|
8763
|
+
{
|
|
8764
|
+
"name": "since",
|
|
8765
|
+
"in": "query",
|
|
8766
|
+
"description": "Entry point: `0` (earliest retained), `now` (present), or a decimal item\nid to start after.",
|
|
8767
|
+
"schema": {
|
|
8768
|
+
"type": "string",
|
|
8769
|
+
"description": "Entry point: `0` (earliest retained), `now` (present), or a decimal item\nid to start after."
|
|
8770
|
+
}
|
|
8771
|
+
},
|
|
8772
|
+
{
|
|
8773
|
+
"name": "position",
|
|
8774
|
+
"in": "query",
|
|
8775
|
+
"description": "Resume token from a previous inbox page's `position`.",
|
|
8776
|
+
"schema": {
|
|
8777
|
+
"type": "string",
|
|
8778
|
+
"description": "Resume token from a previous inbox page's `position`."
|
|
8779
|
+
}
|
|
8780
|
+
},
|
|
8781
|
+
{
|
|
8782
|
+
"name": "reasons",
|
|
8783
|
+
"in": "query",
|
|
8784
|
+
"description": "Comma-separated addressing reasons: `mentioned`, `assigned`, `subscribed`,\n`watched`, `pinged`, `boosted`.",
|
|
8785
|
+
"schema": {
|
|
8786
|
+
"type": "string",
|
|
8787
|
+
"description": "Comma-separated addressing reasons: `mentioned`, `assigned`, `subscribed`,\n`watched`, `pinged`, `boosted`."
|
|
8788
|
+
}
|
|
8789
|
+
},
|
|
8790
|
+
{
|
|
8791
|
+
"name": "types",
|
|
8792
|
+
"in": "query",
|
|
8793
|
+
"description": "Comma-separated event types, as a narrowing filter.",
|
|
8794
|
+
"schema": {
|
|
8795
|
+
"type": "string",
|
|
8796
|
+
"description": "Comma-separated event types, as a narrowing filter."
|
|
8797
|
+
}
|
|
8798
|
+
},
|
|
8799
|
+
{
|
|
8800
|
+
"name": "buckets",
|
|
8801
|
+
"in": "query",
|
|
8802
|
+
"description": "Comma-separated bucket ids, as a narrowing filter (at most 100).",
|
|
8803
|
+
"schema": {
|
|
8804
|
+
"type": "string",
|
|
8805
|
+
"description": "Comma-separated bucket ids, as a narrowing filter (at most 100)."
|
|
8806
|
+
}
|
|
8807
|
+
}
|
|
8808
|
+
],
|
|
8809
|
+
"responses": {
|
|
8810
|
+
"200": {
|
|
8811
|
+
"description": "PollInbox 200 response",
|
|
8812
|
+
"content": {
|
|
8813
|
+
"application/json": {
|
|
8814
|
+
"schema": {
|
|
8815
|
+
"$ref": "#/components/schemas/PollInboxResponseContent"
|
|
8816
|
+
}
|
|
8817
|
+
}
|
|
8818
|
+
}
|
|
8819
|
+
},
|
|
8820
|
+
"400": {
|
|
8821
|
+
"description": "FeedRequestError 400 response",
|
|
8822
|
+
"content": {
|
|
8823
|
+
"application/json": {
|
|
8824
|
+
"schema": {
|
|
8825
|
+
"$ref": "#/components/schemas/FeedRequestErrorResponseContent"
|
|
8826
|
+
}
|
|
8827
|
+
}
|
|
8828
|
+
}
|
|
8829
|
+
},
|
|
8830
|
+
"401": {
|
|
8831
|
+
"description": "UnauthorizedError 401 response",
|
|
8832
|
+
"content": {
|
|
8833
|
+
"application/json": {
|
|
8834
|
+
"schema": {
|
|
8835
|
+
"$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
|
|
8836
|
+
}
|
|
8837
|
+
}
|
|
8838
|
+
}
|
|
8839
|
+
},
|
|
8840
|
+
"403": {
|
|
8841
|
+
"description": "BareForbiddenError 403 response"
|
|
8842
|
+
},
|
|
8843
|
+
"409": {
|
|
8844
|
+
"description": "FeedFilterMismatchError 409 response",
|
|
8845
|
+
"content": {
|
|
8846
|
+
"application/json": {
|
|
8847
|
+
"schema": {
|
|
8848
|
+
"$ref": "#/components/schemas/FeedFilterMismatchErrorResponseContent"
|
|
8849
|
+
}
|
|
8850
|
+
}
|
|
8851
|
+
}
|
|
8852
|
+
},
|
|
8853
|
+
"410": {
|
|
8854
|
+
"description": "InboxPositionGoneError 410 response",
|
|
8855
|
+
"content": {
|
|
8856
|
+
"application/json": {
|
|
8857
|
+
"schema": {
|
|
8858
|
+
"$ref": "#/components/schemas/InboxPositionGoneErrorResponseContent"
|
|
8859
|
+
}
|
|
8860
|
+
}
|
|
8861
|
+
}
|
|
8862
|
+
},
|
|
8863
|
+
"429": {
|
|
8864
|
+
"description": "RateLimitError 429 response",
|
|
8865
|
+
"content": {
|
|
8866
|
+
"application/json": {
|
|
8867
|
+
"schema": {
|
|
8868
|
+
"$ref": "#/components/schemas/RateLimitErrorResponseContent"
|
|
8869
|
+
}
|
|
8870
|
+
}
|
|
8871
|
+
}
|
|
8872
|
+
},
|
|
8873
|
+
"500": {
|
|
8874
|
+
"description": "InternalServerError 500 response",
|
|
8875
|
+
"content": {
|
|
8876
|
+
"application/json": {
|
|
8877
|
+
"schema": {
|
|
8878
|
+
"$ref": "#/components/schemas/InternalServerErrorResponseContent"
|
|
8879
|
+
}
|
|
8880
|
+
}
|
|
8881
|
+
}
|
|
8882
|
+
}
|
|
8883
|
+
},
|
|
8884
|
+
"tags": [
|
|
8885
|
+
"EventFeed"
|
|
8886
|
+
],
|
|
8887
|
+
"x-basecamp-pagination": {
|
|
8888
|
+
"style": "cursor",
|
|
8889
|
+
"key": "items",
|
|
8890
|
+
"maxPageSize": 100
|
|
8891
|
+
},
|
|
8892
|
+
"x-basecamp-retry": {
|
|
8893
|
+
"maxAttempts": 3,
|
|
8894
|
+
"baseDelayMs": 1000,
|
|
8895
|
+
"backoff": "exponential",
|
|
8896
|
+
"retryOn": [
|
|
8897
|
+
429,
|
|
8898
|
+
503
|
|
8899
|
+
]
|
|
8900
|
+
}
|
|
8901
|
+
}
|
|
8902
|
+
},
|
|
8498
8903
|
"/inbox_forwards/{forwardId}": {
|
|
8499
8904
|
"get": {
|
|
8500
8905
|
"description": "Get a forward by ID",
|
|
@@ -11021,6 +11426,9 @@
|
|
|
11021
11426
|
}
|
|
11022
11427
|
}
|
|
11023
11428
|
},
|
|
11429
|
+
"tags": [
|
|
11430
|
+
"Checkins"
|
|
11431
|
+
],
|
|
11024
11432
|
"x-basecamp-pagination": {
|
|
11025
11433
|
"style": "link",
|
|
11026
11434
|
"maxPageSize": 50
|
|
@@ -12721,6 +13129,16 @@
|
|
|
12721
13129
|
}
|
|
12722
13130
|
}
|
|
12723
13131
|
},
|
|
13132
|
+
"404": {
|
|
13133
|
+
"description": "NotFoundError 404 response",
|
|
13134
|
+
"content": {
|
|
13135
|
+
"application/json": {
|
|
13136
|
+
"schema": {
|
|
13137
|
+
"$ref": "#/components/schemas/NotFoundErrorResponseContent"
|
|
13138
|
+
}
|
|
13139
|
+
}
|
|
13140
|
+
}
|
|
13141
|
+
},
|
|
12724
13142
|
"429": {
|
|
12725
13143
|
"description": "RateLimitError 429 response",
|
|
12726
13144
|
"content": {
|
|
@@ -13785,6 +14203,9 @@
|
|
|
13785
14203
|
}
|
|
13786
14204
|
}
|
|
13787
14205
|
},
|
|
14206
|
+
"tags": [
|
|
14207
|
+
"Timeline"
|
|
14208
|
+
],
|
|
13788
14209
|
"x-basecamp-pagination": {
|
|
13789
14210
|
"style": "link",
|
|
13790
14211
|
"totalCountHeader": "X-Total-Count",
|
|
@@ -14825,6 +15246,9 @@
|
|
|
14825
15246
|
}
|
|
14826
15247
|
}
|
|
14827
15248
|
},
|
|
15249
|
+
"tags": [
|
|
15250
|
+
"Checkins"
|
|
15251
|
+
],
|
|
14828
15252
|
"x-basecamp-pagination": {
|
|
14829
15253
|
"style": "link",
|
|
14830
15254
|
"maxPageSize": 50
|
|
@@ -14936,6 +15360,9 @@
|
|
|
14936
15360
|
}
|
|
14937
15361
|
}
|
|
14938
15362
|
},
|
|
15363
|
+
"tags": [
|
|
15364
|
+
"Checkins"
|
|
15365
|
+
],
|
|
14939
15366
|
"x-basecamp-pagination": {
|
|
14940
15367
|
"style": "link",
|
|
14941
15368
|
"maxPageSize": 50
|
|
@@ -15037,6 +15464,9 @@
|
|
|
15037
15464
|
}
|
|
15038
15465
|
}
|
|
15039
15466
|
},
|
|
15467
|
+
"tags": [
|
|
15468
|
+
"Checkins"
|
|
15469
|
+
],
|
|
15040
15470
|
"x-basecamp-idempotent": {
|
|
15041
15471
|
"natural": true
|
|
15042
15472
|
},
|
|
@@ -15118,6 +15548,9 @@
|
|
|
15118
15548
|
}
|
|
15119
15549
|
}
|
|
15120
15550
|
},
|
|
15551
|
+
"tags": [
|
|
15552
|
+
"Checkins"
|
|
15553
|
+
],
|
|
15121
15554
|
"x-basecamp-idempotent": {
|
|
15122
15555
|
"natural": true
|
|
15123
15556
|
},
|
|
@@ -15207,6 +15640,9 @@
|
|
|
15207
15640
|
}
|
|
15208
15641
|
}
|
|
15209
15642
|
},
|
|
15643
|
+
"tags": [
|
|
15644
|
+
"Checkins"
|
|
15645
|
+
],
|
|
15210
15646
|
"x-basecamp-idempotent": {
|
|
15211
15647
|
"natural": true
|
|
15212
15648
|
},
|
|
@@ -18139,6 +18575,9 @@
|
|
|
18139
18575
|
}
|
|
18140
18576
|
}
|
|
18141
18577
|
},
|
|
18578
|
+
"tags": [
|
|
18579
|
+
"Reports"
|
|
18580
|
+
],
|
|
18142
18581
|
"x-basecamp-pagination": {
|
|
18143
18582
|
"style": "link",
|
|
18144
18583
|
"totalCountHeader": "X-Total-Count",
|
|
@@ -18243,6 +18682,9 @@
|
|
|
18243
18682
|
}
|
|
18244
18683
|
}
|
|
18245
18684
|
},
|
|
18685
|
+
"tags": [
|
|
18686
|
+
"Reports"
|
|
18687
|
+
],
|
|
18246
18688
|
"x-basecamp-retry": {
|
|
18247
18689
|
"maxAttempts": 3,
|
|
18248
18690
|
"baseDelayMs": 1000,
|
|
@@ -18405,6 +18847,9 @@
|
|
|
18405
18847
|
}
|
|
18406
18848
|
}
|
|
18407
18849
|
},
|
|
18850
|
+
"tags": [
|
|
18851
|
+
"People"
|
|
18852
|
+
],
|
|
18408
18853
|
"x-basecamp-retry": {
|
|
18409
18854
|
"maxAttempts": 3,
|
|
18410
18855
|
"baseDelayMs": 1000,
|
|
@@ -18502,6 +18947,9 @@
|
|
|
18502
18947
|
}
|
|
18503
18948
|
}
|
|
18504
18949
|
},
|
|
18950
|
+
"tags": [
|
|
18951
|
+
"Reports"
|
|
18952
|
+
],
|
|
18505
18953
|
"x-basecamp-retry": {
|
|
18506
18954
|
"maxAttempts": 3,
|
|
18507
18955
|
"baseDelayMs": 1000,
|
|
@@ -18570,6 +19018,9 @@
|
|
|
18570
19018
|
}
|
|
18571
19019
|
}
|
|
18572
19020
|
},
|
|
19021
|
+
"tags": [
|
|
19022
|
+
"Reports"
|
|
19023
|
+
],
|
|
18573
19024
|
"x-basecamp-retry": {
|
|
18574
19025
|
"maxAttempts": 3,
|
|
18575
19026
|
"baseDelayMs": 1000,
|
|
@@ -18668,6 +19119,9 @@
|
|
|
18668
19119
|
}
|
|
18669
19120
|
}
|
|
18670
19121
|
},
|
|
19122
|
+
"tags": [
|
|
19123
|
+
"Reports"
|
|
19124
|
+
],
|
|
18671
19125
|
"x-basecamp-pagination": {
|
|
18672
19126
|
"style": "link",
|
|
18673
19127
|
"totalCountHeader": "X-Total-Count",
|
|
@@ -22992,6 +23446,9 @@
|
|
|
22992
23446
|
}
|
|
22993
23447
|
}
|
|
22994
23448
|
},
|
|
23449
|
+
"tags": [
|
|
23450
|
+
"Todos"
|
|
23451
|
+
],
|
|
22995
23452
|
"x-basecamp-idempotent": {
|
|
22996
23453
|
"natural": true
|
|
22997
23454
|
},
|
|
@@ -27021,7 +27478,7 @@
|
|
|
27021
27478
|
},
|
|
27022
27479
|
"notify": {
|
|
27023
27480
|
"type": "string",
|
|
27024
|
-
"description": "Who to notify: \"everyone\", \"
|
|
27481
|
+
"description": "Who to notify: \"everyone\", \"default\" (the project's existing\nsubscribers), or \"custom\" (the people in `subscriptions`). Omit for\nnobody: bc3 defaults `notify` to \"custom\", which with no `subscriptions`\nnotifies no one, and any unrecognized value (`Subscribers#find_subscribers`\naccepts exactly these three) falls through to nobody as well."
|
|
27025
27482
|
},
|
|
27026
27483
|
"subscriptions": {
|
|
27027
27484
|
"type": "array",
|
|
@@ -27301,6 +27758,40 @@
|
|
|
27301
27758
|
"CreateScheduleEntryResponseContent": {
|
|
27302
27759
|
"$ref": "#/components/schemas/ScheduleEntry"
|
|
27303
27760
|
},
|
|
27761
|
+
"CreateStreamTicketResponseContent": {
|
|
27762
|
+
"type": "object",
|
|
27763
|
+
"description": "A minted stream ticket. `url` already carries the ticket in its query\nstring; connect to it verbatim.",
|
|
27764
|
+
"properties": {
|
|
27765
|
+
"ticket": {
|
|
27766
|
+
"type": "string",
|
|
27767
|
+
"description": "The signed ticket — an opaque bearer credential, never parsed or logged.",
|
|
27768
|
+
"format": "password",
|
|
27769
|
+
"x-basecamp-sensitive": {
|
|
27770
|
+
"category": "credential",
|
|
27771
|
+
"redact": true
|
|
27772
|
+
}
|
|
27773
|
+
},
|
|
27774
|
+
"expires_in": {
|
|
27775
|
+
"type": "integer",
|
|
27776
|
+
"description": "Ticket lifetime in seconds (about 120). Server-owned: expiry is arbitrated\nby the server, so mint fresh per connection rather than scheduling on it.",
|
|
27777
|
+
"format": "int32"
|
|
27778
|
+
},
|
|
27779
|
+
"url": {
|
|
27780
|
+
"type": "string",
|
|
27781
|
+
"description": "The exact WebSocket URL to connect to, ticket included. Sensitive because\nit embeds the ticket.",
|
|
27782
|
+
"format": "password",
|
|
27783
|
+
"x-basecamp-sensitive": {
|
|
27784
|
+
"category": "credential",
|
|
27785
|
+
"redact": true
|
|
27786
|
+
}
|
|
27787
|
+
}
|
|
27788
|
+
},
|
|
27789
|
+
"required": [
|
|
27790
|
+
"expires_in",
|
|
27791
|
+
"ticket",
|
|
27792
|
+
"url"
|
|
27793
|
+
]
|
|
27794
|
+
},
|
|
27304
27795
|
"CreateTemplateLibraryCopyRequestContent": {
|
|
27305
27796
|
"type": "object",
|
|
27306
27797
|
"properties": {
|
|
@@ -27968,6 +28459,9 @@
|
|
|
27968
28459
|
"creator": {
|
|
27969
28460
|
"$ref": "#/components/schemas/Person"
|
|
27970
28461
|
},
|
|
28462
|
+
"performed_by": {
|
|
28463
|
+
"$ref": "#/components/schemas/Person"
|
|
28464
|
+
},
|
|
27971
28465
|
"boosts_count": {
|
|
27972
28466
|
"type": "integer",
|
|
27973
28467
|
"format": "int32"
|
|
@@ -28156,6 +28650,135 @@
|
|
|
28156
28650
|
}
|
|
28157
28651
|
}
|
|
28158
28652
|
},
|
|
28653
|
+
"FeedEvent": {
|
|
28654
|
+
"type": "object",
|
|
28655
|
+
"description": "One feed row: a thin pointer, not resource state. Refetch the referenced\nrecording through the canonical resource APIs before acting on it. The same\nshape rides the inbox (`InboxItem.event`) and, with two transport-only\nextras, the live stream.",
|
|
28656
|
+
"properties": {
|
|
28657
|
+
"id": {
|
|
28658
|
+
"type": "integer",
|
|
28659
|
+
"description": "Feed-global event id; the poll lane serves ids in strict ascending order.",
|
|
28660
|
+
"format": "int64"
|
|
28661
|
+
},
|
|
28662
|
+
"kind": {
|
|
28663
|
+
"type": "string",
|
|
28664
|
+
"description": "Event kind (e.g. `message_created`)."
|
|
28665
|
+
},
|
|
28666
|
+
"action": {
|
|
28667
|
+
"type": "string",
|
|
28668
|
+
"description": "The action that produced the event (e.g. `created`)."
|
|
28669
|
+
},
|
|
28670
|
+
"event_type": {
|
|
28671
|
+
"type": "string",
|
|
28672
|
+
"description": "Cataloged event type (e.g. `message.created`). Only cataloged types are served."
|
|
28673
|
+
},
|
|
28674
|
+
"bucket_id": {
|
|
28675
|
+
"type": "integer",
|
|
28676
|
+
"description": "The bucket (project or circle) the recording lives in.",
|
|
28677
|
+
"format": "int64"
|
|
28678
|
+
},
|
|
28679
|
+
"creator_id": {
|
|
28680
|
+
"type": "integer",
|
|
28681
|
+
"description": "The person the action is attributed to.",
|
|
28682
|
+
"format": "int64"
|
|
28683
|
+
},
|
|
28684
|
+
"performed_by_id": {
|
|
28685
|
+
"type": [
|
|
28686
|
+
"integer",
|
|
28687
|
+
"null"
|
|
28688
|
+
],
|
|
28689
|
+
"description": "The agent that carried out a delegated action; `null` on the wire when the\naction was performed directly. The effective performer — used by the\n`performers`/`exclude_performers` filters — is this when present, else\n`creator_id`.",
|
|
28690
|
+
"format": "int64",
|
|
28691
|
+
"x-go-type": "int64"
|
|
28692
|
+
},
|
|
28693
|
+
"recording_id": {
|
|
28694
|
+
"type": "integer",
|
|
28695
|
+
"description": "The recording the event references.",
|
|
28696
|
+
"format": "int64"
|
|
28697
|
+
},
|
|
28698
|
+
"created_at": {
|
|
28699
|
+
"type": "string",
|
|
28700
|
+
"x-go-type": "time.Time",
|
|
28701
|
+
"x-go-type-import": {
|
|
28702
|
+
"path": "time"
|
|
28703
|
+
}
|
|
28704
|
+
},
|
|
28705
|
+
"details": {
|
|
28706
|
+
"description": "Type-specific details, carried verbatim as a JSON document — present only\nfor the types that publish one, absent (not empty) for every other type.\n`boost.created` publishes `boost_id`, plus `boosted_event_id` and\n`boosted_event_type`, both `null` for a boost on the recording itself\n(`boosted_event_type` also `null` when the boosted event's kind is not\ncataloged); `card.moved` publishes `column_id` and `previous_column_id`,\nthe containing columns (going on hold within a column reports the same\ncolumn twice). Verbatim on purpose: the connector's push lane delivers\nthe same object, and a typed projection would drop explicit nulls and\nany member a newly cataloged type adds, making the two lanes disagree.\nGo carries it as `json.RawMessage`; TypeScript `unknown`; Python `Any`;\nRuby a Hash; Kotlin `JsonElement`; Rust `serde_json::Value`; Swift the\nSDK's `JSONValue` (numbers as `Double`).",
|
|
28707
|
+
"x-go-type": "json.RawMessage"
|
|
28708
|
+
}
|
|
28709
|
+
},
|
|
28710
|
+
"required": [
|
|
28711
|
+
"action",
|
|
28712
|
+
"bucket_id",
|
|
28713
|
+
"created_at",
|
|
28714
|
+
"creator_id",
|
|
28715
|
+
"event_type",
|
|
28716
|
+
"id",
|
|
28717
|
+
"kind",
|
|
28718
|
+
"recording_id"
|
|
28719
|
+
]
|
|
28720
|
+
},
|
|
28721
|
+
"FeedFilterMismatchErrorResponseContent": {
|
|
28722
|
+
"type": "object",
|
|
28723
|
+
"description": "409 from the event feed's poll lanes (PollEvents, PollInbox): the held\n`position` was minted for a different filter set than the request presented.\nPositions are bound to their filter set; re-enter with `since=<id>` or\n`since=now` to acknowledge the filter change. Both digests are the bare\n16-lowercase-hex `srv2` filter digest BC3 publishes in\ndoc/api/sections/event_feed.md (\"Filter digests\").",
|
|
28724
|
+
"properties": {
|
|
28725
|
+
"error": {
|
|
28726
|
+
"type": "string"
|
|
28727
|
+
},
|
|
28728
|
+
"position_digest": {
|
|
28729
|
+
"type": "string",
|
|
28730
|
+
"description": "The digest of the filter set the position was minted for."
|
|
28731
|
+
},
|
|
28732
|
+
"filters_digest": {
|
|
28733
|
+
"type": "string",
|
|
28734
|
+
"description": "The digest of the filter set this request presented."
|
|
28735
|
+
}
|
|
28736
|
+
},
|
|
28737
|
+
"required": [
|
|
28738
|
+
"error",
|
|
28739
|
+
"filters_digest",
|
|
28740
|
+
"position_digest"
|
|
28741
|
+
]
|
|
28742
|
+
},
|
|
28743
|
+
"FeedPositionGoneErrorResponseContent": {
|
|
28744
|
+
"type": "object",
|
|
28745
|
+
"description": "410 from PollEvents: the held `position` predates the feed's epoch — an\noperational fence that can be raised. `epoch_after_id` names the epoch and\n`resume` is an absolute URL that re-enters the feed AT THE EPOCH\n(`since=<epoch_after_id>`) with the request's canonical filters preserved,\nso the servable history above the fence is not skipped. Not interchangeable\nwith the inbox's InboxPositionGoneError, whose recovery re-enters at\n`since=0`. Consumers validate the URL (same origin as the API base, no scheme\ndowngrade) before following it — SPEC.md §23 \"Continuation and Resume URL\nValidation\".",
|
|
28746
|
+
"properties": {
|
|
28747
|
+
"error": {
|
|
28748
|
+
"type": "string"
|
|
28749
|
+
},
|
|
28750
|
+
"epoch_after_id": {
|
|
28751
|
+
"type": "integer",
|
|
28752
|
+
"description": "The feed's epoch: the event id after which history is servable.",
|
|
28753
|
+
"format": "int64"
|
|
28754
|
+
},
|
|
28755
|
+
"resume": {
|
|
28756
|
+
"type": "string",
|
|
28757
|
+
"description": "Absolute re-entry URL for the feed, at the epoch, filters preserved."
|
|
28758
|
+
}
|
|
28759
|
+
},
|
|
28760
|
+
"required": [
|
|
28761
|
+
"epoch_after_id",
|
|
28762
|
+
"error",
|
|
28763
|
+
"resume"
|
|
28764
|
+
]
|
|
28765
|
+
},
|
|
28766
|
+
"FeedRequestErrorResponseContent": {
|
|
28767
|
+
"type": "object",
|
|
28768
|
+
"description": "400 from the event feed's poll lanes (PollEvents, PollInbox). Two distinct\ncases share the status: a malformed `position` (recover by re-entering with\n`since=`) and a malformed filter (fix the filters; a position reset will not\nhelp). `reason` tells them apart — `invalid_position` or `invalid_filter`\n(bc3 #13362) — and is OPTIONAL: a server that has not shipped it answers the\nflat `{error}` body, and a consumer that finds `reason` absent must treat the\n400 as undifferentiated and surface it rather than guess between recovering\nand stopping.",
|
|
28769
|
+
"properties": {
|
|
28770
|
+
"error": {
|
|
28771
|
+
"type": "string"
|
|
28772
|
+
},
|
|
28773
|
+
"reason": {
|
|
28774
|
+
"type": "string",
|
|
28775
|
+
"description": "`invalid_position` (re-enter with `since=`) or `invalid_filter` (fix the\nfilters). Absent from servers that predate bc3 #13362: then the 400 is\nundifferentiated."
|
|
28776
|
+
}
|
|
28777
|
+
},
|
|
28778
|
+
"required": [
|
|
28779
|
+
"error"
|
|
28780
|
+
]
|
|
28781
|
+
},
|
|
28159
28782
|
"FieldErrorMap": {
|
|
28160
28783
|
"type": "object",
|
|
28161
28784
|
"additionalProperties": {
|
|
@@ -28650,7 +29273,9 @@
|
|
|
28650
29273
|
},
|
|
28651
29274
|
"previous_needle_position": {
|
|
28652
29275
|
"type": "integer",
|
|
28653
|
-
"
|
|
29276
|
+
"description": "Emitted alongside the other needle keys (so optional, like them), and\nJSON `null` for a gauge whose only needle is its first — there is no\nprevious position yet. The enhance pass layers `nullable: true` onto the\nOpenAPI so the static SDKs type the value as nullable rather than\nflattening the first needle's null into a real 0.",
|
|
29277
|
+
"format": "int32",
|
|
29278
|
+
"nullable": true
|
|
28654
29279
|
}
|
|
28655
29280
|
},
|
|
28656
29281
|
"required": [
|
|
@@ -28745,9 +29370,15 @@
|
|
|
28745
29370
|
"position": {
|
|
28746
29371
|
"type": "integer",
|
|
28747
29372
|
"format": "int32"
|
|
29373
|
+
},
|
|
29374
|
+
"comment_count": {
|
|
29375
|
+
"type": "integer",
|
|
29376
|
+
"description": "Comment count of the needle: the singular branch-partial key that\ngauges/needles/_needle.json.jbuilder emits unconditionally, distinct from\nthe envelope's plural `comments_count`, which a needle also carries. The\nsame pair SearchResult models.",
|
|
29377
|
+
"format": "int32"
|
|
28748
29378
|
}
|
|
28749
29379
|
},
|
|
28750
29380
|
"required": [
|
|
29381
|
+
"comment_count",
|
|
28751
29382
|
"created_at",
|
|
28752
29383
|
"description_attachments",
|
|
28753
29384
|
"id",
|
|
@@ -28780,9 +29411,12 @@
|
|
|
28780
29411
|
"properties": {
|
|
28781
29412
|
"description": {
|
|
28782
29413
|
"type": "string",
|
|
28783
|
-
"description": "Rich text (HTML) description"
|
|
29414
|
+
"description": "Rich text (HTML) description. Required: it is the only member bc3's\nupdate accepts (`needle_params.except(:color, :position)`), and\n`params.require(:gauge_needle)` rejects an empty wrapper as missing, so a\npayload without it is the same 400 as no wrapper at all."
|
|
28784
29415
|
}
|
|
28785
|
-
}
|
|
29416
|
+
},
|
|
29417
|
+
"required": [
|
|
29418
|
+
"description"
|
|
29419
|
+
]
|
|
28786
29420
|
},
|
|
28787
29421
|
"GaugeTogglePayload": {
|
|
28788
29422
|
"type": "object",
|
|
@@ -29538,6 +30172,53 @@
|
|
|
29538
30172
|
"visible_to_clients"
|
|
29539
30173
|
]
|
|
29540
30174
|
},
|
|
30175
|
+
"InboxItem": {
|
|
30176
|
+
"type": "object",
|
|
30177
|
+
"description": "One addressed delivery. `addressing_id` is the item's own identity — the\ndedupe key — since one event can address the same principal for several\nreasons.",
|
|
30178
|
+
"properties": {
|
|
30179
|
+
"addressing_id": {
|
|
30180
|
+
"type": "integer",
|
|
30181
|
+
"format": "int64"
|
|
30182
|
+
},
|
|
30183
|
+
"reason": {
|
|
30184
|
+
"type": "string",
|
|
30185
|
+
"description": "Why the principal was addressed: `mentioned`, `assigned`, `subscribed`,\n`watched`, `pinged`, or `boosted`."
|
|
30186
|
+
},
|
|
30187
|
+
"addressed_at": {
|
|
30188
|
+
"type": "string",
|
|
30189
|
+
"x-go-type": "time.Time",
|
|
30190
|
+
"x-go-type-import": {
|
|
30191
|
+
"path": "time"
|
|
30192
|
+
}
|
|
30193
|
+
},
|
|
30194
|
+
"event": {
|
|
30195
|
+
"$ref": "#/components/schemas/FeedEvent"
|
|
30196
|
+
}
|
|
30197
|
+
},
|
|
30198
|
+
"required": [
|
|
30199
|
+
"addressed_at",
|
|
30200
|
+
"addressing_id",
|
|
30201
|
+
"event",
|
|
30202
|
+
"reason"
|
|
30203
|
+
]
|
|
30204
|
+
},
|
|
30205
|
+
"InboxPositionGoneErrorResponseContent": {
|
|
30206
|
+
"type": "object",
|
|
30207
|
+
"description": "410 from PollInbox: the held `position` fell behind the inbox's 30-day\nretention window. There is no epoch; `resume` is an absolute URL that\nre-enters the inbox at `since=0`, the earliest retained item — exactly-once\ncontinuation, since a stale position has seen none of the retained backlog.\nA distinct shape from the feed's FeedPositionGoneError on purpose: the two\nrecoveries are not interchangeable, and a consumer must not handle one lane's\n410 with the other's arm. Validate the URL before following it, as for the\nfeed.",
|
|
30208
|
+
"properties": {
|
|
30209
|
+
"error": {
|
|
30210
|
+
"type": "string"
|
|
30211
|
+
},
|
|
30212
|
+
"resume": {
|
|
30213
|
+
"type": "string",
|
|
30214
|
+
"description": "Absolute re-entry URL for the inbox, at `since=0`, filters preserved."
|
|
30215
|
+
}
|
|
30216
|
+
},
|
|
30217
|
+
"required": [
|
|
30218
|
+
"error",
|
|
30219
|
+
"resume"
|
|
30220
|
+
]
|
|
30221
|
+
},
|
|
29541
30222
|
"InternalServerErrorResponseContent": {
|
|
29542
30223
|
"type": "object",
|
|
29543
30224
|
"properties": {
|
|
@@ -30570,48 +31251,68 @@
|
|
|
30570
31251
|
}
|
|
30571
31252
|
},
|
|
30572
31253
|
"email_address": {
|
|
30573
|
-
"type":
|
|
31254
|
+
"type": [
|
|
31255
|
+
"string",
|
|
31256
|
+
"null"
|
|
31257
|
+
],
|
|
30574
31258
|
"format": "password",
|
|
30575
31259
|
"x-basecamp-sensitive": {
|
|
30576
31260
|
"category": "pii",
|
|
30577
31261
|
"redact": true
|
|
30578
|
-
}
|
|
31262
|
+
},
|
|
31263
|
+
"x-go-type": "string"
|
|
30579
31264
|
},
|
|
30580
31265
|
"personable_type": {
|
|
30581
31266
|
"type": "string"
|
|
30582
31267
|
},
|
|
30583
31268
|
"title": {
|
|
30584
|
-
"type":
|
|
31269
|
+
"type": [
|
|
31270
|
+
"string",
|
|
31271
|
+
"null"
|
|
31272
|
+
],
|
|
30585
31273
|
"format": "password",
|
|
30586
31274
|
"x-basecamp-sensitive": {
|
|
30587
31275
|
"category": "pii",
|
|
30588
31276
|
"redact": false
|
|
30589
|
-
}
|
|
31277
|
+
},
|
|
31278
|
+
"x-go-type": "string"
|
|
30590
31279
|
},
|
|
30591
31280
|
"bio": {
|
|
30592
|
-
"type":
|
|
31281
|
+
"type": [
|
|
31282
|
+
"string",
|
|
31283
|
+
"null"
|
|
31284
|
+
],
|
|
30593
31285
|
"format": "password",
|
|
30594
31286
|
"x-basecamp-sensitive": {
|
|
30595
31287
|
"category": "pii",
|
|
30596
31288
|
"redact": false
|
|
30597
|
-
}
|
|
31289
|
+
},
|
|
31290
|
+
"x-go-type": "string"
|
|
30598
31291
|
},
|
|
30599
31292
|
"tagline": {
|
|
30600
|
-
"type":
|
|
31293
|
+
"type": [
|
|
31294
|
+
"string",
|
|
31295
|
+
"null"
|
|
31296
|
+
],
|
|
30601
31297
|
"description": "Alias of `bio` introduced in BC5. BC3 emits both keys with identical content;\nolder BC4 responses may omit `tagline`. Prefer `bio` for cross-version reads.",
|
|
30602
31298
|
"format": "password",
|
|
30603
31299
|
"x-basecamp-sensitive": {
|
|
30604
31300
|
"category": "pii",
|
|
30605
31301
|
"redact": false
|
|
30606
|
-
}
|
|
31302
|
+
},
|
|
31303
|
+
"x-go-type": "string"
|
|
30607
31304
|
},
|
|
30608
31305
|
"location": {
|
|
30609
|
-
"type":
|
|
31306
|
+
"type": [
|
|
31307
|
+
"string",
|
|
31308
|
+
"null"
|
|
31309
|
+
],
|
|
30610
31310
|
"format": "password",
|
|
30611
31311
|
"x-basecamp-sensitive": {
|
|
30612
31312
|
"category": "pii",
|
|
30613
31313
|
"redact": false
|
|
30614
|
-
}
|
|
31314
|
+
},
|
|
31315
|
+
"x-go-type": "string"
|
|
30615
31316
|
},
|
|
30616
31317
|
"created_at": {
|
|
30617
31318
|
"type": "string",
|
|
@@ -30691,6 +31392,55 @@
|
|
|
30691
31392
|
"name"
|
|
30692
31393
|
]
|
|
30693
31394
|
},
|
|
31395
|
+
"PollEventsResponseContent": {
|
|
31396
|
+
"type": "object",
|
|
31397
|
+
"description": "The poll envelope. Every 200 carries `events` and `position`; `next` only\nwhile the walk continues.",
|
|
31398
|
+
"properties": {
|
|
31399
|
+
"events": {
|
|
31400
|
+
"type": "array",
|
|
31401
|
+
"items": {
|
|
31402
|
+
"$ref": "#/components/schemas/FeedEvent"
|
|
31403
|
+
},
|
|
31404
|
+
"description": "Up to 100 events, oldest first, strict event-id order. A page may be empty\nwhile the walk crosses history the filters exclude — keep following `next`."
|
|
31405
|
+
},
|
|
31406
|
+
"position": {
|
|
31407
|
+
"type": "string",
|
|
31408
|
+
"description": "Durable position token for resuming later. Persist only after the page's\nevents have been processed."
|
|
31409
|
+
},
|
|
31410
|
+
"next": {
|
|
31411
|
+
"type": "string",
|
|
31412
|
+
"description": "Absolute continuation URL, present only while the current walk has more\nto serve; absent means the walk reached its (frozen) head — poll again\nlater from `position`."
|
|
31413
|
+
}
|
|
31414
|
+
},
|
|
31415
|
+
"required": [
|
|
31416
|
+
"events",
|
|
31417
|
+
"position"
|
|
31418
|
+
]
|
|
31419
|
+
},
|
|
31420
|
+
"PollInboxResponseContent": {
|
|
31421
|
+
"type": "object",
|
|
31422
|
+
"description": "The inbox envelope: `items` and `position` on every 200, `next` while the\nwalk continues.",
|
|
31423
|
+
"properties": {
|
|
31424
|
+
"items": {
|
|
31425
|
+
"type": "array",
|
|
31426
|
+
"items": {
|
|
31427
|
+
"$ref": "#/components/schemas/InboxItem"
|
|
31428
|
+
}
|
|
31429
|
+
},
|
|
31430
|
+
"position": {
|
|
31431
|
+
"type": "string",
|
|
31432
|
+
"description": "Durable inbox position. Persist only after the page's items have been\nprocessed."
|
|
31433
|
+
},
|
|
31434
|
+
"next": {
|
|
31435
|
+
"type": "string",
|
|
31436
|
+
"description": "Absolute continuation URL, present only while the walk has more to serve."
|
|
31437
|
+
}
|
|
31438
|
+
},
|
|
31439
|
+
"required": [
|
|
31440
|
+
"items",
|
|
31441
|
+
"position"
|
|
31442
|
+
]
|
|
31443
|
+
},
|
|
30694
31444
|
"Preferences": {
|
|
30695
31445
|
"type": "object",
|
|
30696
31446
|
"properties": {
|
|
@@ -34084,7 +34834,10 @@
|
|
|
34084
34834
|
"gauge_needle": {
|
|
34085
34835
|
"$ref": "#/components/schemas/GaugeNeedleUpdatePayload"
|
|
34086
34836
|
}
|
|
34087
|
-
}
|
|
34837
|
+
},
|
|
34838
|
+
"required": [
|
|
34839
|
+
"gauge_needle"
|
|
34840
|
+
]
|
|
34088
34841
|
},
|
|
34089
34842
|
"UpdateGaugeNeedleResponseContent": {
|
|
34090
34843
|
"$ref": "#/components/schemas/GaugeNeedle"
|
|
@@ -35026,6 +35779,9 @@
|
|
|
35026
35779
|
"creator": {
|
|
35027
35780
|
"$ref": "#/components/schemas/Person"
|
|
35028
35781
|
},
|
|
35782
|
+
"performed_by": {
|
|
35783
|
+
"$ref": "#/components/schemas/Person"
|
|
35784
|
+
},
|
|
35029
35785
|
"copy": {
|
|
35030
35786
|
"$ref": "#/components/schemas/WebhookCopy"
|
|
35031
35787
|
}
|