@yottagraph-app/elemental-api-skill 1.0.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.
@@ -0,0 +1,360 @@
1
+ # Entities
2
+
3
+ Entities are the core objects in the Knowledge Graph: companies, people, organizations, products, and other named things that appear in the news. Each entity has a unique **Named Entity ID (NEID)**.
4
+
5
+ ## When to Use
6
+
7
+ - You have an entity name and need to find its NEID
8
+ - You have a NEID and need the entity's display name or details
9
+ - You're starting a new query and need to identify the subject
10
+ - You need entity metadata (industry, location, ticker, etc.)
11
+
12
+ ## Key Concepts
13
+
14
+ - **NEID**: A unique identifier for each entity. Required for most other API calls.
15
+ - Format: 20-character numeric string with zero-padding
16
+ - Example: `00416400910670863867`
17
+ - Always pad with leading zeros to exactly 20 characters when normalizing
18
+ - **EID**: The term EID is sometimes used interchangeably with NEID.
19
+ - **Entity Resolution**: The same real-world entity may have multiple names (e.g., "Apple", "Apple Inc.", "AAPL"). The API resolves these to a single NEID.
20
+ - **Entity Types (Flavors)**: Each entity has a type identified by a Flavor ID (FID) (ex. type "ship" is FID 1).
21
+
22
+ ## Tips
23
+
24
+ - Always start by searching for the entity to get the correct NEID
25
+ - After resolving an entity to an NEID, it's best to display the canonical entity name to the user to help them identify if something went wrong with the resolution.
26
+ - It's typically safe to resolve an entity to the top matching NEID. However, sometimes a useful pattern is to let the user give input that the resolution was incorrect, show them a longer list of matches, and let them choose a different resolution.
27
+ - Entity names are case-insensitive
28
+ - You can batch multiple entity lookups into a single `/entities/search` request using the `queries` array
29
+
30
+ ## Key Endpoints
31
+
32
+ | What you need | Endpoint | Returns |
33
+ |---------------|----------|---------|
34
+ | Find entity by name | `POST /entities/search` | Ranked matches with NEIDs and scores |
35
+ | Basic info (name, aliases, type) | `GET /entities/{neid}` | Quick summary for display |
36
+ | Full property values | `POST /elemental/entities/properties` | All properties with PIDs, values, timestamps |
37
+
38
+ **Important**: When a user asks for "entity properties," clarify which they mean:
39
+ - Basic info/metadata → use `/entities/{neid}`
40
+ - Detailed property data (like relationships, addresses, financial data) → use `/elemental/entities/properties`
41
+
42
+ ## Searching for Entities
43
+
44
+ `POST /entities/search`
45
+
46
+ Search for entities by name with scored ranking and optional disambiguation. Supports batch queries (multiple entities in one request). Content-Type must be `application/json`.
47
+
48
+ ### Request Body
49
+
50
+ | Field | Type | Required | Description |
51
+ |-------|------|----------|-------------|
52
+ | queries | SearchQuery[] | yes | Array of search queries |
53
+ | minScore | number | no | Minimum match score, 0.0-1.0 (default: 0.8) |
54
+ | maxResults | integer | no | Maximum results per query (default: 10) |
55
+ | includeNames | boolean | no | Include entity names in response (default: true) |
56
+ | includeAliases | boolean | no | Include entity aliases in response (default: false) |
57
+ | includeFlavors | boolean | no | Include entity type/flavor in response (default: true) |
58
+ | includeScores | boolean | no | Include match scores in response (default: true) |
59
+
60
+ ### SearchQuery
61
+
62
+ | Field | Type | Required | Description |
63
+ |-------|------|----------|-------------|
64
+ | queryId | integer | yes | User-provided ID for matching queries to results |
65
+ | query | string | yes | Entity name or strong ID to search for |
66
+ | snippet | string | no | Free-text snippet for disambiguating entities with similar names |
67
+ | flavors | string[] | no | Limit results to these entity types (e.g., `["organization"]`) |
68
+ | contextType | string | no | Resolution context: `namedEntity` (default), `event`, or `strongId` |
69
+ | strongIdProperty | string | no | Property name to use as strong ID (when contextType is `strongId`) |
70
+
71
+ ### Response
72
+
73
+ The response contains a `results` array with one entry per query:
74
+
75
+ | Field | Type | Description |
76
+ |-------|------|-------------|
77
+ | results[].queryId | integer | Matches the queryId from the request |
78
+ | results[].matches[] | Match[] | Matches sorted by decreasing score |
79
+
80
+ Each Match contains:
81
+
82
+ | Field | Type | Description |
83
+ |-------|------|-------------|
84
+ | neid | string | 20-character entity ID |
85
+ | name | string | Entity display name (when includeNames is true) |
86
+ | aliases | string[] | Other names for this entity (when includeAliases is true) |
87
+ | flavor | string | Entity type name (when includeFlavors is true) |
88
+ | score | number | Match confidence 0.0-1.0 (when includeScores is true) |
89
+
90
+ ### Example
91
+
92
+ **Request:**
93
+
94
+ ```json
95
+ {
96
+ "queries": [
97
+ {"queryId": 1, "query": "Apple"},
98
+ {"queryId": 2, "query": "MSFT", "flavors": ["financial_instrument"]}
99
+ ],
100
+ "maxResults": 3
101
+ }
102
+ ```
103
+
104
+ **Response:**
105
+
106
+ ```json
107
+ {
108
+ "results": [
109
+ {
110
+ "queryId": 1,
111
+ "matches": [
112
+ {"neid": "00416400910670863867", "name": "Apple", "flavor": "organization", "score": 0.95},
113
+ {"neid": "07437212020357111309", "name": "AAPL", "flavor": "financial_instrument", "score": 0.82}
114
+ ]
115
+ },
116
+ {
117
+ "queryId": 2,
118
+ "matches": [
119
+ {"neid": "03016672914748108965", "name": "MSFT", "flavor": "financial_instrument", "score": 0.98}
120
+ ]
121
+ }
122
+ ]
123
+ }
124
+ ```
125
+
126
+ ## Schema and Property Lookup
127
+
128
+ For understanding entity types (flavors), properties, and the data model, see **schema.md**. You'll need the schema because many API responses return only FIDs and PIDs — use it to translate these to human-readable names.
129
+
130
+
131
+ <!-- BEGIN GENERATED CONTENT -->
132
+
133
+ ## Endpoints
134
+
135
+ ### Get entity details
136
+
137
+ `GET /entities/{neid}`
138
+
139
+ Get details about a named entity including name, aliases, and type. This is an alias for /reports/{neid}. Response is cached for 5 minutes.
140
+
141
+ #### Guidance
142
+
143
+ Response is wrapped in a 'report' container object. Access entity data via response.report.
144
+
145
+ #### Parameters
146
+
147
+ | Name | Type | Required | Description |
148
+ |------|------|----------|-------------|
149
+ | neid | string | yes | Named Entity ID |
150
+
151
+ #### Responses
152
+
153
+ | Status | Description |
154
+ |--------|-------------|
155
+ | 200 | Entity details (`GetNamedEntityReportResponse`) |
156
+ | 400 | Invalid NEID (`Error`) |
157
+ | 404 | Entity not found (`Error`) |
158
+ | 500 | Internal server error (`Error`) |
159
+
160
+ #### Example
161
+
162
+ **Request:**
163
+
164
+ ```
165
+ GET /entities/00416400910670863867
166
+ ```
167
+
168
+ **Response:**
169
+
170
+ ```json
171
+ {"report": {"neid": "00416400910670863867", "name": "Apple", "aliases": ["AAPL", "APPLE", "APPLE INC", "Apple Inc"], "type": "organization"}}
172
+ ```
173
+
174
+ ---
175
+
176
+ ### Get entity report
177
+
178
+ `GET /reports/{neid}`
179
+
180
+ Get a report about a named entity including name, aliases, and type. Response is cached for 5 minutes.
181
+
182
+ #### Guidance
183
+
184
+ Response is wrapped in a 'report' container object. Access entity data via response.report.
185
+
186
+ #### Parameters
187
+
188
+ | Name | Type | Required | Description |
189
+ |------|------|----------|-------------|
190
+ | neid | string | yes | Named Entity ID |
191
+
192
+ #### Responses
193
+
194
+ | Status | Description |
195
+ |--------|-------------|
196
+ | 200 | Entity report (`GetNamedEntityReportResponse`) |
197
+ | 400 | Invalid NEID (`Error`) |
198
+ | 404 | Entity not found (`Error`) |
199
+ | 500 | Internal server error (`Error`) |
200
+
201
+ #### Example
202
+
203
+ **Request:**
204
+
205
+ ```
206
+ GET /reports/00416400910670863867
207
+ ```
208
+
209
+ **Response:**
210
+
211
+ ```json
212
+ {"report": {"neid": "00416400910670863867", "name": "Apple", "aliases": ["AAPL", "APPLE", "APPLE INC", "Apple Inc"], "type": "organization"}}
213
+ ```
214
+
215
+ ---
216
+
217
+ ### Find entities by expression
218
+
219
+ `POST /elemental/find`
220
+
221
+ Search for entities using a powerful expression language. The expression parameter supports complex nested queries with logical operators, geographic constraints, property comparisons, and more.
222
+
223
+ #### Guidance
224
+
225
+ CRITICAL: This endpoint REQUIRES Content-Type: application/x-www-form-urlencoded. Sending a JSON body will fail with 400 error. The expression parameter must be URL-encoded form data, not a JSON request body. For the full expression language reference including all expression types, comparison operators, and examples, see find.md.
226
+
227
+ #### Request Body
228
+
229
+ **Content-Type:** `application/x-www-form-urlencoded`
230
+
231
+ | Name | Type | Required | Description |
232
+ |------|------|----------|-------------|
233
+ | expression | string | yes | JSON-encoded expression object defining the search criteria |
234
+ | deadline | any | no | Response deadline in milliseconds or duration format |
235
+ | limit | integer | no | Maximum number of entity IDs to return in first response |
236
+
237
+ #### Responses
238
+
239
+ | Status | Description |
240
+ |--------|-------------|
241
+ | 200 | Find operation successful (`FindResponse`) |
242
+ | 400 | Bad request - invalid parameters or malformed expression (`Error`) |
243
+ | 500 | Internal server error (`Error`) |
244
+ | 501 | Elemental API capability not enabled (`Error`) |
245
+
246
+ #### Example
247
+
248
+ **Request:**
249
+
250
+ ```
251
+ POST /elemental/find
252
+ Content-Type: application/x-www-form-urlencoded
253
+
254
+ expression={"type":"is_type","is_type":{"fid":10}}&limit=5
255
+ ```
256
+
257
+ **Response:**
258
+
259
+ ```json
260
+ {"op_id": "98cc54e9-0108-4361-9c96-18ea97cda7a2", "follow_up": true, "eids": ["01601807036815568643", "08115040994665529432", "02045070050429461063"]}
261
+ ```
262
+
263
+ ---
264
+
265
+ ### Get property values for entities
266
+
267
+ `POST /elemental/entities/properties`
268
+
269
+ Retrieves property values for specified entities. Returns the current values of requested properties for each entity.
270
+
271
+ #### Guidance
272
+
273
+ Pass entity IDs as a JSON array in the 'eids' form field (eids and neids are interchangeable terms for entity IDs). Optionally filter to specific properties via 'pids'. If pids is omitted, returns all available properties. Set include_attributes=true to get additional metadata about each property value.
274
+
275
+ #### Request Body
276
+
277
+ **Content-Type:** `application/x-www-form-urlencoded`
278
+
279
+ | Name | Type | Required | Description |
280
+ |------|------|----------|-------------|
281
+ | eids | string | yes | JSON array of entity IDs to get properties for |
282
+ | pids | string | no | JSON array of property IDs to retrieve (optional, omit for all properties) |
283
+ | include_attributes | string | no | Include property attributes in response (true/false) |
284
+
285
+ #### Responses
286
+
287
+ | Status | Description |
288
+ |--------|-------------|
289
+ | 200 | Property values retrieved successfully (`GetPropertyValuesResponse`) |
290
+ | 400 | Bad request - invalid parameters or malformed expression (`Error`) |
291
+ | 500 | Internal server error (`Error`) |
292
+
293
+ #### Example
294
+
295
+ **Request:**
296
+
297
+ ```
298
+ POST /elemental/entities/properties
299
+ Content-Type: application/x-www-form-urlencoded
300
+
301
+ eids=["00416400910670863867"]&pids=[8]
302
+ ```
303
+
304
+ **Response:**
305
+
306
+ ```json
307
+ {"op_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "follow_up": false, "values": [{"eid": "00416400910670863867", "pid": 8, "value": "Apple", "recorded_at": "2026-01-15T10:30:00Z"}]}
308
+ ```
309
+
310
+ ## Types
311
+
312
+ ### GetNamedEntityReportResponse
313
+
314
+ Response containing a report about a named entity
315
+
316
+ | Field | Type | Description |
317
+ |-------|------|-------------|
318
+ | report | `NamedEntityReport` | |
319
+
320
+ ### NamedEntityReport
321
+
322
+ The named entity report
323
+
324
+ | Field | Type | Description |
325
+ |-------|------|-------------|
326
+ | aliases | string[] | Aliases of the Named Entity from the forwarding map (i.e., from ER) |
327
+ | name | string | Name of the Named Entity |
328
+ | neid | string | Named Entity ID |
329
+ | type | string | Entity type (flavor) |
330
+
331
+ ### FindResponse
332
+
333
+ | Field | Type | Description |
334
+ |-------|------|-------------|
335
+ | find | `FindData` | |
336
+
337
+ ### FindData
338
+
339
+ | Field | Type | Description |
340
+ |-------|------|-------------|
341
+ | **eids** | string[] | Array of 20-character entity IDs matching the search expression |
342
+
343
+ ### GetPropertyValuesResponse
344
+
345
+ | Field | Type | Description |
346
+ |-------|------|-------------|
347
+ | **values** | `PropertyValue`[] | Array of property values for the requested entities |
348
+
349
+ ### PropertyValue
350
+
351
+ | Field | Type | Description |
352
+ |-------|------|-------------|
353
+ | **eid** | string | Entity ID this property value belongs to |
354
+ | **pid** | integer | Property ID |
355
+ | **value** | any | Property value (type varies by property: string, number, boolean, or entity ID) |
356
+ | recorded_at | string (date-time) | Timestamp when this value was recorded |
357
+ | imputed | boolean | Whether this value was imputed (inferred) rather than directly observed |
358
+ | attributes | object | Additional metadata about this property value (when include_attributes=true) |
359
+
360
+ <!-- END GENERATED CONTENT -->
@@ -0,0 +1,145 @@
1
+ # Events
2
+
3
+ Events are significant occurrences involving entities: mergers, acquisitions, lawsuits, executive changes, product launches, and other newsworthy happenings. Events are extracted from article content and link multiple entities and articles together.
4
+
5
+ ## When to Use
6
+
7
+ - You want to know what happened to/with an entity (not just mentions)
8
+ - You want to see how different articles reference the same event(s), and understand that many articles may duplicate information about the same event(s).
9
+ - You want to see what entities participated in an event, and what their roles were.
10
+
11
+ ## Key Concepts
12
+
13
+ - **Event ID (EVEID)**: Unique identifier for each event.
14
+ - Format: 20-character numeric string (same format as NEIDs)
15
+ - Example: `08640179941787350436`
16
+ - **Event Roles**: Entities participate in events with roles (e.g., acquirer, target, plaintiff)
17
+ - **Event Summary**: Brief description of what occurred
18
+ - **Event Date**: When the event happened (may differ from article publication date)
19
+
20
+ ## Tips
21
+
22
+ - Multiple articles may reference the same event
23
+ - Check entity roles to understand the nature of involvement
24
+
25
+ <!-- BEGIN GENERATED CONTENT -->
26
+
27
+ ## Endpoints
28
+
29
+ ### Get events for an entity
30
+
31
+ `GET /events/lookup`
32
+
33
+ Get list of event IDs (EVEIDs) where an entity participates within a time interval. Response is cached for 5 minutes.
34
+
35
+ #### Guidance
36
+
37
+ Event IDs returned may not all be immediately retrievable via /events/{eveid}. Some events may return 404 due to event processing timing or data availability. Handle 404 responses gracefully.
38
+
39
+ #### Parameters
40
+
41
+ | Name | Type | Required | Description |
42
+ |------|------|----------|-------------|
43
+ | interval_start | string | yes | Start time of interval (RFC3339) |
44
+ | interval_end | string | yes | End time of interval (RFC3339) |
45
+ | neid | string | yes | Named Entity ID |
46
+
47
+ #### Responses
48
+
49
+ | Status | Description |
50
+ |--------|-------------|
51
+ | 200 | List of event IDs (`GetEventsForEntityResponse`) |
52
+ | 400 | Invalid parameters (`Error`) |
53
+ | 500 | Internal server error (`Error`) |
54
+
55
+ #### Example
56
+
57
+ **Request:**
58
+
59
+ ```
60
+ GET /events/lookup?interval_start=2026-01-28T00:00:00Z&interval_end=2026-01-29T00:00:00Z&neid=00416400910670863867
61
+ ```
62
+
63
+ **Response:**
64
+
65
+ ```json
66
+ {"event_ids": ["07880710486873721498", "07189853443333370710", "01188063638449369172"]}
67
+ ```
68
+
69
+ ---
70
+
71
+ ### Get event detail
72
+
73
+ `GET /events/{eveid}`
74
+
75
+ Get detailed information about an event by its ID. Response is cached for 15 minutes.
76
+
77
+ #### Guidance
78
+
79
+ Response is wrapped in a 'detail' container object. Access event data via response.detail.
80
+
81
+ #### Parameters
82
+
83
+ | Name | Type | Required | Description |
84
+ |------|------|----------|-------------|
85
+ | eveid | string | yes | Event ID |
86
+
87
+ #### Responses
88
+
89
+ | Status | Description |
90
+ |--------|-------------|
91
+ | 200 | Event detail (`GetEventResponse`) |
92
+ | 400 | Invalid EVEID (`Error`) |
93
+ | 404 | Event not found (`Error`) |
94
+ | 500 | Internal server error (`Error`) |
95
+
96
+ #### Example
97
+
98
+ **Request:**
99
+
100
+ ```
101
+ GET /events/08640179941787350436
102
+ ```
103
+
104
+ **Response:**
105
+
106
+ ```json
107
+ {"detail": {"eveid": "08640179941787350436", "name": "event|Apple plans to release a foldable device...|2026", "date": "2026", "description": "The new design and engineering changes in the iPhone Air could pave the way...", "category": "Product Development", "likelihood": "Medium", "severity": 0, "speculative": false, "participants": [{"neid": "00416400910670863867", "sentiment": 0.5, "explanation": "The launch of new products...", "role": "company", "snippet": "Apple is gearing up for the most extensive refresh...", "artid": "07521758285625650094"}]}}
108
+ ```
109
+
110
+ ## Types
111
+
112
+ ### EventDetail
113
+
114
+ The event detail
115
+
116
+ | Field | Type | Description |
117
+ |-------|------|-------------|
118
+ | artids | string[] | Article IDs where this event was found |
119
+ | category | string | Category of the event |
120
+ | date | string | Date of the event |
121
+ | description | string | Description of the event |
122
+ | eveid | string | Event ID |
123
+ | likelihood | string | Likelihood assessment of the event |
124
+ | name | string | Name of the event |
125
+ | participants | `EventParticipant`[] | Participants in the event |
126
+ | severity | integer | Severity level of the event |
127
+ | speculative | boolean | Whether the event is speculative |
128
+
129
+ ### GetEventResponse
130
+
131
+ Response containing detailed information about an event
132
+
133
+ | Field | Type | Description |
134
+ |-------|------|-------------|
135
+ | detail | `EventDetail` | |
136
+
137
+ ### GetEventsForEntityResponse
138
+
139
+ Response containing event IDs for an entity
140
+
141
+ | Field | Type | Description |
142
+ |-------|------|-------------|
143
+ | event_ids | string[] | List of event IDs |
144
+
145
+ <!-- END GENERATED CONTENT -->