@indorania/contracts 0.1.0 → 0.1.1-alpha.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.
Files changed (40) hide show
  1. package/README.md +196 -117
  2. package/dist/common.d.ts +2 -0
  3. package/dist/common.d.ts.map +1 -1
  4. package/dist/common.js +2 -0
  5. package/dist/common.js.map +1 -1
  6. package/dist/document.js +14 -14
  7. package/dist/op.d.ts +5 -0
  8. package/dist/op.d.ts.map +1 -1
  9. package/dist/op.js +11 -1
  10. package/dist/op.js.map +1 -1
  11. package/dist/routes/asks.d.ts +67 -0
  12. package/dist/routes/asks.d.ts.map +1 -1
  13. package/dist/routes/asks.js +93 -5
  14. package/dist/routes/asks.js.map +1 -1
  15. package/dist/routes/integration.d.ts +2 -0
  16. package/dist/routes/integration.d.ts.map +1 -1
  17. package/dist/routes/integration.js +8 -7
  18. package/dist/routes/integration.js.map +1 -1
  19. package/dist/routes/presentations.d.ts +18 -0
  20. package/dist/routes/presentations.d.ts.map +1 -1
  21. package/dist/routes/presentations.js +16 -4
  22. package/dist/routes/presentations.js.map +1 -1
  23. package/dist/routes/sessions.d.ts +37 -0
  24. package/dist/routes/sessions.d.ts.map +1 -1
  25. package/dist/routes/sessions.js +45 -10
  26. package/dist/routes/sessions.js.map +1 -1
  27. package/dist/routes/standing.d.ts.map +1 -1
  28. package/dist/routes/standing.js +6 -4
  29. package/dist/routes/standing.js.map +1 -1
  30. package/dist/routes/thank-yous.d.ts +4 -0
  31. package/dist/routes/thank-yous.d.ts.map +1 -1
  32. package/dist/routes/thank-yous.js +37 -7
  33. package/dist/routes/thank-yous.js.map +1 -1
  34. package/dist/versions.d.ts +12 -4
  35. package/dist/versions.d.ts.map +1 -1
  36. package/dist/versions.js +12 -4
  37. package/dist/versions.js.map +1 -1
  38. package/openapi/2026-09-25.json +781 -43
  39. package/openapi/versions.json +1 -1
  40. package/package.json +7 -3
@@ -3,7 +3,7 @@
3
3
  "info": {
4
4
  "title": "Indorania platform API",
5
5
  "version": "2026-09-25",
6
- "description": "The platform contract that every member, and any outside issuer, builds against (ECOSYSTEM decision 47). A member integrates exactly as a stranger would.\n\n**Versions.** The URL carries the major version (`/v1`). Every request speaks a dated version: send `Indorania-Version: YYYY-MM-DD`, or your organisation's or integration's pinned version applies; with neither, the request is refused. Inside a released version, changes are additive only — new operations, new optional fields, new enum values, new problem codes — so treat anything unknown gracefully. Any other change is a new dated version, and the platform translates between the two. A version is a **preview** until its first release, and may still change in place.\n\n**Exempt from dated versions:** the OpenID4VCI and OpenID4VP endpoints, which their standards version, and documents that describe themselves: the trust list, the webhook keys, the version list, and these documents.\n\n**Errors** are RFC 9457 problem details (`application/problem+json`), each with a stable `code`.\n\n**Idempotency.** Every change made through this API carries an `Idempotency-Key` (IETF draft-07). Without one it is refused (400). The same key and body get the first answer again for 24 hours; the same key with another body is refused (422); a key still running is refused (409). Protocol endpoints rely on their own single-use code or nonce, and webhooks on `webhook-id`.\n\n**Webhooks,** in both directions: Standard Webhooks 1.0.0, v1a (Ed25519), with a 300-second tolerance.\n\n**What it never does.** No endpoint lists a house's members, answers \"everything matching X\", records a decline, meters records, scores a person, or joins a person across relationships: person-side identifiers are relationship identifiers, one at a time. Lints check this document for all of it.\n\n**Status.** Every operation marked `x-indorania-pending` is wired but not built, and answers 501 `not_built`. No host serves this API yet, and nothing it serves reaches real society before ECOSYSTEM decision 30's gate.",
6
+ "description": "The platform contract that every member, and any outside issuer, builds against (ECOSYSTEM decision 47). A member integrates exactly as a stranger would.\n\n**Versions.** The URL carries the major version (`/v1`). Every request speaks a dated version: send `Indorania-Version: YYYY-MM-DD`, or your organisation's or integration's pinned version applies; with neither, the request is refused. Inside a released version, changes are additive only — new operations, new optional fields, new enum values, new problem codes — so treat anything unknown gracefully. Any other change is a new dated version, and the platform translates between the two. A version is a **preview** until its first release, and may still change in place.\n\n**Exempt from dated versions:** the OpenID4VCI and OpenID4VP endpoints, which their standards version, and documents that describe themselves: the trust list, the webhook keys, issuers' status lists, the version list, and these documents.\n\n**Errors** are RFC 9457 problem details (`application/problem+json`), each with a stable `code`.\n\n**Idempotency.** Every change made through this API carries an `Idempotency-Key` (IETF draft-07). Without one it is refused (400). The same key and body get the first answer again for 24 hours; the same key with another body is refused (422); a key still running is refused (409). Protocol endpoints rely on their own single-use code or nonce, and webhooks on `webhook-id`.\n\n**Webhooks,** in both directions: Standard Webhooks 1.0.0, v1a (Ed25519), with a 300-second tolerance.\n\n**What it never does.** No endpoint lists a house's members, answers \"everything matching X\", records a decline, meters records, scores a person, or joins a person across relationships: person-side identifiers are relationship identifiers, one at a time. Lints check this document for all of it.\n\n**Status.** Every operation marked `x-indorania-pending` is wired but not built, and answers 501 `not_built`. No host serves this API yet, and nothing it serves reaches real society before ECOSYSTEM decision 30's gate.",
7
7
  "license": {
8
8
  "name": "Apache-2.0",
9
9
  "identifier": "Apache-2.0"
@@ -119,6 +119,11 @@
119
119
  "answer": {
120
120
  "$ref": "#/components/schemas/AnswerId"
121
121
  },
122
+ "need": {
123
+ "type": "string",
124
+ "minLength": 1,
125
+ "description": "Which need of the ask this answers, by its id. Needed when you deliver later and the ask has more than one."
126
+ },
122
127
  "result": {
123
128
  "type": "string",
124
129
  "enum": [
@@ -144,6 +149,11 @@
144
149
  "answer": {
145
150
  "$ref": "#/components/schemas/AnswerId"
146
151
  },
152
+ "need": {
153
+ "type": "string",
154
+ "minLength": 1,
155
+ "description": "Which need of the ask this answers, by its id. Needed when you deliver later and the ask has more than one."
156
+ },
147
157
  "result": {
148
158
  "type": "string",
149
159
  "enum": [
@@ -775,6 +785,12 @@
775
785
  ],
776
786
  "additionalProperties": false
777
787
  },
788
+ "IndoraniaOrganisation": {
789
+ "type": "string",
790
+ "pattern": "^org_[0123456789abcdefghjkmnpqrstvwxyz]{26}$",
791
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
792
+ "example": "org_0f5m2c8r1h7k3n9p4q6s2t8v1w"
793
+ },
778
794
  "OrganisationCreate": {
779
795
  "oneOf": [
780
796
  {
@@ -1853,6 +1869,175 @@
1853
1869
  "additionalProperties": false,
1854
1870
  "description": "`capability` names which of your books answers: the platform routes the ask to the integration running it."
1855
1871
  },
1872
+ "AskAnswerState": {
1873
+ "type": "object",
1874
+ "properties": {
1875
+ "answer": {
1876
+ "$ref": "#/components/schemas/AnswerId"
1877
+ },
1878
+ "ask": {
1879
+ "type": "object",
1880
+ "properties": {
1881
+ "key": {
1882
+ "$ref": "#/components/schemas/AskKey"
1883
+ },
1884
+ "version": {
1885
+ "type": "integer",
1886
+ "minimum": 1
1887
+ }
1888
+ },
1889
+ "required": [
1890
+ "key",
1891
+ "version"
1892
+ ],
1893
+ "additionalProperties": false
1894
+ },
1895
+ "needs": {
1896
+ "type": "array",
1897
+ "items": {
1898
+ "type": "object",
1899
+ "properties": {
1900
+ "need": {
1901
+ "type": "string",
1902
+ "minLength": 1
1903
+ },
1904
+ "state": {
1905
+ "type": "string",
1906
+ "enum": [
1907
+ "waiting",
1908
+ "holds"
1909
+ ]
1910
+ },
1911
+ "predicate": {
1912
+ "type": "string",
1913
+ "minLength": 1,
1914
+ "description": "When it holds: the predicate credential the book signed, naming its rule version (d43). Hand it to the verifier; it verifies offline."
1915
+ }
1916
+ },
1917
+ "required": [
1918
+ "need",
1919
+ "state"
1920
+ ],
1921
+ "additionalProperties": false
1922
+ },
1923
+ "description": "Each need routed, while it waits or holds. A need the book does not hold is removed, never kept: it simply stops being listed."
1924
+ },
1925
+ "expiresAtUnix": {
1926
+ "type": "integer",
1927
+ "minimum": 0,
1928
+ "description": "Unix seconds, UTC."
1929
+ }
1930
+ },
1931
+ "required": [
1932
+ "answer",
1933
+ "ask",
1934
+ "needs",
1935
+ "expiresAtUnix"
1936
+ ],
1937
+ "additionalProperties": false,
1938
+ "description": "One answer, by its id. The answering organisation sees every need still waiting or holding; the organisation that published the ask sees only the needs that hold — a yes, and nothing else."
1939
+ },
1940
+ "ExcessiveAskReportKept": {
1941
+ "type": "object",
1942
+ "properties": {
1943
+ "keptUntilUnix": {
1944
+ "type": "integer",
1945
+ "minimum": 0,
1946
+ "description": "Unix seconds, UTC."
1947
+ }
1948
+ },
1949
+ "required": [
1950
+ "keptUntilUnix"
1951
+ ],
1952
+ "additionalProperties": false
1953
+ },
1954
+ "ExcessiveAskReport": {
1955
+ "type": "object",
1956
+ "properties": {
1957
+ "reason": {
1958
+ "$ref": "#/components/schemas/ExcessiveReason"
1959
+ },
1960
+ "keepUntilUnix": {
1961
+ "type": "integer",
1962
+ "minimum": 0,
1963
+ "description": "Chosen by the holder who refused: the report is deleted then (at most 366 days ahead, rounded down to the day)."
1964
+ }
1965
+ },
1966
+ "required": [
1967
+ "reason",
1968
+ "keepUntilUnix"
1969
+ ],
1970
+ "additionalProperties": false,
1971
+ "description": "Rule 7: an excessive ask is recordable by the holder who refused it — and only if they choose to. It carries no identifier, no key and no request: nothing links it to a person, an encounter or a decline."
1972
+ },
1973
+ "ExcessiveReason": {
1974
+ "type": "string",
1975
+ "enum": [
1976
+ "more-than-needed",
1977
+ "R1-predicates-only",
1978
+ "R2-says-why",
1979
+ "R3-no-is-answerable",
1980
+ "R4-expires",
1981
+ "R6-no-joining",
1982
+ "R8-no-improvement-item",
1983
+ "FORBIDDEN-NEED"
1984
+ ]
1985
+ },
1986
+ "ExcessiveAskReports": {
1987
+ "type": "object",
1988
+ "properties": {
1989
+ "ask": {
1990
+ "type": "object",
1991
+ "properties": {
1992
+ "key": {
1993
+ "$ref": "#/components/schemas/AskKey"
1994
+ },
1995
+ "version": {
1996
+ "type": "integer",
1997
+ "minimum": 1
1998
+ }
1999
+ },
2000
+ "required": [
2001
+ "key",
2002
+ "version"
2003
+ ],
2004
+ "additionalProperties": false
2005
+ },
2006
+ "shownFrom": {
2007
+ "type": "number",
2008
+ "enum": [
2009
+ 5
2010
+ ]
2011
+ },
2012
+ "reasons": {
2013
+ "type": "array",
2014
+ "items": {
2015
+ "type": "object",
2016
+ "properties": {
2017
+ "reason": {
2018
+ "$ref": "#/components/schemas/ExcessiveReason"
2019
+ },
2020
+ "reports": {
2021
+ "type": "integer",
2022
+ "minimum": 5
2023
+ }
2024
+ },
2025
+ "required": [
2026
+ "reason",
2027
+ "reports"
2028
+ ],
2029
+ "additionalProperties": false
2030
+ }
2031
+ }
2032
+ },
2033
+ "required": [
2034
+ "ask",
2035
+ "shownFrom",
2036
+ "reasons"
2037
+ ],
2038
+ "additionalProperties": false,
2039
+ "description": "Reports holders chose to file against one version of an ask, as totals per reason — shown only where five or more agree, so no report can be traced to anyone."
2040
+ },
1856
2041
  "PresentationRequest": {
1857
2042
  "type": "object",
1858
2043
  "properties": {
@@ -1943,6 +2128,23 @@
1943
2128
  "properties": {
1944
2129
  "purpose": {
1945
2130
  "$ref": "#/components/schemas/PresentationPurpose"
2131
+ },
2132
+ "role": {
2133
+ "type": "string",
2134
+ "enum": [
2135
+ "venue",
2136
+ "payer",
2137
+ "employer",
2138
+ "client",
2139
+ "third-party"
2140
+ ],
2141
+ "description": "For an ask: what you are to the person answering, shown to them. A thank-you for answering reads it; left out, none can follow."
2142
+ },
2143
+ "expiresInSec": {
2144
+ "type": "integer",
2145
+ "minimum": 60,
2146
+ "maximum": 86400,
2147
+ "description": "How long the request stands. Unanswered, it then simply expires and is gone."
1946
2148
  }
1947
2149
  },
1948
2150
  "required": [
@@ -2037,6 +2239,15 @@
2037
2239
  },
2038
2240
  "issuer": {
2039
2241
  "type": "string"
2242
+ },
2243
+ "status": {
2244
+ "type": "string",
2245
+ "enum": [
2246
+ "not-revoked",
2247
+ "revoked",
2248
+ "unknown"
2249
+ ],
2250
+ "description": "From the issuer's status list, as of `statusAsOfUnix`. `unknown` when the list could not be read; a revoked predicate is not a yes."
2040
2251
  }
2041
2252
  },
2042
2253
  "required": [
@@ -2207,7 +2418,7 @@
2207
2418
  "credential": {
2208
2419
  "type": "string",
2209
2420
  "minLength": 1,
2210
- "description": "A holder-bound SD-JWT VC. Its type is registered when PL-8 builds it."
2421
+ "description": "A holder-bound SD-JWT VC of the registered predicate type (https://kashscript.com/vct/predicate/1): the standing item as a yes, naming the rule (`standing:…`), its version and hash, and its window. It verifies offline."
2211
2422
  },
2212
2423
  "expiresAtUnix": {
2213
2424
  "type": "integer",
@@ -2322,6 +2533,21 @@
2322
2533
  "minimum": 0,
2323
2534
  "description": "Unix seconds, UTC."
2324
2535
  },
2536
+ "role": {
2537
+ "type": [
2538
+ "string",
2539
+ "null"
2540
+ ],
2541
+ "enum": [
2542
+ "venue",
2543
+ "payer",
2544
+ "employer",
2545
+ "client",
2546
+ "third-party",
2547
+ null
2548
+ ],
2549
+ "description": "What the establishment said it is to the person. Null when it said nothing."
2550
+ },
2325
2551
  "joinUri": {
2326
2552
  "type": "string",
2327
2553
  "format": "uri",
@@ -2415,7 +2641,15 @@
2415
2641
  "type": "integer",
2416
2642
  "minimum": 60,
2417
2643
  "maximum": 86400,
2418
- "description": "How long the invitation stands; minutes suit a counter."
2644
+ "description": "How long the invitation stands; minutes suit a counter. After the person agrees, it is also how long the platform holds the session after its last line before it forgets it."
2645
+ },
2646
+ "signer": {
2647
+ "type": "string",
2648
+ "pattern": "^did:[a-z0-9]+:[A-Za-z0-9._%:-]+$",
2649
+ "description": "The key that signs your side of every line — one your own system holds, registered as a signer by one of your integrations. The platform never signs a line. Needed when your integrations register more than one signer."
2650
+ },
2651
+ "role": {
2652
+ "$ref": "#/components/schemas/EncounterRole"
2419
2653
  }
2420
2654
  },
2421
2655
  "required": [
@@ -2424,6 +2658,17 @@
2424
2658
  ],
2425
2659
  "additionalProperties": false
2426
2660
  },
2661
+ "EncounterRole": {
2662
+ "type": "string",
2663
+ "enum": [
2664
+ "venue",
2665
+ "payer",
2666
+ "employer",
2667
+ "client",
2668
+ "third-party"
2669
+ ],
2670
+ "description": "What you are to the person: a venue they visit, a payer who pays them, an employer or a client they work for, or a third party running asks. Stated once, shown to them before they agree. Left out, no thank-you can follow (it fails closed)."
2671
+ },
2427
2672
  "SessionTerms": {
2428
2673
  "type": "object",
2429
2674
  "properties": {
@@ -2493,6 +2738,21 @@
2493
2738
  "type": "integer",
2494
2739
  "minimum": 0,
2495
2740
  "description": "Unix seconds, UTC."
2741
+ },
2742
+ "role": {
2743
+ "type": [
2744
+ "string",
2745
+ "null"
2746
+ ],
2747
+ "enum": [
2748
+ "venue",
2749
+ "payer",
2750
+ "employer",
2751
+ "client",
2752
+ "third-party",
2753
+ null
2754
+ ],
2755
+ "description": "What the establishment said it is to the person. Null when it said nothing."
2496
2756
  }
2497
2757
  },
2498
2758
  "required": [
@@ -2890,6 +3150,32 @@
2890
3150
  ],
2891
3151
  "description": "The answering, never the answer (d49 rule 1): confirming and disputing earn the same. The platform finds the person from the session or the request; you never name them."
2892
3152
  },
3153
+ "ThankYouWithdrawn": {
3154
+ "type": "object",
3155
+ "properties": {
3156
+ "id": {
3157
+ "$ref": "#/components/schemas/ThankYouId"
3158
+ },
3159
+ "state": {
3160
+ "type": "string",
3161
+ "enum": [
3162
+ "withdrawn"
3163
+ ]
3164
+ }
3165
+ },
3166
+ "required": [
3167
+ "id",
3168
+ "state"
3169
+ ],
3170
+ "additionalProperties": false,
3171
+ "description": "Its bit is set in your status list: it reads used or withdrawn, and cannot be redeemed. The person's copy still verifies as signed."
3172
+ },
3173
+ "StatusListId": {
3174
+ "type": "string",
3175
+ "pattern": "^sl_[0123456789abcdefghjkmnpqrstvwxyz]{26}$",
3176
+ "description": "One issuer's status list: one bit per record it issued, most of them unused, so no index stands out.",
3177
+ "example": "sl_0f5m2c8r1h7k3n9p4q6s2t8v1w"
3178
+ },
2893
3179
  "Integration": {
2894
3180
  "type": "object",
2895
3181
  "properties": {
@@ -3558,6 +3844,15 @@
3558
3844
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
3559
3845
  "name": "idempotency-key",
3560
3846
  "in": "header"
3847
+ },
3848
+ {
3849
+ "schema": {
3850
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
3851
+ },
3852
+ "required": false,
3853
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
3854
+ "name": "indorania-organisation",
3855
+ "in": "header"
3561
3856
  }
3562
3857
  ],
3563
3858
  "requestBody": {
@@ -4237,6 +4532,15 @@
4237
4532
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
4238
4533
  "name": "idempotency-key",
4239
4534
  "in": "header"
4535
+ },
4536
+ {
4537
+ "schema": {
4538
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
4539
+ },
4540
+ "required": false,
4541
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
4542
+ "name": "indorania-organisation",
4543
+ "in": "header"
4240
4544
  }
4241
4545
  ],
4242
4546
  "requestBody": {
@@ -4309,6 +4613,15 @@
4309
4613
  "description": "The dated API version this request speaks (YYYY-MM-DD). Without it, the caller's pinned version applies; with no pin, the request is refused.",
4310
4614
  "name": "indorania-version",
4311
4615
  "in": "header"
4616
+ },
4617
+ {
4618
+ "schema": {
4619
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
4620
+ },
4621
+ "required": false,
4622
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
4623
+ "name": "indorania-organisation",
4624
+ "in": "header"
4312
4625
  }
4313
4626
  ],
4314
4627
  "responses": {
@@ -4616,7 +4929,6 @@
4616
4929
  "seat": []
4617
4930
  }
4618
4931
  ],
4619
- "x-indorania-pending": "PL-8",
4620
4932
  "x-indorania-versioning": "dated",
4621
4933
  "x-indorania-idempotency": "key",
4622
4934
  "parameters": [
@@ -4637,6 +4949,15 @@
4637
4949
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
4638
4950
  "name": "idempotency-key",
4639
4951
  "in": "header"
4952
+ },
4953
+ {
4954
+ "schema": {
4955
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
4956
+ },
4957
+ "required": false,
4958
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
4959
+ "name": "indorania-organisation",
4960
+ "in": "header"
4640
4961
  }
4641
4962
  ],
4642
4963
  "requestBody": {
@@ -4680,7 +5001,6 @@
4680
5001
  "summary": "The public ask library",
4681
5002
  "description": "Public, so what establishments ask of people is as auditable as the records themselves (d42 §5, rule 5).",
4682
5003
  "security": [],
4683
- "x-indorania-pending": "PL-8",
4684
5004
  "x-indorania-versioning": "dated",
4685
5005
  "x-indorania-collection": "The ask library is public by design (d42 §5 rule 5). Asks are demands made of people, never people or records.",
4686
5006
  "parameters": [
@@ -4762,7 +5082,6 @@
4762
5082
  ],
4763
5083
  "summary": "An ask's latest version",
4764
5084
  "security": [],
4765
- "x-indorania-pending": "PL-8",
4766
5085
  "x-indorania-versioning": "dated",
4767
5086
  "parameters": [
4768
5087
  {
@@ -4816,7 +5135,6 @@
4816
5135
  ],
4817
5136
  "summary": "One version of an ask",
4818
5137
  "security": [],
4819
- "x-indorania-pending": "PL-8",
4820
5138
  "x-indorania-versioning": "dated",
4821
5139
  "parameters": [
4822
5140
  {
@@ -4884,7 +5202,6 @@
4884
5202
  "seat": []
4885
5203
  }
4886
5204
  ],
4887
- "x-indorania-pending": "PL-8",
4888
5205
  "x-indorania-versioning": "dated",
4889
5206
  "x-indorania-idempotency": "key",
4890
5207
  "parameters": [
@@ -4923,6 +5240,15 @@
4923
5240
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
4924
5241
  "name": "idempotency-key",
4925
5242
  "in": "header"
5243
+ },
5244
+ {
5245
+ "schema": {
5246
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
5247
+ },
5248
+ "required": false,
5249
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
5250
+ "name": "indorania-organisation",
5251
+ "in": "header"
4926
5252
  }
4927
5253
  ],
4928
5254
  "requestBody": {
@@ -4959,14 +5285,14 @@
4959
5285
  }
4960
5286
  }
4961
5287
  },
4962
- "/v1/presentation-requests": {
4963
- "post": {
4964
- "operationId": "createPresentationRequest",
5288
+ "/v1/asks/{key}/versions/{version}/answers/{answer}": {
5289
+ "get": {
5290
+ "operationId": "getAskAnswer",
4965
5291
  "tags": [
4966
- "presentations"
5292
+ "asks"
4967
5293
  ],
4968
- "summary": "Mint a presentation request for one encounter",
4969
- "description": "Show its requestUri as a QR code, or send it as a link. One request per encounter; it is used once.",
5294
+ "summary": "One answer to an ask, by its id",
5295
+ "description": "For the organisation that answered, and for the one that asked. The answering organisation hands the id to the verifier — a presentation, never a lookup: there is no list of answers.",
4970
5296
  "security": [
4971
5297
  {
4972
5298
  "seat": []
@@ -4975,10 +5301,35 @@
4975
5301
  "integration": []
4976
5302
  }
4977
5303
  ],
4978
- "x-indorania-pending": "PL-8",
4979
5304
  "x-indorania-versioning": "dated",
4980
- "x-indorania-idempotency": "key",
4981
5305
  "parameters": [
5306
+ {
5307
+ "schema": {
5308
+ "$ref": "#/components/schemas/AskKey"
5309
+ },
5310
+ "required": true,
5311
+ "description": "Rule 7: a stable key a holder's excessive-ask note can name.",
5312
+ "name": "key",
5313
+ "in": "path"
5314
+ },
5315
+ {
5316
+ "schema": {
5317
+ "type": "integer",
5318
+ "minimum": 1
5319
+ },
5320
+ "required": true,
5321
+ "name": "version",
5322
+ "in": "path"
5323
+ },
5324
+ {
5325
+ "schema": {
5326
+ "$ref": "#/components/schemas/AnswerId"
5327
+ },
5328
+ "required": true,
5329
+ "description": "One organisation's answer to an ask, routed to the book that answers it.",
5330
+ "name": "answer",
5331
+ "in": "path"
5332
+ },
4982
5333
  {
4983
5334
  "schema": {
4984
5335
  "$ref": "#/components/schemas/IndoraniaVersion"
@@ -4990,12 +5341,217 @@
4990
5341
  },
4991
5342
  {
4992
5343
  "schema": {
4993
- "$ref": "#/components/schemas/IdempotencyKey"
5344
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
4994
5345
  },
4995
- "required": true,
5346
+ "required": false,
5347
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
5348
+ "name": "indorania-organisation",
5349
+ "in": "header"
5350
+ }
5351
+ ],
5352
+ "responses": {
5353
+ "200": {
5354
+ "description": "The answer.",
5355
+ "content": {
5356
+ "application/json": {
5357
+ "schema": {
5358
+ "$ref": "#/components/schemas/AskAnswerState"
5359
+ }
5360
+ }
5361
+ }
5362
+ },
5363
+ "default": {
5364
+ "description": "A problem (RFC 9457). Every error of this API has this shape.",
5365
+ "content": {
5366
+ "application/problem+json": {
5367
+ "schema": {
5368
+ "$ref": "#/components/schemas/Problem"
5369
+ }
5370
+ }
5371
+ }
5372
+ }
5373
+ }
5374
+ }
5375
+ },
5376
+ "/v1/asks/{key}/versions/{version}/excessive-reports": {
5377
+ "post": {
5378
+ "operationId": "reportExcessiveAsk",
5379
+ "tags": [
5380
+ "asks"
5381
+ ],
5382
+ "summary": "Record an ask as excessive (rule 7)",
5383
+ "description": "Anonymous, and only if the holder who refused chooses to. No account, no key, no request id: a stored Idempotency-Key would itself be a trace, so a repeat is a second report.",
5384
+ "security": [],
5385
+ "x-indorania-versioning": "dated",
5386
+ "x-indorania-idempotency": "protocol",
5387
+ "parameters": [
5388
+ {
5389
+ "schema": {
5390
+ "$ref": "#/components/schemas/AskKey"
5391
+ },
5392
+ "required": true,
5393
+ "description": "Rule 7: a stable key a holder's excessive-ask note can name.",
5394
+ "name": "key",
5395
+ "in": "path"
5396
+ },
5397
+ {
5398
+ "schema": {
5399
+ "type": "integer",
5400
+ "minimum": 1
5401
+ },
5402
+ "required": true,
5403
+ "name": "version",
5404
+ "in": "path"
5405
+ },
5406
+ {
5407
+ "schema": {
5408
+ "$ref": "#/components/schemas/IndoraniaVersion"
5409
+ },
5410
+ "required": false,
5411
+ "description": "The dated API version this request speaks (YYYY-MM-DD). Without it, the caller's pinned version applies; with no pin, the request is refused.",
5412
+ "name": "indorania-version",
5413
+ "in": "header"
5414
+ }
5415
+ ],
5416
+ "requestBody": {
5417
+ "required": true,
5418
+ "content": {
5419
+ "application/json": {
5420
+ "schema": {
5421
+ "$ref": "#/components/schemas/ExcessiveAskReport"
5422
+ }
5423
+ }
5424
+ }
5425
+ },
5426
+ "responses": {
5427
+ "202": {
5428
+ "description": "Kept until the date the holder chose.",
5429
+ "content": {
5430
+ "application/json": {
5431
+ "schema": {
5432
+ "$ref": "#/components/schemas/ExcessiveAskReportKept"
5433
+ }
5434
+ }
5435
+ }
5436
+ },
5437
+ "default": {
5438
+ "description": "A problem (RFC 9457). Every error of this API has this shape.",
5439
+ "content": {
5440
+ "application/problem+json": {
5441
+ "schema": {
5442
+ "$ref": "#/components/schemas/Problem"
5443
+ }
5444
+ }
5445
+ }
5446
+ }
5447
+ }
5448
+ },
5449
+ "get": {
5450
+ "operationId": "getAskReports",
5451
+ "tags": [
5452
+ "asks"
5453
+ ],
5454
+ "summary": "What holders recorded against an ask, as totals of five or more",
5455
+ "security": [],
5456
+ "x-indorania-versioning": "dated",
5457
+ "parameters": [
5458
+ {
5459
+ "schema": {
5460
+ "$ref": "#/components/schemas/AskKey"
5461
+ },
5462
+ "required": true,
5463
+ "description": "Rule 7: a stable key a holder's excessive-ask note can name.",
5464
+ "name": "key",
5465
+ "in": "path"
5466
+ },
5467
+ {
5468
+ "schema": {
5469
+ "type": "integer",
5470
+ "minimum": 1
5471
+ },
5472
+ "required": true,
5473
+ "name": "version",
5474
+ "in": "path"
5475
+ },
5476
+ {
5477
+ "schema": {
5478
+ "$ref": "#/components/schemas/IndoraniaVersion"
5479
+ },
5480
+ "required": false,
5481
+ "description": "The dated API version this request speaks (YYYY-MM-DD). Without it, the caller's pinned version applies; with no pin, the request is refused.",
5482
+ "name": "indorania-version",
5483
+ "in": "header"
5484
+ }
5485
+ ],
5486
+ "responses": {
5487
+ "200": {
5488
+ "description": "The totals.",
5489
+ "content": {
5490
+ "application/json": {
5491
+ "schema": {
5492
+ "$ref": "#/components/schemas/ExcessiveAskReports"
5493
+ }
5494
+ }
5495
+ }
5496
+ },
5497
+ "default": {
5498
+ "description": "A problem (RFC 9457). Every error of this API has this shape.",
5499
+ "content": {
5500
+ "application/problem+json": {
5501
+ "schema": {
5502
+ "$ref": "#/components/schemas/Problem"
5503
+ }
5504
+ }
5505
+ }
5506
+ }
5507
+ }
5508
+ }
5509
+ },
5510
+ "/v1/presentation-requests": {
5511
+ "post": {
5512
+ "operationId": "createPresentationRequest",
5513
+ "tags": [
5514
+ "presentations"
5515
+ ],
5516
+ "summary": "Mint a presentation request for one encounter",
5517
+ "description": "Show its requestUri as a QR code, or send it as a link. One request per encounter; it is used once.",
5518
+ "security": [
5519
+ {
5520
+ "seat": []
5521
+ },
5522
+ {
5523
+ "integration": []
5524
+ }
5525
+ ],
5526
+ "x-indorania-versioning": "dated",
5527
+ "x-indorania-idempotency": "key",
5528
+ "parameters": [
5529
+ {
5530
+ "schema": {
5531
+ "$ref": "#/components/schemas/IndoraniaVersion"
5532
+ },
5533
+ "required": false,
5534
+ "description": "The dated API version this request speaks (YYYY-MM-DD). Without it, the caller's pinned version applies; with no pin, the request is refused.",
5535
+ "name": "indorania-version",
5536
+ "in": "header"
5537
+ },
5538
+ {
5539
+ "schema": {
5540
+ "$ref": "#/components/schemas/IdempotencyKey"
5541
+ },
5542
+ "required": true,
4996
5543
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
4997
5544
  "name": "idempotency-key",
4998
5545
  "in": "header"
5546
+ },
5547
+ {
5548
+ "schema": {
5549
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
5550
+ },
5551
+ "required": false,
5552
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
5553
+ "name": "indorania-organisation",
5554
+ "in": "header"
4999
5555
  }
5000
5556
  ],
5001
5557
  "requestBody": {
@@ -5047,7 +5603,6 @@
5047
5603
  "integration": []
5048
5604
  }
5049
5605
  ],
5050
- "x-indorania-pending": "PL-8",
5051
5606
  "x-indorania-versioning": "dated",
5052
5607
  "parameters": [
5053
5608
  {
@@ -5067,6 +5622,15 @@
5067
5622
  "description": "The dated API version this request speaks (YYYY-MM-DD). Without it, the caller's pinned version applies; with no pin, the request is refused.",
5068
5623
  "name": "indorania-version",
5069
5624
  "in": "header"
5625
+ },
5626
+ {
5627
+ "schema": {
5628
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
5629
+ },
5630
+ "required": false,
5631
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
5632
+ "name": "indorania-organisation",
5633
+ "in": "header"
5070
5634
  }
5071
5635
  ],
5072
5636
  "responses": {
@@ -5102,7 +5666,6 @@
5102
5666
  "summary": "The wallet's answer (OpenID4VP direct_post)",
5103
5667
  "description": "A standard endpoint: any conforming wallet can answer, with no account and no Indorania header, so it is exempt from dated versions. Holder binding is the KB-JWT in each presentation; the request's nonce makes it single-use.",
5104
5668
  "security": [],
5105
- "x-indorania-pending": "PL-8",
5106
5669
  "x-indorania-versioning": "exempt",
5107
5670
  "x-indorania-idempotency": "protocol",
5108
5671
  "parameters": [
@@ -5158,7 +5721,6 @@
5158
5721
  ],
5159
5722
  "summary": "The published standing rules",
5160
5723
  "security": [],
5161
- "x-indorania-pending": "PL-8",
5162
5724
  "x-indorania-versioning": "dated",
5163
5725
  "x-indorania-collection": "The standing rules are published, so anyone can re-implement or check them (d47(d)).",
5164
5726
  "parameters": [
@@ -5226,13 +5788,12 @@
5226
5788
  "standing"
5227
5789
  ],
5228
5790
  "summary": "Derive standing from presented predicates",
5229
- "description": "Answered at once, and forgotten: no request is stored, so none can be listed or looked up.",
5791
+ "description": "Answered at once, and forgotten: no request is stored, so none can be listed or looked up — not even its answer under the Idempotency-Key, so a retry derives standing afresh.",
5230
5792
  "security": [
5231
5793
  {
5232
5794
  "relationshipProof": []
5233
5795
  }
5234
5796
  ],
5235
- "x-indorania-pending": "PL-8",
5236
5797
  "x-indorania-versioning": "dated",
5237
5798
  "x-indorania-idempotency": "key",
5238
5799
  "parameters": [
@@ -5304,7 +5865,6 @@
5304
5865
  "integration": []
5305
5866
  }
5306
5867
  ],
5307
- "x-indorania-pending": "PL-8",
5308
5868
  "x-indorania-versioning": "dated",
5309
5869
  "x-indorania-idempotency": "key",
5310
5870
  "parameters": [
@@ -5325,6 +5885,15 @@
5325
5885
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
5326
5886
  "name": "idempotency-key",
5327
5887
  "in": "header"
5888
+ },
5889
+ {
5890
+ "schema": {
5891
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
5892
+ },
5893
+ "required": false,
5894
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
5895
+ "name": "indorania-organisation",
5896
+ "in": "header"
5328
5897
  }
5329
5898
  ],
5330
5899
  "requestBody": {
@@ -5370,7 +5939,6 @@
5370
5939
  "summary": "What the person is asked to agree to",
5371
5940
  "description": "Needs only the join secret. Reading it records nothing.",
5372
5941
  "security": [],
5373
- "x-indorania-pending": "PL-8",
5374
5942
  "x-indorania-versioning": "dated",
5375
5943
  "parameters": [
5376
5944
  {
@@ -5440,7 +6008,6 @@
5440
6008
  "relationshipProof": []
5441
6009
  }
5442
6010
  ],
5443
- "x-indorania-pending": "PL-8",
5444
6011
  "x-indorania-versioning": "dated",
5445
6012
  "x-indorania-idempotency": "key",
5446
6013
  "parameters": [
@@ -5536,7 +6103,6 @@
5536
6103
  "relationshipProof": []
5537
6104
  }
5538
6105
  ],
5539
- "x-indorania-pending": "PL-8",
5540
6106
  "x-indorania-versioning": "dated",
5541
6107
  "x-indorania-idempotency": "key",
5542
6108
  "parameters": [
@@ -5566,6 +6132,15 @@
5566
6132
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
5567
6133
  "name": "idempotency-key",
5568
6134
  "in": "header"
6135
+ },
6136
+ {
6137
+ "schema": {
6138
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
6139
+ },
6140
+ "required": false,
6141
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
6142
+ "name": "indorania-organisation",
6143
+ "in": "header"
5569
6144
  }
5570
6145
  ],
5571
6146
  "requestBody": {
@@ -5618,7 +6193,6 @@
5618
6193
  "relationshipProof": []
5619
6194
  }
5620
6195
  ],
5621
- "x-indorania-pending": "PL-8",
5622
6196
  "x-indorania-versioning": "dated",
5623
6197
  "x-indorania-collection": "The lines of one session, for its two parties only: one relationship, never a search.",
5624
6198
  "parameters": [
@@ -5663,6 +6237,15 @@
5663
6237
  "description": "The dated API version this request speaks (YYYY-MM-DD). Without it, the caller's pinned version applies; with no pin, the request is refused.",
5664
6238
  "name": "indorania-version",
5665
6239
  "in": "header"
6240
+ },
6241
+ {
6242
+ "schema": {
6243
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
6244
+ },
6245
+ "required": false,
6246
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
6247
+ "name": "indorania-organisation",
6248
+ "in": "header"
5666
6249
  }
5667
6250
  ],
5668
6251
  "responses": {
@@ -5707,7 +6290,6 @@
5707
6290
  "relationshipProof": []
5708
6291
  }
5709
6292
  ],
5710
- "x-indorania-pending": "PL-8",
5711
6293
  "x-indorania-versioning": "dated",
5712
6294
  "x-indorania-idempotency": "key",
5713
6295
  "parameters": [
@@ -5749,6 +6331,15 @@
5749
6331
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
5750
6332
  "name": "idempotency-key",
5751
6333
  "in": "header"
6334
+ },
6335
+ {
6336
+ "schema": {
6337
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
6338
+ },
6339
+ "required": false,
6340
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
6341
+ "name": "indorania-organisation",
6342
+ "in": "header"
5752
6343
  }
5753
6344
  ],
5754
6345
  "requestBody": {
@@ -5804,7 +6395,6 @@
5804
6395
  "relationshipProof": []
5805
6396
  }
5806
6397
  ],
5807
- "x-indorania-pending": "PL-8",
5808
6398
  "x-indorania-versioning": "dated",
5809
6399
  "x-indorania-idempotency": "key",
5810
6400
  "parameters": [
@@ -5834,6 +6424,15 @@
5834
6424
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
5835
6425
  "name": "idempotency-key",
5836
6426
  "in": "header"
6427
+ },
6428
+ {
6429
+ "schema": {
6430
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
6431
+ },
6432
+ "required": false,
6433
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
6434
+ "name": "indorania-organisation",
6435
+ "in": "header"
5837
6436
  }
5838
6437
  ],
5839
6438
  "requestBody": {
@@ -5888,7 +6487,6 @@
5888
6487
  "relationshipProof": []
5889
6488
  }
5890
6489
  ],
5891
- "x-indorania-pending": "PL-8",
5892
6490
  "x-indorania-versioning": "dated",
5893
6491
  "x-indorania-idempotency": "key",
5894
6492
  "parameters": [
@@ -5918,6 +6516,15 @@
5918
6516
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
5919
6517
  "name": "idempotency-key",
5920
6518
  "in": "header"
6519
+ },
6520
+ {
6521
+ "schema": {
6522
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
6523
+ },
6524
+ "required": false,
6525
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
6526
+ "name": "indorania-organisation",
6527
+ "in": "header"
5921
6528
  }
5922
6529
  ],
5923
6530
  "requestBody": {
@@ -5972,7 +6579,6 @@
5972
6579
  "relationshipProof": []
5973
6580
  }
5974
6581
  ],
5975
- "x-indorania-pending": "PL-8",
5976
6582
  "x-indorania-versioning": "dated",
5977
6583
  "parameters": [
5978
6584
  {
@@ -5992,6 +6598,15 @@
5992
6598
  "description": "The dated API version this request speaks (YYYY-MM-DD). Without it, the caller's pinned version applies; with no pin, the request is refused.",
5993
6599
  "name": "indorania-version",
5994
6600
  "in": "header"
6601
+ },
6602
+ {
6603
+ "schema": {
6604
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
6605
+ },
6606
+ "required": false,
6607
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
6608
+ "name": "indorania-organisation",
6609
+ "in": "header"
5995
6610
  }
5996
6611
  ],
5997
6612
  "responses": {
@@ -6033,7 +6648,6 @@
6033
6648
  "integration": []
6034
6649
  }
6035
6650
  ],
6036
- "x-indorania-pending": "PL-8",
6037
6651
  "x-indorania-versioning": "dated",
6038
6652
  "x-indorania-idempotency": "key",
6039
6653
  "parameters": [
@@ -6054,6 +6668,15 @@
6054
6668
  "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
6055
6669
  "name": "idempotency-key",
6056
6670
  "in": "header"
6671
+ },
6672
+ {
6673
+ "schema": {
6674
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
6675
+ },
6676
+ "required": false,
6677
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
6678
+ "name": "indorania-organisation",
6679
+ "in": "header"
6057
6680
  }
6058
6681
  ],
6059
6682
  "requestBody": {
@@ -6098,7 +6721,6 @@
6098
6721
  ],
6099
6722
  "summary": "Credential Issuer Metadata (OpenID4VCI 1.0 §12.2)",
6100
6723
  "security": [],
6101
- "x-indorania-pending": "PL-8",
6102
6724
  "x-indorania-versioning": "exempt",
6103
6725
  "responses": {
6104
6726
  "200": {
@@ -6133,7 +6755,6 @@
6133
6755
  ],
6134
6756
  "summary": "Authorization Server Metadata (RFC 8414), for the pre-authorized code flow",
6135
6757
  "security": [],
6136
- "x-indorania-pending": "PL-8",
6137
6758
  "x-indorania-versioning": "exempt",
6138
6759
  "responses": {
6139
6760
  "200": {
@@ -6169,7 +6790,6 @@
6169
6790
  "summary": "Redeem a pre-authorized code (OpenID4VCI 1.0 §6)",
6170
6791
  "description": "Anonymous: no wallet client_id is ever sent (holder contract §1). The code is single-use.",
6171
6792
  "security": [],
6172
- "x-indorania-pending": "PL-8",
6173
6793
  "x-indorania-versioning": "exempt",
6174
6794
  "x-indorania-idempotency": "protocol",
6175
6795
  "requestBody": {
@@ -6235,7 +6855,6 @@
6235
6855
  ],
6236
6856
  "summary": "A fresh nonce for the key proof (OpenID4VCI 1.0 §7)",
6237
6857
  "security": [],
6238
- "x-indorania-pending": "PL-8",
6239
6858
  "x-indorania-versioning": "exempt",
6240
6859
  "x-indorania-idempotency": "protocol",
6241
6860
  "responses": {
@@ -6284,7 +6903,6 @@
6284
6903
  "issuanceToken": []
6285
6904
  }
6286
6905
  ],
6287
- "x-indorania-pending": "PL-8",
6288
6906
  "x-indorania-versioning": "exempt",
6289
6907
  "x-indorania-idempotency": "protocol",
6290
6908
  "requestBody": {
@@ -6370,6 +6988,131 @@
6370
6988
  }
6371
6989
  }
6372
6990
  },
6991
+ "/v1/thank-yous/{id}/withdraw": {
6992
+ "post": {
6993
+ "operationId": "withdrawThankYou",
6994
+ "tags": [
6995
+ "thank-yous"
6996
+ ],
6997
+ "summary": "Withdraw a thank-you you gave",
6998
+ "description": "A status change at you, the issuer: nothing is deleted from the person's wallet.",
6999
+ "security": [
7000
+ {
7001
+ "seat": []
7002
+ },
7003
+ {
7004
+ "integration": []
7005
+ }
7006
+ ],
7007
+ "x-indorania-versioning": "dated",
7008
+ "x-indorania-idempotency": "key",
7009
+ "parameters": [
7010
+ {
7011
+ "schema": {
7012
+ "$ref": "#/components/schemas/ThankYouId"
7013
+ },
7014
+ "required": true,
7015
+ "description": "One thank-you, as its issuer knows it: an offer and a status index, never the person.",
7016
+ "name": "id",
7017
+ "in": "path"
7018
+ },
7019
+ {
7020
+ "schema": {
7021
+ "$ref": "#/components/schemas/IndoraniaVersion"
7022
+ },
7023
+ "required": false,
7024
+ "description": "The dated API version this request speaks (YYYY-MM-DD). Without it, the caller's pinned version applies; with no pin, the request is refused.",
7025
+ "name": "indorania-version",
7026
+ "in": "header"
7027
+ },
7028
+ {
7029
+ "schema": {
7030
+ "$ref": "#/components/schemas/IdempotencyKey"
7031
+ },
7032
+ "required": true,
7033
+ "description": "A fresh random value (a UUID) per change. Kept 24 hours: a retry with the same key and body gets the first answer; the same key with another body is refused (422); a key still running is refused (409).",
7034
+ "name": "idempotency-key",
7035
+ "in": "header"
7036
+ },
7037
+ {
7038
+ "schema": {
7039
+ "$ref": "#/components/schemas/IndoraniaOrganisation"
7040
+ },
7041
+ "required": false,
7042
+ "description": "Which of your organisations this request acts for. Needed only when your login holds seats in more than one; an integration always acts for its own.",
7043
+ "name": "indorania-organisation",
7044
+ "in": "header"
7045
+ }
7046
+ ],
7047
+ "responses": {
7048
+ "200": {
7049
+ "description": "Withdrawn.",
7050
+ "content": {
7051
+ "application/json": {
7052
+ "schema": {
7053
+ "$ref": "#/components/schemas/ThankYouWithdrawn"
7054
+ }
7055
+ }
7056
+ }
7057
+ },
7058
+ "default": {
7059
+ "description": "A problem (RFC 9457). Every error of this API has this shape.",
7060
+ "content": {
7061
+ "application/problem+json": {
7062
+ "schema": {
7063
+ "$ref": "#/components/schemas/Problem"
7064
+ }
7065
+ }
7066
+ }
7067
+ }
7068
+ }
7069
+ }
7070
+ },
7071
+ "/v1/status-lists/{listId}": {
7072
+ "get": {
7073
+ "operationId": "getStatusList",
7074
+ "tags": [
7075
+ "thank-yous"
7076
+ ],
7077
+ "summary": "An issuer's signed status list",
7078
+ "description": "Public, and the same for everyone who asks, so fetching it says nothing about which record is checked. A kashscript-status-list/1 DSSE envelope signed by the issuer (W3C Bitstring Status List), at least 131,072 entries. Its address lives inside credentials, so it is exempt from dated versions.",
7079
+ "security": [],
7080
+ "x-indorania-versioning": "exempt",
7081
+ "parameters": [
7082
+ {
7083
+ "schema": {
7084
+ "$ref": "#/components/schemas/StatusListId"
7085
+ },
7086
+ "required": true,
7087
+ "description": "One issuer's status list: one bit per record it issued, most of them unused, so no index stands out.",
7088
+ "name": "listId",
7089
+ "in": "path"
7090
+ }
7091
+ ],
7092
+ "responses": {
7093
+ "200": {
7094
+ "description": "The signed list.",
7095
+ "content": {
7096
+ "application/json": {
7097
+ "schema": {
7098
+ "$ref": "#/components/schemas/DsseEnvelope"
7099
+ }
7100
+ }
7101
+ }
7102
+ },
7103
+ "default": {
7104
+ "description": "A problem (RFC 9457). Every error of this API has this shape.",
7105
+ "content": {
7106
+ "application/problem+json": {
7107
+ "schema": {
7108
+ "$ref": "#/components/schemas/Problem"
7109
+ }
7110
+ }
7111
+ }
7112
+ }
7113
+ }
7114
+ }
7115
+ },
6373
7116
  "/v1/organisations/{orgId}/integrations": {
6374
7117
  "post": {
6375
7118
  "operationId": "createIntegration",
@@ -6576,7 +7319,6 @@
6576
7319
  "integration": []
6577
7320
  }
6578
7321
  ],
6579
- "x-indorania-pending": "PL-8",
6580
7322
  "x-indorania-versioning": "dated",
6581
7323
  "x-indorania-idempotency": "key",
6582
7324
  "parameters": [
@@ -6645,7 +7387,6 @@
6645
7387
  "integration": []
6646
7388
  }
6647
7389
  ],
6648
- "x-indorania-pending": "PL-8",
6649
7390
  "x-indorania-versioning": "dated",
6650
7391
  "x-indorania-idempotency": "key",
6651
7392
  "parameters": [
@@ -6714,7 +7455,6 @@
6714
7455
  "webhookSignature": []
6715
7456
  }
6716
7457
  ],
6717
- "x-indorania-pending": "PL-8",
6718
7458
  "x-indorania-versioning": "dated",
6719
7459
  "x-indorania-idempotency": "webhook-id",
6720
7460
  "parameters": [
@@ -6797,7 +7537,6 @@
6797
7537
  "webhookSignature": []
6798
7538
  }
6799
7539
  ],
6800
- "x-indorania-pending": "PL-8",
6801
7540
  "x-indorania-versioning": "dated",
6802
7541
  "x-indorania-idempotency": "webhook-id",
6803
7542
  "parameters": [
@@ -6887,7 +7626,6 @@
6887
7626
  "webhookSignature": []
6888
7627
  }
6889
7628
  ],
6890
- "x-indorania-pending": "PL-8",
6891
7629
  "x-indorania-versioning": "dated",
6892
7630
  "x-indorania-idempotency": "webhook-id",
6893
7631
  "parameters": [