easydata-api 1.2.0__tar.gz → 1.4.0__tar.gz
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.
- {easydata_api-1.2.0 → easydata_api-1.4.0}/PKG-INFO +17 -5
- {easydata_api-1.2.0 → easydata_api-1.4.0}/README.md +16 -4
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api/client.py +49 -5
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api.egg-info/PKG-INFO +17 -5
- {easydata_api-1.2.0 → easydata_api-1.4.0}/pyproject.toml +1 -1
- {easydata_api-1.2.0 → easydata_api-1.4.0}/LICENSE +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api/__init__.py +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api/errors.py +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api/webhooks.py +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api.egg-info/SOURCES.txt +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api.egg-info/dependency_links.txt +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api.egg-info/requires.txt +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/easydata_api.egg-info/top_level.txt +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/setup.cfg +0 -0
- {easydata_api-1.2.0 → easydata_api-1.4.0}/tests/test_client.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: easydata-api
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: Official Python client for the EasyData LinkedIn enrichment API
|
|
5
5
|
Author-email: EasyData Development <dev@easydata.win>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -191,10 +191,22 @@ ed.account() # allowance, ceilings, secre
|
|
|
191
191
|
ed.usage(from_="2026-09-01", to="2026-09-30") # spend by day and operation
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
-
Operations are attributes: `profiles_enrich`, `
|
|
195
|
-
`
|
|
196
|
-
`
|
|
197
|
-
`sales_search_companies`.
|
|
194
|
+
Operations are attributes: `profiles_enrich`, `profiles_enrich_detailed`,
|
|
195
|
+
`profiles_activity`, `profiles_posts`, `profiles_comments`,
|
|
196
|
+
`profiles_reactions`, `companies_enrich`, `posts_enrich`,
|
|
197
|
+
`sales_search_people`, `sales_search_employees`, `sales_search_companies`.
|
|
198
|
+
|
|
199
|
+
`profiles_enrich_detailed` is `profiles_enrich` plus the optional sections -
|
|
200
|
+
`include_counts=True` for follower and connection counts,
|
|
201
|
+
`include_experience_detail=True` for what each role actually says,
|
|
202
|
+
`include_skill_details=True` for endorsement counts, `include_interests=True`
|
|
203
|
+
for what the person follows, and `include_recommendations=True` for written
|
|
204
|
+
recommendations in both directions. Each is one more request to LinkedIn and
|
|
205
|
+
costs +0.5 per target, charged only when the section answered, and at least one
|
|
206
|
+
of them is required.
|
|
207
|
+
|
|
208
|
+
The three list sections come back in three states: absent when you did not ask,
|
|
209
|
+
`[]` when you did and the member has none, and populated otherwise.
|
|
198
210
|
|
|
199
211
|
## Reference
|
|
200
212
|
|
|
@@ -170,10 +170,22 @@ ed.account() # allowance, ceilings, secre
|
|
|
170
170
|
ed.usage(from_="2026-09-01", to="2026-09-30") # spend by day and operation
|
|
171
171
|
```
|
|
172
172
|
|
|
173
|
-
Operations are attributes: `profiles_enrich`, `
|
|
174
|
-
`
|
|
175
|
-
`
|
|
176
|
-
`sales_search_companies`.
|
|
173
|
+
Operations are attributes: `profiles_enrich`, `profiles_enrich_detailed`,
|
|
174
|
+
`profiles_activity`, `profiles_posts`, `profiles_comments`,
|
|
175
|
+
`profiles_reactions`, `companies_enrich`, `posts_enrich`,
|
|
176
|
+
`sales_search_people`, `sales_search_employees`, `sales_search_companies`.
|
|
177
|
+
|
|
178
|
+
`profiles_enrich_detailed` is `profiles_enrich` plus the optional sections -
|
|
179
|
+
`include_counts=True` for follower and connection counts,
|
|
180
|
+
`include_experience_detail=True` for what each role actually says,
|
|
181
|
+
`include_skill_details=True` for endorsement counts, `include_interests=True`
|
|
182
|
+
for what the person follows, and `include_recommendations=True` for written
|
|
183
|
+
recommendations in both directions. Each is one more request to LinkedIn and
|
|
184
|
+
costs +0.5 per target, charged only when the section answered, and at least one
|
|
185
|
+
of them is required.
|
|
186
|
+
|
|
187
|
+
The three list sections come back in three states: absent when you did not ask,
|
|
188
|
+
`[]` when you did and the member has none, and populated otherwise.
|
|
177
189
|
|
|
178
190
|
## Reference
|
|
179
191
|
|
|
@@ -35,11 +35,12 @@ __all__ = [
|
|
|
35
35
|
DEFAULT_BASE_URL = "https://api.easydata.win/v1"
|
|
36
36
|
|
|
37
37
|
#: Every operation, as `attribute name -> path`. The client builds one method
|
|
38
|
-
#: per entry rather than defining
|
|
39
|
-
#: identical: one request shape, one response shape, and the
|
|
40
|
-
#: path. A new operation is a row here.
|
|
38
|
+
#: per entry rather than defining one near-identical method per operation,
|
|
39
|
+
#: because they ARE identical: one request shape, one response shape, and the
|
|
40
|
+
#: operation is the path. A new operation is a row here.
|
|
41
41
|
OPERATIONS: dict[str, str] = {
|
|
42
42
|
"profiles_enrich": "/profiles/enrich",
|
|
43
|
+
"profiles_enrich_detailed": "/profiles/enrich/detailed",
|
|
43
44
|
"profiles_activity": "/profiles/activity",
|
|
44
45
|
"profiles_posts": "/profiles/posts",
|
|
45
46
|
"profiles_comments": "/profiles/comments",
|
|
@@ -315,6 +316,11 @@ class EasyData:
|
|
|
315
316
|
max_results: int | None = None,
|
|
316
317
|
enrich: bool | None = None,
|
|
317
318
|
find_emails: bool | None = None,
|
|
319
|
+
include_counts: bool | None = None,
|
|
320
|
+
include_experience_detail: bool | None = None,
|
|
321
|
+
include_skill_details: bool | None = None,
|
|
322
|
+
include_interests: bool | None = None,
|
|
323
|
+
include_recommendations: bool | None = None,
|
|
318
324
|
include_results: bool | None = None,
|
|
319
325
|
idempotency_key: str | None = None,
|
|
320
326
|
) -> Batch:
|
|
@@ -322,6 +328,22 @@ class EasyData:
|
|
|
322
328
|
|
|
323
329
|
A batch of one is a batch. There is no separate single-target path and
|
|
324
330
|
no ceiling to discover between one target and fifty thousand.
|
|
331
|
+
|
|
332
|
+
With ``find_emails`` the addresses are looked up after the scraping, so
|
|
333
|
+
results carrying one arrive minutes later than results that do not. Each
|
|
334
|
+
entry still appears exactly once, complete, and the batch is not
|
|
335
|
+
``completed`` until every one has.
|
|
336
|
+
|
|
337
|
+
The five ``include_*`` flags are the optional sections of
|
|
338
|
+
``profiles_enrich_detailed`` and are refused with a 400 on anything
|
|
339
|
+
else. Each is one more request to LinkedIn and costs +0.5 per target,
|
|
340
|
+
charged only when the section actually answered; at least one of them
|
|
341
|
+
is required on that operation, because with none set it is
|
|
342
|
+
``profiles_enrich``, which returns the same record for less.
|
|
343
|
+
|
|
344
|
+
``skill_details``, ``interests`` and ``recommendations`` come back in
|
|
345
|
+
three states: absent when you did not ask, ``[]`` when you asked and
|
|
346
|
+
this member has none, and populated otherwise.
|
|
325
347
|
"""
|
|
326
348
|
if not targets:
|
|
327
349
|
raise ValueError("targets is empty: a batch needs at least one target")
|
|
@@ -329,7 +351,12 @@ class EasyData:
|
|
|
329
351
|
body: dict[str, Any] = {"targets": list(targets)}
|
|
330
352
|
_put(body, external_id=external_id, callback_url=callback_url,
|
|
331
353
|
webhook_tag=webhook_tag, max_results=max_results, enrich=enrich,
|
|
332
|
-
find_emails=find_emails,
|
|
354
|
+
find_emails=find_emails, include_counts=include_counts,
|
|
355
|
+
include_experience_detail=include_experience_detail,
|
|
356
|
+
include_skill_details=include_skill_details,
|
|
357
|
+
include_interests=include_interests,
|
|
358
|
+
include_recommendations=include_recommendations,
|
|
359
|
+
include_results=include_results)
|
|
333
360
|
|
|
334
361
|
data = self._request(
|
|
335
362
|
"POST", path, body=body,
|
|
@@ -347,6 +374,12 @@ class EasyData:
|
|
|
347
374
|
*,
|
|
348
375
|
external_id: str | None = None,
|
|
349
376
|
max_results: int | None = None,
|
|
377
|
+
find_emails: bool | None = None,
|
|
378
|
+
include_counts: bool | None = None,
|
|
379
|
+
include_experience_detail: bool | None = None,
|
|
380
|
+
include_skill_details: bool | None = None,
|
|
381
|
+
include_interests: bool | None = None,
|
|
382
|
+
include_recommendations: bool | None = None,
|
|
350
383
|
idempotency_key: str | None = None,
|
|
351
384
|
) -> SyncResult:
|
|
352
385
|
"""One entity, answered in this response, at twice the credits.
|
|
@@ -354,6 +387,12 @@ class EasyData:
|
|
|
354
387
|
`target`, singular - not a list of one. The bounds are refusals rather
|
|
355
388
|
than downgrades: no `enrich`, no webhooks, and one upstream page for a
|
|
356
389
|
paged operation.
|
|
390
|
+
|
|
391
|
+
The optional sections are allowed - a section is one bounded extra
|
|
392
|
+
request, which is what this path is for - and priced like everything
|
|
393
|
+
else here, at double: +1 each. So is ``find_emails`` for a profile, at
|
|
394
|
+
+8: one person is one bounded lookup. It is refused on a search, where
|
|
395
|
+
it would be one lookup per row inside a single HTTP request.
|
|
357
396
|
"""
|
|
358
397
|
if isinstance(target, (list, tuple, set)):
|
|
359
398
|
raise ValueError(
|
|
@@ -361,7 +400,12 @@ class EasyData:
|
|
|
361
400
|
)
|
|
362
401
|
|
|
363
402
|
body: dict[str, Any] = {"target": target}
|
|
364
|
-
_put(body, external_id=external_id, max_results=max_results
|
|
403
|
+
_put(body, external_id=external_id, max_results=max_results,
|
|
404
|
+
find_emails=find_emails, include_counts=include_counts,
|
|
405
|
+
include_experience_detail=include_experience_detail,
|
|
406
|
+
include_skill_details=include_skill_details,
|
|
407
|
+
include_interests=include_interests,
|
|
408
|
+
include_recommendations=include_recommendations)
|
|
365
409
|
|
|
366
410
|
data = self._request(
|
|
367
411
|
"POST", path + "/sync", body=body,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: easydata-api
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: Official Python client for the EasyData LinkedIn enrichment API
|
|
5
5
|
Author-email: EasyData Development <dev@easydata.win>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -191,10 +191,22 @@ ed.account() # allowance, ceilings, secre
|
|
|
191
191
|
ed.usage(from_="2026-09-01", to="2026-09-30") # spend by day and operation
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
-
Operations are attributes: `profiles_enrich`, `
|
|
195
|
-
`
|
|
196
|
-
`
|
|
197
|
-
`sales_search_companies`.
|
|
194
|
+
Operations are attributes: `profiles_enrich`, `profiles_enrich_detailed`,
|
|
195
|
+
`profiles_activity`, `profiles_posts`, `profiles_comments`,
|
|
196
|
+
`profiles_reactions`, `companies_enrich`, `posts_enrich`,
|
|
197
|
+
`sales_search_people`, `sales_search_employees`, `sales_search_companies`.
|
|
198
|
+
|
|
199
|
+
`profiles_enrich_detailed` is `profiles_enrich` plus the optional sections -
|
|
200
|
+
`include_counts=True` for follower and connection counts,
|
|
201
|
+
`include_experience_detail=True` for what each role actually says,
|
|
202
|
+
`include_skill_details=True` for endorsement counts, `include_interests=True`
|
|
203
|
+
for what the person follows, and `include_recommendations=True` for written
|
|
204
|
+
recommendations in both directions. Each is one more request to LinkedIn and
|
|
205
|
+
costs +0.5 per target, charged only when the section answered, and at least one
|
|
206
|
+
of them is required.
|
|
207
|
+
|
|
208
|
+
The three list sections come back in three states: absent when you did not ask,
|
|
209
|
+
`[]` when you did and the member has none, and populated otherwise.
|
|
198
210
|
|
|
199
211
|
## Reference
|
|
200
212
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|