entryscape 1.3.0__py3-none-any.whl

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 (82) hide show
  1. entryscape/__init__.py +219 -0
  2. entryscape/api/__init__.py +26 -0
  3. entryscape/api/app_token_api.py +835 -0
  4. entryscape/api/auth_api.py +965 -0
  5. entryscape/api/catalog_api.py +4473 -0
  6. entryscape/api/contact_api.py +3135 -0
  7. entryscape/api/dataservice_api.py +3135 -0
  8. entryscape/api/dataset_api.py +3804 -0
  9. entryscape/api/distribution_api.py +3135 -0
  10. entryscape/api/document_api.py +2740 -0
  11. entryscape/api/idea_api.py +2740 -0
  12. entryscape/api/job_api.py +360 -0
  13. entryscape/api/model_api.py +2446 -0
  14. entryscape/api/model_class_api.py +2611 -0
  15. entryscape/api/model_diagram_api.py +2611 -0
  16. entryscape/api/model_field_api.py +2611 -0
  17. entryscape/api/model_form_api.py +2611 -0
  18. entryscape/api/model_namespace_api.py +2611 -0
  19. entryscape/api/model_property_api.py +2611 -0
  20. entryscape/api/organization_api.py +3135 -0
  21. entryscape/api/search_api.py +1513 -0
  22. entryscape/api/showcase_api.py +2740 -0
  23. entryscape/api/suggestion_api.py +2740 -0
  24. entryscape/api/terminology_api.py +1726 -0
  25. entryscape/api/upload_api.py +814 -0
  26. entryscape/api_client.py +763 -0
  27. entryscape/api_response.py +20 -0
  28. entryscape/configuration.py +673 -0
  29. entryscape/exceptions.py +222 -0
  30. entryscape/models/__init__.py +71 -0
  31. entryscape/models/app_token.py +156 -0
  32. entryscape/models/app_token_create_request.py +98 -0
  33. entryscape/models/app_token_create_response.py +169 -0
  34. entryscape/models/app_token_status.py +35 -0
  35. entryscape/models/app_token_verify_request.py +109 -0
  36. entryscape/models/entity_list_item.py +175 -0
  37. entryscape/models/entity_list_response.py +139 -0
  38. entryscape/models/entity_reference.py +189 -0
  39. entryscape/models/entity_type.py +57 -0
  40. entryscape/models/error.py +135 -0
  41. entryscape/models/facet_field.py +115 -0
  42. entryscape/models/facet_field_values_inner.py +100 -0
  43. entryscape/models/facet_list.py +113 -0
  44. entryscape/models/facet_list_available_inner.py +107 -0
  45. entryscape/models/job_response.py +112 -0
  46. entryscape/models/job_status.py +189 -0
  47. entryscape/models/job_status_progress.py +100 -0
  48. entryscape/models/job_status_value.py +37 -0
  49. entryscape/models/job_type.py +37 -0
  50. entryscape/models/list_catalogs_entry_type_parameter.py +37 -0
  51. entryscape/models/list_catalogs_graph_type_parameter.py +44 -0
  52. entryscape/models/list_catalogs_resource_type_parameter.py +37 -0
  53. entryscape/models/login_request.py +108 -0
  54. entryscape/models/login_response.py +115 -0
  55. entryscape/models/metadata_format.py +38 -0
  56. entryscape/models/metadata_request.py +99 -0
  57. entryscape/models/parent_reference.py +130 -0
  58. entryscape/models/search_request.py +158 -0
  59. entryscape/models/search_request_filters.py +144 -0
  60. entryscape/models/search_request_filters_graph_type.py +44 -0
  61. entryscape/models/search_request_filters_resource_type.py +37 -0
  62. entryscape/models/search_request_sort.py +38 -0
  63. entryscape/models/search_request_sort_order.py +35 -0
  64. entryscape/models/search_response.py +175 -0
  65. entryscape/models/search_result.py +175 -0
  66. entryscape/models/search_result_graph_type.py +44 -0
  67. entryscape/models/search_result_resource_type.py +37 -0
  68. entryscape/models/search_sort_order_parameter.py +35 -0
  69. entryscape/models/terminology_import_mode.py +35 -0
  70. entryscape/models/validation_profile.py +36 -0
  71. entryscape/models/validation_response.py +149 -0
  72. entryscape/models/validation_result.py +162 -0
  73. entryscape/models/validation_severity.py +36 -0
  74. entryscape/models/validation_summary.py +122 -0
  75. entryscape/models/whoami_response.py +104 -0
  76. entryscape/py.typed +0 -0
  77. entryscape/rest.py +210 -0
  78. entryscape-1.3.0.dist-info/METADATA +696 -0
  79. entryscape-1.3.0.dist-info/RECORD +82 -0
  80. entryscape-1.3.0.dist-info/WHEEL +5 -0
  81. entryscape-1.3.0.dist-info/licenses/LICENSE.txt +165 -0
  82. entryscape-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,696 @@
1
+ Metadata-Version: 2.4
2
+ Name: entryscape
3
+ Version: 1.3.0
4
+ Summary: EntryScape API - Python client for accessing EntryScape data following DCAT-AP standards
5
+ Author-email: Metasolutions <contact@entryscape.com>
6
+ License-Expression: LGPL-3.0-or-later
7
+ Project-URL: Homepage, https://entryscape.com
8
+ Project-URL: Documentation, https://bitbucket.org/metasolutions/entryscape-api
9
+ Project-URL: Repository, https://bitbucket.org/metasolutions/entryscape-api
10
+ Project-URL: Changelog, https://bitbucket.org/metasolutions/entryscape-api/src/master/CHANGELOG.md
11
+ Keywords: entryscape,dcat-ap,open-data,api-client,linked-data,rdf
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Classifier: Topic :: Internet :: WWW/HTTP
23
+ Classifier: Typing :: Typed
24
+ Requires-Python: >=3.9
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE.txt
27
+ Requires-Dist: urllib3<3.0.0,>=2.1.0
28
+ Requires-Dist: python-dateutil>=2.8.2
29
+ Requires-Dist: aiohttp>=3.8.4
30
+ Requires-Dist: aiohttp-retry>=2.8.3
31
+ Requires-Dist: pydantic>=2
32
+ Requires-Dist: typing-extensions>=4.7.1
33
+ Provides-Extra: dev
34
+ Requires-Dist: pytest>=7.2.1; extra == "dev"
35
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
36
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
37
+ Requires-Dist: mypy>=1.8; extra == "dev"
38
+ Requires-Dist: ruff>=0.2; extra == "dev"
39
+ Requires-Dist: responses>=0.25; extra == "dev"
40
+ Requires-Dist: types-python-dateutil>=2.8.19; extra == "dev"
41
+ Provides-Extra: rdf
42
+ Requires-Dist: rdflib>=7.0.0; extra == "rdf"
43
+ Requires-Dist: pyld>=2.0.4; extra == "rdf"
44
+ Dynamic: license-file
45
+
46
+ # entryscape
47
+
48
+ This API provides structured access to EntryScape data following DCAT-AP standards.
49
+ All entity endpoints follow a consistent pattern:
50
+ - GET /{entity} - List all entities
51
+ - POST /{entity} - Create a new entity (DCAT types only)
52
+ - GET /{entity}/{context_id}/{entry_id} - Get entity reference info
53
+ - DELETE /{entity}/{context_id}/{entry_id} - Delete an entity (DCAT types only)
54
+ - GET /{entity}/{context_id}/{entry_id}/metadata - Get raw RDF metadata
55
+ - PUT /{entity}/{context_id}/{entry_id}/metadata - Replace raw RDF metadata (JSON-LD, Turtle, RDF/XML, or N-Triples passthrough)
56
+
57
+ ## Reading and consistency
58
+
59
+ Reads of a single entity — `GET /{entity}/{context_id}/{entry_id}` and its
60
+ `/metadata` — go straight to the store and always reflect the latest write.
61
+
62
+ Lists and search do not. They are answered from a search index that is updated
63
+ asynchronously, so for a short interval after a write:
64
+
65
+ - an entry that was just created may be missing from the list it belongs to,
66
+ while reading it by id already works;
67
+ - an entry that was just deleted may still appear;
68
+ - `results` counts what the index holds, not what the store holds.
69
+
70
+ Write a client that tolerates this: after creating an entry, use the id the
71
+ create returned rather than searching for what you just wrote. `results` is
72
+ also an upper bound rather than an exact count when the caller cannot read
73
+ every hit (see the field's own description).
74
+
75
+ Separately, responses are cached for 15 minutes by default, which is a second
76
+ and unrelated source of staleness. A write invalidates the cache entries it
77
+ affects, but a read that lands in the indexing gap can cache a list that does
78
+ not yet show it.
79
+
80
+ ## Authentication
81
+
82
+ Most endpoints require an authenticated session. Reading public data works
83
+ without authentication, while creating, updating, and deleting entities
84
+ requires a valid user session.
85
+
86
+ 1. **Log in** with `POST /auth/login`, supplying an EntryStore username and
87
+ password. The response returns an `auth_token`.
88
+ 2. **Send the token** on subsequent requests via the `X-Auth-Token` header.
89
+ This is the recommended method for SDK and programmatic access. Browser
90
+ clients can instead rely on the `auth_token` cookie, which the server sets
91
+ automatically on login (`SameSite=Lax; Secure`).
92
+ 3. **Inspect the session** with `GET /auth/whoami`, which returns the current
93
+ user or an anonymous/guest identity when no valid token is supplied.
94
+ 4. **Log out** with `POST /auth/logout` to invalidate the token and clear the
95
+ cookie.
96
+
97
+ ### Writes and CSRF
98
+
99
+ Send the token as the `X-Auth-Token` **header** and there is nothing else to
100
+ do: creates, updates and deletes work as they are, which is how the SDKs and
101
+ the MCP server are built.
102
+
103
+ The `auth_token` cookie is different. A cookie is attached by the browser
104
+ automatically, so a state-changing request authenticated by it alone is what
105
+ cross-site request forgery abuses, and those requests additionally need a
106
+ double-submit token: read the `XSRF-TOKEN` cookie the server sets on any
107
+ response and send its value back as the `X-XSRF-TOKEN` header. Without it the
108
+ request is rejected with `403` before it reaches the endpoint.
109
+
110
+ A custom header cannot be forged this way — cross-origin JavaScript cannot set
111
+ one without a CORS preflight, which this API grants only to configured
112
+ origins — so the header is the recommended path for anything that is not a
113
+ browser session.
114
+
115
+ ### App Tokens
116
+
117
+ An app token identifies an integration. Create one with `POST /app-token`
118
+ (unauthenticated). Creation requires an email address: the token starts in the
119
+ `pending` state and a 6-digit code is emailed to the owner. Confirm the code
120
+ with `POST /app-token/verify` to activate the token and receive its value,
121
+ which is shown only once — store it securely. `GET /app-token/{app_token_id}`
122
+ then returns its details and quota usage, authenticated by the token itself via
123
+ the `X-App-Token` header.
124
+
125
+ **The `X-App-Token` header is accepted only by `GET /app-token/{app_token_id}`.**
126
+ No other operation reads it, and the read quota is recorded but not yet
127
+ enforced: reading public data needs no token of any kind, and sending an app
128
+ token with a read neither grants nor meters anything. Metered public read
129
+ access is the intent of the two-token model, not a description of this release
130
+ — see the `security` declared on each operation for what it actually accepts.
131
+
132
+ ## SDKs
133
+
134
+ Generated clients for Python, TypeScript, JavaScript and C# wrap every
135
+ operation below, and each operation on this page shows the SDK call beside
136
+ the `curl` command. Two of them install from a public registry:
137
+
138
+ ```
139
+ pip install entryscape # Python
140
+ npm install @entryscape/api-client # TypeScript and JavaScript
141
+ ```
142
+
143
+ `@entryscape/api-client` ships an ESM and a CommonJS build, so `import` and
144
+ `require()` both work and TypeScript is not required to use it — the name
145
+ describes what it is written in, not what you have to write. There is a
146
+ separate generated JavaScript SDK, and it is deliberately **not** on npm;
147
+ this package is the npm client for both languages.
148
+
149
+ Every SDK, including the C# and JavaScript ones, is also published as a
150
+ tarball. The downloads are linked in the sidebar, they are the route to take
151
+ when a registry is unreachable or a build has to vendor its dependencies, and
152
+ each archive carries the SDK's own README:
153
+
154
+ - **Python** — `pip install entryscape`, or `python-sdk.tar.gz`.
155
+ - **TypeScript and JavaScript** — `npm install @entryscape/api-client`, or
156
+ `typescript-sdk.tar.gz`.
157
+ - **JavaScript (the separate generated client)** — not published to a
158
+ registry, by design; `javascript-sdk.tar.gz` only.
159
+ - **C#** — not published to NuGet yet; `csharp-sdk.tar.gz` only.
160
+ - **MCP server** — `npx -y @entryscape/mcp-server`, or `mcp-server.tar.gz`.
161
+
162
+ ## MCP Server
163
+
164
+ A Model Context Protocol (MCP) server is generated from this specification and
165
+ published alongside the SDKs (`@entryscape/mcp-server`), exposing the API as
166
+ tools for AI assistants and agents. Each operation becomes one tool named after
167
+ its `operationId` — `listDatasets`, `createCatalog`, `search`, `getJobStatus`.
168
+ The `auth` operations are the exception: the server reads its token once at
169
+ startup, so a `login` tool could install nothing and a `logout` tool would only
170
+ invalidate the token the server was started with. On connect the server also
171
+ hands the assistant a short set of rules that hold across every tool: a token is
172
+ bound to one EntryStore instance, the search index lags a write, uploads finish
173
+ as jobs.
174
+
175
+ ### Install
176
+
177
+ The server is on npm, and MCP servers are normally launched straight from
178
+ there, so nothing has to be installed first:
179
+
180
+ ```
181
+ npx -y @entryscape/mcp-server
182
+ ```
183
+
184
+ `npm install -g @entryscape/mcp-server` works too and puts an
185
+ `entryscape-mcp` binary on `PATH`. It is also listed in the MCP Registry as
186
+ `com.entryscape/mcp-server`, which is where clients and marketplaces look it
187
+ up.
188
+
189
+ Without npm, download `mcp-server.tar.gz` from the SDK downloads and unpack
190
+ it. The package ships prebuilt; install its runtime dependency once:
191
+
192
+ ```
193
+ mkdir entryscape-mcp && tar -xzf mcp-server.tar.gz -C entryscape-mcp
194
+ cd entryscape-mcp && npm install --omit=dev
195
+ ```
196
+
197
+ ### Configure
198
+
199
+ The server is a stdio MCP server configured through environment variables,
200
+ read once at startup:
201
+
202
+ - `ENTRYSCAPE_API_URL` — base URL of the API server, path included. Required:
203
+ there is no default, and the server refuses to start without it.
204
+ - `ENTRYSCAPE_AUTH_TOKEN` — a session token from `POST /auth/login`, sent as
205
+ the `X-Auth-Token` header. Optional: without it reads see public entries and
206
+ every write is refused. A token is valid only for the EntryStore instance
207
+ that issued it.
208
+ - `ENTRYSCAPE_ENTRYSTORE_HOST` — the EntryStore instance the API server should
209
+ use, for example `dev.entryscape.com/store/`. Unset means the API server's
210
+ own default.
211
+ - `ENTRYSCAPE_MCP_UPLOAD_ROOT` — the directory the upload tools may read files
212
+ from. **Unset means uploads are disabled**: `addFileToDistribution`,
213
+ `replaceFileInDistribution` and `importTerminology` refuse and say so.
214
+ - `ENTRYSCAPE_MCP_TAGS` — comma-separated tags to serve tools for, for example
215
+ `catalog,dataset,distribution,search`. Unset serves every tool.
216
+
217
+ The package's `README.md` lists the remaining variables (timeouts and size
218
+ caps). Register the server with any MCP-capable client by adding it to the
219
+ client's `mcpServers` configuration:
220
+
221
+ ```json
222
+ {
223
+ \"mcpServers\": {
224
+ \"entryscape\": {
225
+ \"command\": \"npx\",
226
+ \"args\": [\"-y\", \"@entryscape/mcp-server\"],
227
+ \"env\": {
228
+ \"ENTRYSCAPE_API_URL\": \"https://<your EntryScape API host>\",
229
+ \"ENTRYSCAPE_AUTH_TOKEN\": \"your-session-token\"
230
+ }
231
+ }
232
+ }
233
+ }
234
+ ```
235
+
236
+ From an unpacked download instead, the command is
237
+ `\"command\": \"node\", \"args\": [\"/path/to/entryscape-mcp/dist/bin/entryscape-mcp.js\"]`.
238
+
239
+ ### Claude Code
240
+
241
+ The unpacked package is also a Claude Code plugin, so one install gives the
242
+ server and the skills below together. Claude Code installs plugins from
243
+ marketplaces, and the package carries a one-entry marketplace pointing at
244
+ itself:
245
+
246
+ ```
247
+ claude plugin marketplace add /path/to/entryscape-mcp
248
+ claude plugin install entryscape@entryscape --scope user
249
+ ```
250
+
251
+ The plugin passes `ENTRYSCAPE_API_URL`, `ENTRYSCAPE_AUTH_TOKEN`,
252
+ `ENTRYSCAPE_ENTRYSTORE_HOST`, `ENTRYSCAPE_MCP_TAGS` and
253
+ `ENTRYSCAPE_MCP_UPLOAD_ROOT` through from the shell Claude Code was started in,
254
+ so set them there. To try the plugin for one session without installing it,
255
+ start Claude Code with `--plugin-dir /path/to/entryscape-mcp`.
256
+
257
+ ### Skills
258
+
259
+ `skills/` in the package holds procedures that span several tools, in the
260
+ Agent Skills format (a `SKILL.md` with `name` and `description`): which tools
261
+ to call in which order, what to check between calls, and where to stop. Claude
262
+ Code loads them from the plugin; other clients that read the format can be
263
+ pointed at the directory. The `find` skill covers discovery, facets and
264
+ selective metadata reads; `publish-dataset` takes a dataset from catalog to
265
+ validated distribution with its file; `edit-metadata` changes an entry that
266
+ already exists without dropping the rest of its graph, models included;
267
+ `migrate-from-taskrunner` moves an integration off the deprecated Taskrunner
268
+ API. Every tool a skill names is checked against this specification when the
269
+ package is built.
270
+
271
+ ## Deprecation Policy
272
+
273
+ When endpoints or features are deprecated:
274
+ 1. The operation is marked with `deprecated: true` in this spec
275
+ 2. The operation description documents the replacement endpoint and sunset date
276
+ 3. Deprecated endpoints remain functional for at least 6 months after announcement
277
+ 4. The server returns a `Sunset` header with the planned removal date
278
+ 5. After the sunset date, the endpoint may be removed in a future release
279
+
280
+
281
+ [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
282
+ [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
283
+
284
+ This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
285
+
286
+ - API version: 1.3.0
287
+ - Package version: 1.3.0
288
+ - Generator version: 7.22.0
289
+
290
+ For more information, please visit [https://entryscape.com/en/contact-us/](https://entryscape.com/en/contact-us/)
291
+
292
+ ## Requirements
293
+
294
+ - Python 3.10+
295
+ - Dependencies are managed via `pyproject.toml`
296
+
297
+ ## Installation
298
+
299
+ ### From PyPI (recommended)
300
+
301
+ ```bash
302
+ pip install entryscape
303
+ ```
304
+
305
+ ### From a download
306
+
307
+ Every release is also published as `python-sdk.tar.gz` at
308
+ <https://api.entryscape.com/sdk/latest/python-sdk.tar.gz>, for a build that cannot reach
309
+ PyPI or has to vendor its dependencies:
310
+
311
+ The archive has no top-level directory of its own, so unpack it into one:
312
+
313
+ ```bash
314
+ mkdir entryscape-python && tar -xzf python-sdk.tar.gz -C entryscape-python
315
+ pip install ./entryscape-python
316
+ ```
317
+
318
+ ### From Bitbucket
319
+
320
+ ```bash
321
+ pip install git+https://bitbucket.org/metasolutions/entryscape-api.git#subdirectory=out/python-sdk
322
+ ```
323
+
324
+ ### From source
325
+
326
+ ```bash
327
+ git clone https://bitbucket.org/metasolutions/entryscape-api.git
328
+ cd entryscape-api/out/python-sdk
329
+ pip install .
330
+ ```
331
+
332
+ ### For development
333
+
334
+ ```bash
335
+ pip install -e ".[dev]"
336
+ ```
337
+
338
+ ## Quick Start
339
+
340
+ ```python
341
+ import entryscape
342
+ from entryscape import ApiException
343
+
344
+ # Configure the client
345
+ configuration = entryscape.Configuration(
346
+ host="http://localhost:8080" # API server URL
347
+ )
348
+
349
+ # Async usage
350
+ import asyncio
351
+
352
+ async def main():
353
+ async with entryscape.ApiClient(configuration) as api_client:
354
+ api = entryscape.CatalogApi(api_client)
355
+
356
+ try:
357
+ # List catalogs from an EntryStore instance
358
+ catalogs = await api.list_catalogs(
359
+ entrystore_host="dev.entryscape.com/store/"
360
+ )
361
+ print(f"Found {catalogs.results} catalogs")
362
+
363
+ for item in catalogs.items or []:
364
+ print(f" - {item.uri}")
365
+ except ApiException as e:
366
+ print(f"API error: {e}")
367
+
368
+ asyncio.run(main())
369
+ ```
370
+
371
+ ## EntryStore Hosts
372
+
373
+ Pass a host string permitted by the API deployment's effective EntryStore allowlist.
374
+ Omit it to use the deployment's configured default. A bare hostname uses `/store/`;
375
+ a host with a base path selects that path. Do not include a URL scheme.
376
+
377
+ ```python
378
+ entrystore_host = "dev.entryscape.com/store/"
379
+ ```
380
+
381
+ ## Getting Started
382
+
383
+ Please follow the [installation procedure](#installation) and then run the following:
384
+
385
+ ```python
386
+ import asyncio
387
+ import os
388
+
389
+ import entryscape
390
+ from entryscape import ApiException
391
+ from pprint import pprint
392
+
393
+ # Defining the host is optional and defaults to https://api.entryscape.com
394
+ # See configuration.py for a list of all supported configuration parameters.
395
+ configuration = entryscape.Configuration(
396
+ host = "https://api.entryscape.com"
397
+ )
398
+
399
+ # The client must configure the authentication and authorization parameters
400
+ # in accordance with the API server security policy.
401
+ # Examples for each auth method are provided below, use the example that
402
+ # satisfies your auth use case.
403
+
404
+ # Configure API key authorization: auth_token
405
+ configuration.api_key['auth_token'] = os.environ["API_KEY"]
406
+
407
+ # Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
408
+ # configuration.api_key_prefix['auth_token'] = 'Bearer'
409
+
410
+ # Configure API key authorization: auth_header
411
+ configuration.api_key['auth_header'] = os.environ["API_KEY"]
412
+
413
+ # Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
414
+ # configuration.api_key_prefix['auth_header'] = 'Bearer'
415
+
416
+ # Configure API key authorization: app_token_header
417
+ configuration.api_key['app_token_header'] = os.environ["API_KEY"]
418
+
419
+ # Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
420
+ # configuration.api_key_prefix['app_token_header'] = 'Bearer'
421
+
422
+
423
+ async def main():
424
+ # Enter a context with an instance of the API client
425
+ async with entryscape.ApiClient(configuration) as api_client:
426
+ # Create an instance of the API class
427
+ api_instance = entryscape.AppTokenApi(api_client)
428
+ app_token_create_request = {"name":"my-data-app","email":"owner@example.com"} # AppTokenCreateRequest |
429
+
430
+ try:
431
+ # Create app token
432
+ api_response = await api_instance.create_app_token(app_token_create_request)
433
+ print("The response of AppTokenApi->create_app_token:\n")
434
+ pprint(api_response)
435
+ except ApiException as e:
436
+ print("Exception when calling AppTokenApi->create_app_token: %s\n" % e)
437
+
438
+ asyncio.run(main())
439
+
440
+ ```
441
+
442
+ ## Documentation for API Endpoints
443
+
444
+ All URIs are relative to *https://api.entryscape.com*
445
+
446
+ Class | Method | HTTP request | Description
447
+ ------------ | ------------- | ------------- | -------------
448
+ *AppTokenApi* | [**create_app_token**](docs/AppTokenApi.md#create_app_token) | **POST** /app-token | Create app token
449
+ *AppTokenApi* | [**get_app_token**](docs/AppTokenApi.md#get_app_token) | **GET** /app-token/{app_token_id} | Get app token details
450
+ *AppTokenApi* | [**verify_app_token**](docs/AppTokenApi.md#verify_app_token) | **POST** /app-token/verify | Verify app token
451
+ *AuthApi* | [**login**](docs/AuthApi.md#login) | **POST** /auth/login | Log in (start a user session)
452
+ *AuthApi* | [**logout**](docs/AuthApi.md#logout) | **POST** /auth/logout | Log out (end the user session)
453
+ *AuthApi* | [**whoami**](docs/AuthApi.md#whoami) | **GET** /auth/whoami | Current user for the session
454
+ *CatalogApi* | [**create_catalog**](docs/CatalogApi.md#create_catalog) | **POST** /catalog | Create catalog
455
+ *CatalogApi* | [**delete_catalog**](docs/CatalogApi.md#delete_catalog) | **DELETE** /catalog/{context_id}/{entry_id} | Delete catalog
456
+ *CatalogApi* | [**get_catalog**](docs/CatalogApi.md#get_catalog) | **GET** /catalog/{context_id}/{entry_id} | Get catalog
457
+ *CatalogApi* | [**get_catalog_metadata**](docs/CatalogApi.md#get_catalog_metadata) | **GET** /catalog/{context_id}/{entry_id}/metadata | Get catalog metadata
458
+ *CatalogApi* | [**list_catalog_dataservices**](docs/CatalogApi.md#list_catalog_dataservices) | **GET** /catalog/{context_id}/{entry_id}/dataservices | List data services in catalog
459
+ *CatalogApi* | [**list_catalog_datasets**](docs/CatalogApi.md#list_catalog_datasets) | **GET** /catalog/{context_id}/{entry_id}/datasets | List datasets in catalog
460
+ *CatalogApi* | [**list_catalogs**](docs/CatalogApi.md#list_catalogs) | **GET** /catalog | List catalogs
461
+ *CatalogApi* | [**update_catalog_metadata**](docs/CatalogApi.md#update_catalog_metadata) | **PUT** /catalog/{context_id}/{entry_id}/metadata | Update catalog metadata
462
+ *CatalogApi* | [**validate_catalog**](docs/CatalogApi.md#validate_catalog) | **GET** /catalog/{context_id}/{entry_id}/validate | Validate catalog metadata
463
+ *ContactApi* | [**create_contact**](docs/ContactApi.md#create_contact) | **POST** /contact | Create contact
464
+ *ContactApi* | [**delete_contact**](docs/ContactApi.md#delete_contact) | **DELETE** /contact/{context_id}/{entry_id} | Delete contact
465
+ *ContactApi* | [**get_contact**](docs/ContactApi.md#get_contact) | **GET** /contact/{context_id}/{entry_id} | Get contact
466
+ *ContactApi* | [**get_contact_metadata**](docs/ContactApi.md#get_contact_metadata) | **GET** /contact/{context_id}/{entry_id}/metadata | Get contact metadata
467
+ *ContactApi* | [**list_contacts**](docs/ContactApi.md#list_contacts) | **GET** /contact | List contacts
468
+ *ContactApi* | [**update_contact_metadata**](docs/ContactApi.md#update_contact_metadata) | **PUT** /contact/{context_id}/{entry_id}/metadata | Update contact metadata
469
+ *ContactApi* | [**validate_contact**](docs/ContactApi.md#validate_contact) | **GET** /contact/{context_id}/{entry_id}/validate | Validate contact metadata
470
+ *DataserviceApi* | [**create_data_service**](docs/DataserviceApi.md#create_data_service) | **POST** /dataservice | Create data service
471
+ *DataserviceApi* | [**delete_data_service**](docs/DataserviceApi.md#delete_data_service) | **DELETE** /dataservice/{context_id}/{entry_id} | Delete data service
472
+ *DataserviceApi* | [**get_data_service**](docs/DataserviceApi.md#get_data_service) | **GET** /dataservice/{context_id}/{entry_id} | Get data service
473
+ *DataserviceApi* | [**get_data_service_metadata**](docs/DataserviceApi.md#get_data_service_metadata) | **GET** /dataservice/{context_id}/{entry_id}/metadata | Get data service metadata
474
+ *DataserviceApi* | [**list_data_services**](docs/DataserviceApi.md#list_data_services) | **GET** /dataservice | List data services
475
+ *DataserviceApi* | [**update_data_service_metadata**](docs/DataserviceApi.md#update_data_service_metadata) | **PUT** /dataservice/{context_id}/{entry_id}/metadata | Update data service metadata
476
+ *DataserviceApi* | [**validate_data_service**](docs/DataserviceApi.md#validate_data_service) | **GET** /dataservice/{context_id}/{entry_id}/validate | Validate data service metadata
477
+ *DatasetApi* | [**create_dataset**](docs/DatasetApi.md#create_dataset) | **POST** /dataset | Create dataset
478
+ *DatasetApi* | [**delete_dataset**](docs/DatasetApi.md#delete_dataset) | **DELETE** /dataset/{context_id}/{entry_id} | Delete dataset
479
+ *DatasetApi* | [**get_dataset**](docs/DatasetApi.md#get_dataset) | **GET** /dataset/{context_id}/{entry_id} | Get dataset
480
+ *DatasetApi* | [**get_dataset_metadata**](docs/DatasetApi.md#get_dataset_metadata) | **GET** /dataset/{context_id}/{entry_id}/metadata | Get dataset metadata
481
+ *DatasetApi* | [**list_dataset_distributions**](docs/DatasetApi.md#list_dataset_distributions) | **GET** /dataset/{context_id}/{entry_id}/distributions | List distributions for dataset
482
+ *DatasetApi* | [**list_datasets**](docs/DatasetApi.md#list_datasets) | **GET** /dataset | List datasets
483
+ *DatasetApi* | [**update_dataset_metadata**](docs/DatasetApi.md#update_dataset_metadata) | **PUT** /dataset/{context_id}/{entry_id}/metadata | Update dataset metadata
484
+ *DatasetApi* | [**validate_dataset**](docs/DatasetApi.md#validate_dataset) | **GET** /dataset/{context_id}/{entry_id}/validate | Validate dataset metadata
485
+ *DistributionApi* | [**create_distribution**](docs/DistributionApi.md#create_distribution) | **POST** /distribution | Create distribution
486
+ *DistributionApi* | [**delete_distribution**](docs/DistributionApi.md#delete_distribution) | **DELETE** /distribution/{context_id}/{entry_id} | Delete distribution
487
+ *DistributionApi* | [**get_distribution**](docs/DistributionApi.md#get_distribution) | **GET** /distribution/{context_id}/{entry_id} | Get distribution
488
+ *DistributionApi* | [**get_distribution_metadata**](docs/DistributionApi.md#get_distribution_metadata) | **GET** /distribution/{context_id}/{entry_id}/metadata | Get distribution metadata
489
+ *DistributionApi* | [**list_distributions**](docs/DistributionApi.md#list_distributions) | **GET** /distribution | List distributions
490
+ *DistributionApi* | [**update_distribution_metadata**](docs/DistributionApi.md#update_distribution_metadata) | **PUT** /distribution/{context_id}/{entry_id}/metadata | Update distribution metadata
491
+ *DistributionApi* | [**validate_distribution**](docs/DistributionApi.md#validate_distribution) | **GET** /distribution/{context_id}/{entry_id}/validate | Validate distribution metadata
492
+ *DocumentApi* | [**create_document**](docs/DocumentApi.md#create_document) | **POST** /document | Create document
493
+ *DocumentApi* | [**delete_document**](docs/DocumentApi.md#delete_document) | **DELETE** /document/{context_id}/{entry_id} | Delete document
494
+ *DocumentApi* | [**get_document**](docs/DocumentApi.md#get_document) | **GET** /document/{context_id}/{entry_id} | Get document
495
+ *DocumentApi* | [**get_document_metadata**](docs/DocumentApi.md#get_document_metadata) | **GET** /document/{context_id}/{entry_id}/metadata | Get document metadata
496
+ *DocumentApi* | [**list_documents**](docs/DocumentApi.md#list_documents) | **GET** /document | List documents
497
+ *DocumentApi* | [**update_document_metadata**](docs/DocumentApi.md#update_document_metadata) | **PUT** /document/{context_id}/{entry_id}/metadata | Update document metadata
498
+ *IdeaApi* | [**create_idea**](docs/IdeaApi.md#create_idea) | **POST** /idea | Create idea
499
+ *IdeaApi* | [**delete_idea**](docs/IdeaApi.md#delete_idea) | **DELETE** /idea/{context_id}/{entry_id} | Delete idea
500
+ *IdeaApi* | [**get_idea**](docs/IdeaApi.md#get_idea) | **GET** /idea/{context_id}/{entry_id} | Get idea
501
+ *IdeaApi* | [**get_idea_metadata**](docs/IdeaApi.md#get_idea_metadata) | **GET** /idea/{context_id}/{entry_id}/metadata | Get idea metadata
502
+ *IdeaApi* | [**list_ideas**](docs/IdeaApi.md#list_ideas) | **GET** /idea | List ideas
503
+ *IdeaApi* | [**update_idea_metadata**](docs/IdeaApi.md#update_idea_metadata) | **PUT** /idea/{context_id}/{entry_id}/metadata | Update idea metadata
504
+ *JobApi* | [**get_job_status**](docs/JobApi.md#get_job_status) | **GET** /job/{job_id} | Get job status
505
+ *ModelApi* | [**create_model**](docs/ModelApi.md#create_model) | **POST** /model | Create model
506
+ *ModelApi* | [**delete_model**](docs/ModelApi.md#delete_model) | **DELETE** /model/{context_id} | Delete model
507
+ *ModelApi* | [**get_model**](docs/ModelApi.md#get_model) | **GET** /model/{context_id} | Get model
508
+ *ModelApi* | [**get_model_metadata**](docs/ModelApi.md#get_model_metadata) | **GET** /model/{context_id}/metadata | Get model metadata
509
+ *ModelApi* | [**list_models**](docs/ModelApi.md#list_models) | **GET** /model | List models
510
+ *ModelApi* | [**update_model_metadata**](docs/ModelApi.md#update_model_metadata) | **PUT** /model/{context_id}/metadata | Update model metadata
511
+ *ModelClassApi* | [**create_model_class**](docs/ModelClassApi.md#create_model_class) | **POST** /model/{context_id}/classes | Create model class
512
+ *ModelClassApi* | [**delete_model_class**](docs/ModelClassApi.md#delete_model_class) | **DELETE** /model/{context_id}/classes/{entry_id} | Delete model class
513
+ *ModelClassApi* | [**get_model_class**](docs/ModelClassApi.md#get_model_class) | **GET** /model/{context_id}/classes/{entry_id} | Get model class
514
+ *ModelClassApi* | [**get_model_class_metadata**](docs/ModelClassApi.md#get_model_class_metadata) | **GET** /model/{context_id}/classes/{entry_id}/metadata | Get model class metadata
515
+ *ModelClassApi* | [**list_model_classes**](docs/ModelClassApi.md#list_model_classes) | **GET** /model/{context_id}/classes | List model classes
516
+ *ModelClassApi* | [**update_model_class_metadata**](docs/ModelClassApi.md#update_model_class_metadata) | **PUT** /model/{context_id}/classes/{entry_id}/metadata | Update model class metadata
517
+ *ModelDiagramApi* | [**create_model_diagram**](docs/ModelDiagramApi.md#create_model_diagram) | **POST** /model/{context_id}/diagrams | Create model diagram
518
+ *ModelDiagramApi* | [**delete_model_diagram**](docs/ModelDiagramApi.md#delete_model_diagram) | **DELETE** /model/{context_id}/diagrams/{entry_id} | Delete model diagram
519
+ *ModelDiagramApi* | [**get_model_diagram**](docs/ModelDiagramApi.md#get_model_diagram) | **GET** /model/{context_id}/diagrams/{entry_id} | Get model diagram
520
+ *ModelDiagramApi* | [**get_model_diagram_metadata**](docs/ModelDiagramApi.md#get_model_diagram_metadata) | **GET** /model/{context_id}/diagrams/{entry_id}/metadata | Get model diagram metadata
521
+ *ModelDiagramApi* | [**list_model_diagrams**](docs/ModelDiagramApi.md#list_model_diagrams) | **GET** /model/{context_id}/diagrams | List model diagrams
522
+ *ModelDiagramApi* | [**update_model_diagram_metadata**](docs/ModelDiagramApi.md#update_model_diagram_metadata) | **PUT** /model/{context_id}/diagrams/{entry_id}/metadata | Update model diagram metadata
523
+ *ModelFieldApi* | [**create_model_field**](docs/ModelFieldApi.md#create_model_field) | **POST** /model/{context_id}/fields | Create model field
524
+ *ModelFieldApi* | [**delete_model_field**](docs/ModelFieldApi.md#delete_model_field) | **DELETE** /model/{context_id}/fields/{entry_id} | Delete model field
525
+ *ModelFieldApi* | [**get_model_field**](docs/ModelFieldApi.md#get_model_field) | **GET** /model/{context_id}/fields/{entry_id} | Get model field
526
+ *ModelFieldApi* | [**get_model_field_metadata**](docs/ModelFieldApi.md#get_model_field_metadata) | **GET** /model/{context_id}/fields/{entry_id}/metadata | Get model field metadata
527
+ *ModelFieldApi* | [**list_model_fields**](docs/ModelFieldApi.md#list_model_fields) | **GET** /model/{context_id}/fields | List model fields
528
+ *ModelFieldApi* | [**update_model_field_metadata**](docs/ModelFieldApi.md#update_model_field_metadata) | **PUT** /model/{context_id}/fields/{entry_id}/metadata | Update model field metadata
529
+ *ModelFormApi* | [**create_model_form**](docs/ModelFormApi.md#create_model_form) | **POST** /model/{context_id}/forms | Create model form
530
+ *ModelFormApi* | [**delete_model_form**](docs/ModelFormApi.md#delete_model_form) | **DELETE** /model/{context_id}/forms/{entry_id} | Delete model form
531
+ *ModelFormApi* | [**get_model_form**](docs/ModelFormApi.md#get_model_form) | **GET** /model/{context_id}/forms/{entry_id} | Get model form
532
+ *ModelFormApi* | [**get_model_form_metadata**](docs/ModelFormApi.md#get_model_form_metadata) | **GET** /model/{context_id}/forms/{entry_id}/metadata | Get model form metadata
533
+ *ModelFormApi* | [**list_model_forms**](docs/ModelFormApi.md#list_model_forms) | **GET** /model/{context_id}/forms | List model forms
534
+ *ModelFormApi* | [**update_model_form_metadata**](docs/ModelFormApi.md#update_model_form_metadata) | **PUT** /model/{context_id}/forms/{entry_id}/metadata | Update model form metadata
535
+ *ModelNamespaceApi* | [**create_model_namespace**](docs/ModelNamespaceApi.md#create_model_namespace) | **POST** /model/{context_id}/namespaces | Create model namespace
536
+ *ModelNamespaceApi* | [**delete_model_namespace**](docs/ModelNamespaceApi.md#delete_model_namespace) | **DELETE** /model/{context_id}/namespaces/{entry_id} | Delete model namespace
537
+ *ModelNamespaceApi* | [**get_model_namespace**](docs/ModelNamespaceApi.md#get_model_namespace) | **GET** /model/{context_id}/namespaces/{entry_id} | Get model namespace
538
+ *ModelNamespaceApi* | [**get_model_namespace_metadata**](docs/ModelNamespaceApi.md#get_model_namespace_metadata) | **GET** /model/{context_id}/namespaces/{entry_id}/metadata | Get model namespace metadata
539
+ *ModelNamespaceApi* | [**list_model_namespaces**](docs/ModelNamespaceApi.md#list_model_namespaces) | **GET** /model/{context_id}/namespaces | List model namespaces
540
+ *ModelNamespaceApi* | [**update_model_namespace_metadata**](docs/ModelNamespaceApi.md#update_model_namespace_metadata) | **PUT** /model/{context_id}/namespaces/{entry_id}/metadata | Update model namespace metadata
541
+ *ModelPropertyApi* | [**create_model_property**](docs/ModelPropertyApi.md#create_model_property) | **POST** /model/{context_id}/properties | Create model property
542
+ *ModelPropertyApi* | [**delete_model_property**](docs/ModelPropertyApi.md#delete_model_property) | **DELETE** /model/{context_id}/properties/{entry_id} | Delete model property
543
+ *ModelPropertyApi* | [**get_model_property**](docs/ModelPropertyApi.md#get_model_property) | **GET** /model/{context_id}/properties/{entry_id} | Get model property
544
+ *ModelPropertyApi* | [**get_model_property_metadata**](docs/ModelPropertyApi.md#get_model_property_metadata) | **GET** /model/{context_id}/properties/{entry_id}/metadata | Get model property metadata
545
+ *ModelPropertyApi* | [**list_model_properties**](docs/ModelPropertyApi.md#list_model_properties) | **GET** /model/{context_id}/properties | List model properties
546
+ *ModelPropertyApi* | [**update_model_property_metadata**](docs/ModelPropertyApi.md#update_model_property_metadata) | **PUT** /model/{context_id}/properties/{entry_id}/metadata | Update model property metadata
547
+ *OrganizationApi* | [**create_organization**](docs/OrganizationApi.md#create_organization) | **POST** /organization | Create organization
548
+ *OrganizationApi* | [**delete_organization**](docs/OrganizationApi.md#delete_organization) | **DELETE** /organization/{context_id}/{entry_id} | Delete organization
549
+ *OrganizationApi* | [**get_organization**](docs/OrganizationApi.md#get_organization) | **GET** /organization/{context_id}/{entry_id} | Get organization
550
+ *OrganizationApi* | [**get_organization_metadata**](docs/OrganizationApi.md#get_organization_metadata) | **GET** /organization/{context_id}/{entry_id}/metadata | Get organization metadata
551
+ *OrganizationApi* | [**list_organizations**](docs/OrganizationApi.md#list_organizations) | **GET** /organization | List organizations
552
+ *OrganizationApi* | [**update_organization_metadata**](docs/OrganizationApi.md#update_organization_metadata) | **PUT** /organization/{context_id}/{entry_id}/metadata | Update organization metadata
553
+ *OrganizationApi* | [**validate_organization**](docs/OrganizationApi.md#validate_organization) | **GET** /organization/{context_id}/{entry_id}/validate | Validate organization metadata
554
+ *SearchApi* | [**advanced_search**](docs/SearchApi.md#advanced_search) | **POST** /search | Advanced search
555
+ *SearchApi* | [**get_search_facets**](docs/SearchApi.md#get_search_facets) | **GET** /search/facets | Get available facet fields
556
+ *SearchApi* | [**search**](docs/SearchApi.md#search) | **GET** /search | Search entries
557
+ *ShowcaseApi* | [**create_showcase**](docs/ShowcaseApi.md#create_showcase) | **POST** /showcase | Create showcase
558
+ *ShowcaseApi* | [**delete_showcase**](docs/ShowcaseApi.md#delete_showcase) | **DELETE** /showcase/{context_id}/{entry_id} | Delete showcase
559
+ *ShowcaseApi* | [**get_showcase**](docs/ShowcaseApi.md#get_showcase) | **GET** /showcase/{context_id}/{entry_id} | Get showcase
560
+ *ShowcaseApi* | [**get_showcase_metadata**](docs/ShowcaseApi.md#get_showcase_metadata) | **GET** /showcase/{context_id}/{entry_id}/metadata | Get showcase metadata
561
+ *ShowcaseApi* | [**list_showcases**](docs/ShowcaseApi.md#list_showcases) | **GET** /showcase | List showcases
562
+ *ShowcaseApi* | [**update_showcase_metadata**](docs/ShowcaseApi.md#update_showcase_metadata) | **PUT** /showcase/{context_id}/{entry_id}/metadata | Update showcase metadata
563
+ *SuggestionApi* | [**create_suggestion**](docs/SuggestionApi.md#create_suggestion) | **POST** /suggestion | Create suggestion
564
+ *SuggestionApi* | [**delete_suggestion**](docs/SuggestionApi.md#delete_suggestion) | **DELETE** /suggestion/{context_id}/{entry_id} | Delete suggestion
565
+ *SuggestionApi* | [**get_suggestion**](docs/SuggestionApi.md#get_suggestion) | **GET** /suggestion/{context_id}/{entry_id} | Get suggestion
566
+ *SuggestionApi* | [**get_suggestion_metadata**](docs/SuggestionApi.md#get_suggestion_metadata) | **GET** /suggestion/{context_id}/{entry_id}/metadata | Get suggestion metadata
567
+ *SuggestionApi* | [**list_suggestions**](docs/SuggestionApi.md#list_suggestions) | **GET** /suggestion | List suggestions
568
+ *SuggestionApi* | [**update_suggestion_metadata**](docs/SuggestionApi.md#update_suggestion_metadata) | **PUT** /suggestion/{context_id}/{entry_id}/metadata | Update suggestion metadata
569
+ *TerminologyApi* | [**delete_terminology**](docs/TerminologyApi.md#delete_terminology) | **DELETE** /terminology/{context_id} | Delete terminology
570
+ *TerminologyApi* | [**get_terminology**](docs/TerminologyApi.md#get_terminology) | **GET** /terminology/{context_id} | Get terminology
571
+ *TerminologyApi* | [**import_terminology**](docs/TerminologyApi.md#import_terminology) | **POST** /terminology/import | Import SKOS terminology
572
+ *TerminologyApi* | [**list_terminologies**](docs/TerminologyApi.md#list_terminologies) | **GET** /terminology | List terminologies
573
+ *UploadApi* | [**add_file_to_distribution**](docs/UploadApi.md#add_file_to_distribution) | **POST** /distribution/addFile | Add file to distribution
574
+ *UploadApi* | [**replace_file_in_distribution**](docs/UploadApi.md#replace_file_in_distribution) | **POST** /distribution/replaceFile | Replace file in distribution
575
+
576
+
577
+ ## Documentation For Models
578
+
579
+ - [AppToken](docs/AppToken.md)
580
+ - [AppTokenCreateRequest](docs/AppTokenCreateRequest.md)
581
+ - [AppTokenCreateResponse](docs/AppTokenCreateResponse.md)
582
+ - [AppTokenStatus](docs/AppTokenStatus.md)
583
+ - [AppTokenVerifyRequest](docs/AppTokenVerifyRequest.md)
584
+ - [EntityListItem](docs/EntityListItem.md)
585
+ - [EntityListResponse](docs/EntityListResponse.md)
586
+ - [EntityReference](docs/EntityReference.md)
587
+ - [EntityType](docs/EntityType.md)
588
+ - [Error](docs/Error.md)
589
+ - [FacetField](docs/FacetField.md)
590
+ - [FacetFieldValuesInner](docs/FacetFieldValuesInner.md)
591
+ - [FacetList](docs/FacetList.md)
592
+ - [FacetListAvailableInner](docs/FacetListAvailableInner.md)
593
+ - [JobResponse](docs/JobResponse.md)
594
+ - [JobStatus](docs/JobStatus.md)
595
+ - [JobStatusProgress](docs/JobStatusProgress.md)
596
+ - [JobStatusValue](docs/JobStatusValue.md)
597
+ - [JobType](docs/JobType.md)
598
+ - [ListCatalogsEntryTypeParameter](docs/ListCatalogsEntryTypeParameter.md)
599
+ - [ListCatalogsGraphTypeParameter](docs/ListCatalogsGraphTypeParameter.md)
600
+ - [ListCatalogsResourceTypeParameter](docs/ListCatalogsResourceTypeParameter.md)
601
+ - [LoginRequest](docs/LoginRequest.md)
602
+ - [LoginResponse](docs/LoginResponse.md)
603
+ - [MetadataFormat](docs/MetadataFormat.md)
604
+ - [MetadataRequest](docs/MetadataRequest.md)
605
+ - [ParentReference](docs/ParentReference.md)
606
+ - [SearchRequest](docs/SearchRequest.md)
607
+ - [SearchRequestFilters](docs/SearchRequestFilters.md)
608
+ - [SearchRequestFiltersGraphType](docs/SearchRequestFiltersGraphType.md)
609
+ - [SearchRequestFiltersResourceType](docs/SearchRequestFiltersResourceType.md)
610
+ - [SearchRequestSort](docs/SearchRequestSort.md)
611
+ - [SearchRequestSortOrder](docs/SearchRequestSortOrder.md)
612
+ - [SearchResponse](docs/SearchResponse.md)
613
+ - [SearchResult](docs/SearchResult.md)
614
+ - [SearchResultGraphType](docs/SearchResultGraphType.md)
615
+ - [SearchResultResourceType](docs/SearchResultResourceType.md)
616
+ - [SearchSortOrderParameter](docs/SearchSortOrderParameter.md)
617
+ - [TerminologyImportMode](docs/TerminologyImportMode.md)
618
+ - [ValidationProfile](docs/ValidationProfile.md)
619
+ - [ValidationResponse](docs/ValidationResponse.md)
620
+ - [ValidationResult](docs/ValidationResult.md)
621
+ - [ValidationSeverity](docs/ValidationSeverity.md)
622
+ - [ValidationSummary](docs/ValidationSummary.md)
623
+ - [WhoamiResponse](docs/WhoamiResponse.md)
624
+
625
+
626
+ <a id="documentation-for-authorization"></a>
627
+ ## Documentation For Authorization
628
+
629
+ Authentication schemes defined for the API:
630
+ <a id="auth_token"></a>
631
+ ### auth_token
632
+
633
+ - **Type**: API key
634
+ - **API key parameter name**: auth_token
635
+ - **Location**: Cookie
636
+
637
+ <a id="auth_header"></a>
638
+ ### auth_header
639
+
640
+ - **Type**: API key
641
+ - **API key parameter name**: X-Auth-Token
642
+ - **Location**: HTTP header
643
+
644
+ <a id="app_token_header"></a>
645
+ ### app_token_header
646
+
647
+ - **Type**: API key
648
+ - **API key parameter name**: X-App-Token
649
+ - **Location**: HTTP header
650
+
651
+
652
+ ## Author
653
+
654
+ contact@entryscape.com
655
+
656
+
657
+ ## Examples
658
+
659
+ Complete runnable examples are included in the [`examples/`](examples/) directory:
660
+
661
+ | Example | Description |
662
+ |---------|-------------|
663
+ | [quickstart](examples/quickstart/) | Minimal hello-world — configure SDK, list catalogs |
664
+ | [browse-catalog](examples/browse-catalog/) | Navigate DCAT-AP hierarchy: catalogs → datasets → distributions |
665
+ | [search](examples/search/) | Simple search, advanced search, and faceted search |
666
+ | [file-upload](examples/file-upload/) | Upload/replace files with async job tracking |
667
+ | [explore-entities](examples/explore-entities/) | Browse organizations, contacts, ideas, suggestions, showcases, documents |
668
+
669
+ See also: [Generated API docs](https://entryscape.org/api-wip) — per-endpoint documentation with inline code samples
670
+
671
+ ## Running Tests
672
+
673
+ ```bash
674
+ # Install dev dependencies
675
+ pip install -e ".[dev]"
676
+
677
+ # Run tests
678
+ pytest
679
+
680
+ # Run tests with coverage
681
+ pytest --cov=entryscape
682
+
683
+ # Type checking
684
+ mypy entryscape
685
+
686
+ # Linting
687
+ ruff check entryscape
688
+ ```
689
+
690
+ ## Contributing
691
+
692
+ Contributions are welcome! Please see the [repository](https://bitbucket.org/metasolutions/entryscape-api) for guidelines.
693
+
694
+ ## License
695
+
696
+ This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.