aiondtech 2.2.0__tar.gz → 2.3.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.
- {aiondtech-2.2.0 → aiondtech-2.3.0}/PKG-INFO +165 -118
- {aiondtech-2.2.0 → aiondtech-2.3.0}/README.md +164 -117
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech/__init__.py +1 -1
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech/client.py +7 -6
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech.egg-info/PKG-INFO +165 -118
- {aiondtech-2.2.0 → aiondtech-2.3.0}/pyproject.toml +1 -1
- {aiondtech-2.2.0 → aiondtech-2.3.0}/LICENSE +0 -0
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech/models.py +0 -0
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech/py.typed +0 -0
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech.egg-info/SOURCES.txt +0 -0
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech.egg-info/dependency_links.txt +0 -0
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech.egg-info/requires.txt +0 -0
- {aiondtech-2.2.0 → aiondtech-2.3.0}/aiondtech.egg-info/top_level.txt +0 -0
- {aiondtech-2.2.0 → aiondtech-2.3.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aiondtech
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Official Python SDK for AiondTech Resume Analyser API
|
|
5
5
|
Author-email: AiondTech <support@aiondtech.com>
|
|
6
6
|
Maintainer-email: AiondTech <support@aiondtech.com>
|
|
@@ -92,16 +92,6 @@ Credit usage varies depending on resume size and complexity. Every response incl
|
|
|
92
92
|
| `credits.balance()` | 0 | Check credit balance |
|
|
93
93
|
| `credits.usage()` | 0 | View usage history |
|
|
94
94
|
|
|
95
|
-
**Tracking credits:**
|
|
96
|
-
|
|
97
|
-
```python
|
|
98
|
-
result = client.resumes.upload_and_analyze("resume.pdf")
|
|
99
|
-
print(f"This call used {result.credits_used} credits")
|
|
100
|
-
|
|
101
|
-
balance = client.credits.balance()
|
|
102
|
-
print(f"Remaining: {balance['remaining']}")
|
|
103
|
-
```
|
|
104
|
-
|
|
105
95
|
---
|
|
106
96
|
|
|
107
97
|
## Detailed Usage
|
|
@@ -112,15 +102,18 @@ Upload a PDF resume without parsing. Returns a `resume_id` for later use.
|
|
|
112
102
|
|
|
113
103
|
```python
|
|
114
104
|
result = client.resumes.upload("path/to/resume.pdf")
|
|
105
|
+
|
|
106
|
+
print(f"Resume ID: {result.resume_id}")
|
|
107
|
+
print(f"Message: {result.message}")
|
|
108
|
+
print(f"Credits Used: {result.credits_used}")
|
|
115
109
|
```
|
|
116
110
|
|
|
117
|
-
**
|
|
111
|
+
**Output:**
|
|
118
112
|
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
result._raw # dict — Full raw API response
|
|
113
|
+
```
|
|
114
|
+
Resume ID: 450
|
|
115
|
+
Message: Resume uploaded successfully
|
|
116
|
+
Credits Used: 1
|
|
124
117
|
```
|
|
125
118
|
|
|
126
119
|
---
|
|
@@ -131,25 +124,31 @@ Upload a PDF and immediately extract structured data (AI-powered parsing).
|
|
|
131
124
|
|
|
132
125
|
```python
|
|
133
126
|
result = client.resumes.upload_and_analyze("path/to/resume.pdf")
|
|
134
|
-
```
|
|
135
127
|
|
|
136
|
-
|
|
128
|
+
print(f"Resume ID: {result.resume_id}")
|
|
129
|
+
print(f"Full Name: {result.full_name}")
|
|
130
|
+
print(f"Email: {result.email}")
|
|
131
|
+
print(f"Skills: {result.skills}")
|
|
132
|
+
print(f"Job Titles: {result.job_titles}")
|
|
133
|
+
print(f"Total Experience: {result.total_experience}")
|
|
134
|
+
print(f"Credits Used: {result.credits_used}")
|
|
135
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
136
|
+
```
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
result.resume_id # int — Unique resume ID
|
|
140
|
-
result.parsed_data # dict — Full parsed data (see structure below)
|
|
141
|
-
result.credits_used # int — Credits consumed by this call
|
|
142
|
-
result._raw # dict — Full raw API response
|
|
138
|
+
**Output:**
|
|
143
139
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
140
|
+
```
|
|
141
|
+
Resume ID: 450
|
|
142
|
+
Full Name: John Doe
|
|
143
|
+
Email: john@example.com
|
|
144
|
+
Skills: ['Python', 'Django', 'AWS']
|
|
145
|
+
Job Titles: ['Senior Developer', 'Tech Lead']
|
|
146
|
+
Total Experience: 8 years
|
|
147
|
+
Credits Used: 5
|
|
148
|
+
Parsed Data: {'full_name': 'John Doe', 'email': 'john@example.com', ...}
|
|
150
149
|
```
|
|
151
150
|
|
|
152
|
-
|
|
151
|
+
**Full `parsed_data` structure:**
|
|
153
152
|
|
|
154
153
|
```python
|
|
155
154
|
{
|
|
@@ -175,20 +174,25 @@ result.total_experience # str | None
|
|
|
175
174
|
Upload a resume, parse it, and compare against a job posting in one call.
|
|
176
175
|
|
|
177
176
|
```python
|
|
178
|
-
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=
|
|
177
|
+
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=56)
|
|
178
|
+
|
|
179
|
+
print(f"Resume ID: {result.resume_id}")
|
|
180
|
+
print(f"Job ID: {result.job_id}")
|
|
181
|
+
print(f"Score: {result.comparison_score}")
|
|
182
|
+
print(f"Reason: {result.comparison_reason}")
|
|
183
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
184
|
+
print(f"Credits Used: {result.credits_used}")
|
|
179
185
|
```
|
|
180
186
|
|
|
181
|
-
**
|
|
187
|
+
**Output:**
|
|
182
188
|
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
result.credits_used # int — Credits consumed by this call
|
|
191
|
-
result._raw # dict — Full raw API response
|
|
189
|
+
```
|
|
190
|
+
Resume ID: 449
|
|
191
|
+
Job ID: 56
|
|
192
|
+
Score: 30
|
|
193
|
+
Reason: The candidate has a strong technical background...
|
|
194
|
+
Parsed Data: {'full_name': 'Salem O. Ba Atya', 'email': 'Baatyaso@gmail.com', ...}
|
|
195
|
+
Credits Used: 9
|
|
192
196
|
```
|
|
193
197
|
|
|
194
198
|
---
|
|
@@ -198,30 +202,43 @@ result._raw # dict — Full raw API response
|
|
|
198
202
|
Parse an already-uploaded resume by its ID.
|
|
199
203
|
|
|
200
204
|
```python
|
|
201
|
-
result = client.resumes.analyze(resume_id=
|
|
205
|
+
result = client.resumes.analyze(resume_id=444)
|
|
206
|
+
|
|
207
|
+
print(f"Resume ID: {result.resume_id}")
|
|
208
|
+
print(f"Partner: {result.partner}")
|
|
209
|
+
print(f"Full Name: {result.full_name}")
|
|
210
|
+
print(f"Email: {result.email}")
|
|
211
|
+
print(f"Phone: {result.phone}")
|
|
212
|
+
print(f"LinkedIn: {result.linkedin}")
|
|
213
|
+
print(f"Location: {result.location}")
|
|
214
|
+
print(f"Skills: {result.skills}")
|
|
215
|
+
print(f"Job Titles: {result.job_titles}")
|
|
216
|
+
print(f"Companies: {result.companies}")
|
|
217
|
+
print(f"Education: {result.education}")
|
|
218
|
+
print(f"Total Experience: {result.total_experience}")
|
|
219
|
+
print(f"Certifications: {result.certifications}")
|
|
220
|
+
print(f"Credits Used: {result.credits_used}")
|
|
221
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
202
222
|
```
|
|
203
223
|
|
|
204
|
-
**
|
|
224
|
+
**Output:**
|
|
205
225
|
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
result.education # list[str]
|
|
223
|
-
result.total_experience # str | None
|
|
224
|
-
result.certifications # list[str]
|
|
226
|
+
```
|
|
227
|
+
Resume ID: 444
|
|
228
|
+
Partner: your-partner-id
|
|
229
|
+
Full Name: John Doe
|
|
230
|
+
Email: john@example.com
|
|
231
|
+
Phone: +1234567890
|
|
232
|
+
LinkedIn: linkedin.com/in/johndoe
|
|
233
|
+
Location: New York, NY
|
|
234
|
+
Skills: ['Python', 'Django', 'AWS']
|
|
235
|
+
Job Titles: ['Senior Developer', 'Tech Lead']
|
|
236
|
+
Companies: ['Google', 'Meta']
|
|
237
|
+
Education: ['BSc Computer Science - MIT']
|
|
238
|
+
Total Experience: 8 years
|
|
239
|
+
Certifications: ['AWS Certified Solutions Architect']
|
|
240
|
+
Credits Used: 3
|
|
241
|
+
Parsed Data: {'full_name': 'John Doe', ...}
|
|
225
242
|
```
|
|
226
243
|
|
|
227
244
|
---
|
|
@@ -235,18 +252,24 @@ job = client.jobs.create(
|
|
|
235
252
|
title="Senior Python Developer",
|
|
236
253
|
description="We are looking for an experienced Python developer..."
|
|
237
254
|
)
|
|
255
|
+
|
|
256
|
+
print(f"Job ID: {job.job_id}")
|
|
257
|
+
print(f"Title: {job.title}")
|
|
258
|
+
print(f"Description: {job.description}")
|
|
259
|
+
print(f"Created By: {job.created_by}")
|
|
260
|
+
print(f"Created At: {job.created_at}")
|
|
261
|
+
print(f"Credits Used: {job.credits_used}")
|
|
238
262
|
```
|
|
239
263
|
|
|
240
|
-
**
|
|
264
|
+
**Output:**
|
|
241
265
|
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
job._raw # dict — Full raw API response
|
|
266
|
+
```
|
|
267
|
+
Job ID: 57
|
|
268
|
+
Title: Senior Python Developer
|
|
269
|
+
Description: We are looking for an experienced Python developer...
|
|
270
|
+
Created By: your-partner-id
|
|
271
|
+
Created At: 2026-02-06T10:30:00Z
|
|
272
|
+
Credits Used: 1
|
|
250
273
|
```
|
|
251
274
|
|
|
252
275
|
---
|
|
@@ -256,18 +279,25 @@ job._raw # dict — Full raw API response
|
|
|
256
279
|
Compare an existing resume against an existing job posting.
|
|
257
280
|
|
|
258
281
|
```python
|
|
259
|
-
result = client.resumes.compare_resumes(resume_id=
|
|
282
|
+
result = client.resumes.compare_resumes(resume_id=445, job_id=56)
|
|
283
|
+
|
|
284
|
+
print(f"Resume ID: {result.resume_id}")
|
|
285
|
+
print(f"Job ID: {result.job_id}")
|
|
286
|
+
print(f"Score: {result.comparison_score}")
|
|
287
|
+
print(f"Reason: {result.comparison_reason}")
|
|
288
|
+
print(f"Language: {result.language}")
|
|
289
|
+
print(f"Credits Used: {result.credits_used}")
|
|
260
290
|
```
|
|
261
291
|
|
|
262
|
-
**
|
|
292
|
+
**Output:**
|
|
263
293
|
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
294
|
+
```
|
|
295
|
+
Resume ID: 445
|
|
296
|
+
Job ID: 56
|
|
297
|
+
Score: 75
|
|
298
|
+
Reason: The candidate demonstrates strong alignment with the role requirements...
|
|
299
|
+
Language: en
|
|
300
|
+
Credits Used: 5
|
|
271
301
|
```
|
|
272
302
|
|
|
273
303
|
---
|
|
@@ -278,23 +308,28 @@ List all uploaded resumes with pagination.
|
|
|
278
308
|
|
|
279
309
|
```python
|
|
280
310
|
result = client.resumes.list(page=1, limit=50)
|
|
281
|
-
```
|
|
282
311
|
|
|
283
|
-
|
|
312
|
+
print(f"Total: {result.total}")
|
|
313
|
+
print(f"Page: {result.page}")
|
|
314
|
+
print(f"Limit: {result.limit}")
|
|
315
|
+
print(f"Has More: {result.has_more}")
|
|
316
|
+
print(f"Count: {len(result)}")
|
|
284
317
|
|
|
285
|
-
```python
|
|
286
|
-
result.resumes # list[dict] — List of resume objects
|
|
287
|
-
result.total # int — Total number of resumes
|
|
288
|
-
result.page # int — Current page
|
|
289
|
-
result.limit # int — Items per page
|
|
290
|
-
result.has_more # bool — Whether more pages exist
|
|
291
|
-
result._raw # dict — Full raw API response
|
|
292
|
-
|
|
293
|
-
# Iterable
|
|
294
318
|
for resume in result:
|
|
295
|
-
print(resume[
|
|
319
|
+
print(f" ID: {resume['id']}, Name: {resume.get('full_name')}, File: {resume.get('filename')}")
|
|
320
|
+
```
|
|
296
321
|
|
|
297
|
-
|
|
322
|
+
**Output:**
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
Total: 120
|
|
326
|
+
Page: 1
|
|
327
|
+
Limit: 50
|
|
328
|
+
Has More: True
|
|
329
|
+
Count: 50
|
|
330
|
+
ID: 450, Name: John Doe, File: resume.pdf
|
|
331
|
+
ID: 449, Name: Salem O. Ba Atya, File: Salem_20220524.pdf
|
|
332
|
+
...
|
|
298
333
|
```
|
|
299
334
|
|
|
300
335
|
---
|
|
@@ -305,21 +340,28 @@ List all job postings with pagination.
|
|
|
305
340
|
|
|
306
341
|
```python
|
|
307
342
|
result = client.jobs.list(page=1, limit=50)
|
|
308
|
-
```
|
|
309
343
|
|
|
310
|
-
|
|
344
|
+
print(f"Total: {result.total}")
|
|
345
|
+
print(f"Page: {result.page}")
|
|
346
|
+
print(f"Limit: {result.limit}")
|
|
347
|
+
print(f"Has More: {result.has_more}")
|
|
348
|
+
print(f"Count: {len(result)}")
|
|
311
349
|
|
|
312
|
-
```python
|
|
313
|
-
result.jobs # list[dict] — List of job objects
|
|
314
|
-
result.total # int — Total number of jobs
|
|
315
|
-
result.page # int — Current page
|
|
316
|
-
result.limit # int — Items per page
|
|
317
|
-
result.has_more # bool — Whether more pages exist
|
|
318
|
-
result._raw # dict — Full raw API response
|
|
319
|
-
|
|
320
|
-
# Iterable
|
|
321
350
|
for job in result:
|
|
322
|
-
print(job[
|
|
351
|
+
print(f" ID: {job['id']}, Title: {job['title']}")
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Output:**
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
Total: 10
|
|
358
|
+
Page: 1
|
|
359
|
+
Limit: 50
|
|
360
|
+
Has More: False
|
|
361
|
+
Count: 10
|
|
362
|
+
ID: 56, Title: Senior Python Developer
|
|
363
|
+
ID: 55, Title: Data Scientist
|
|
364
|
+
...
|
|
323
365
|
```
|
|
324
366
|
|
|
325
367
|
---
|
|
@@ -328,18 +370,22 @@ for job in result:
|
|
|
328
370
|
|
|
329
371
|
```python
|
|
330
372
|
balance = client.credits.balance()
|
|
373
|
+
|
|
374
|
+
print(f"Total: {balance.get('total')}")
|
|
375
|
+
print(f"Used This Month: {balance.get('used_mtd')}")
|
|
376
|
+
print(f"Remaining: {balance.get('remaining')}")
|
|
377
|
+
print(f"Plan: {balance.get('plan_name')}")
|
|
378
|
+
print(f"Resets At: {balance.get('resets_at')}")
|
|
331
379
|
```
|
|
332
380
|
|
|
333
|
-
**
|
|
381
|
+
**Output:**
|
|
334
382
|
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
"resets_at": "2026-03-01T00:00:00Z"
|
|
342
|
-
}
|
|
383
|
+
```
|
|
384
|
+
Total: 1000
|
|
385
|
+
Used This Month: 150
|
|
386
|
+
Remaining: 850
|
|
387
|
+
Plan: Professional
|
|
388
|
+
Resets At: 2026-03-01T00:00:00Z
|
|
343
389
|
```
|
|
344
390
|
|
|
345
391
|
---
|
|
@@ -348,8 +394,11 @@ balance = client.credits.balance()
|
|
|
348
394
|
|
|
349
395
|
```python
|
|
350
396
|
usage = client.credits.usage()
|
|
397
|
+
print(usage)
|
|
398
|
+
|
|
351
399
|
# Or with date filters
|
|
352
400
|
usage = client.credits.usage(start_date="2026-01-01", end_date="2026-01-31")
|
|
401
|
+
print(usage)
|
|
353
402
|
```
|
|
354
403
|
|
|
355
404
|
---
|
|
@@ -401,8 +450,7 @@ job = client.jobs.create(
|
|
|
401
450
|
title="Senior Python Developer",
|
|
402
451
|
description="5+ years Python, Django, AWS, PostgreSQL required..."
|
|
403
452
|
)
|
|
404
|
-
print(f"Created job #{job.job_id}: {job.title}")
|
|
405
|
-
print(f"Credits used: {job.credits_used}")
|
|
453
|
+
print(f"Created job #{job.job_id}: {job.title} ({job.credits_used} credits)")
|
|
406
454
|
|
|
407
455
|
# Step 2: Upload and analyze a resume
|
|
408
456
|
analysis = client.resumes.upload_and_analyze("candidate_resume.pdf")
|
|
@@ -417,7 +465,6 @@ comparison = client.resumes.compare_resumes(
|
|
|
417
465
|
job_id=job.job_id
|
|
418
466
|
)
|
|
419
467
|
print(f"Score: {comparison.comparison_score}%")
|
|
420
|
-
print(f"Language: {comparison.language}")
|
|
421
468
|
print(f"Reasoning: {comparison.comparison_reason}")
|
|
422
469
|
print(f"Credits used: {comparison.credits_used}")
|
|
423
470
|
|
|
@@ -56,16 +56,6 @@ Credit usage varies depending on resume size and complexity. Every response incl
|
|
|
56
56
|
| `credits.balance()` | 0 | Check credit balance |
|
|
57
57
|
| `credits.usage()` | 0 | View usage history |
|
|
58
58
|
|
|
59
|
-
**Tracking credits:**
|
|
60
|
-
|
|
61
|
-
```python
|
|
62
|
-
result = client.resumes.upload_and_analyze("resume.pdf")
|
|
63
|
-
print(f"This call used {result.credits_used} credits")
|
|
64
|
-
|
|
65
|
-
balance = client.credits.balance()
|
|
66
|
-
print(f"Remaining: {balance['remaining']}")
|
|
67
|
-
```
|
|
68
|
-
|
|
69
59
|
---
|
|
70
60
|
|
|
71
61
|
## Detailed Usage
|
|
@@ -76,15 +66,18 @@ Upload a PDF resume without parsing. Returns a `resume_id` for later use.
|
|
|
76
66
|
|
|
77
67
|
```python
|
|
78
68
|
result = client.resumes.upload("path/to/resume.pdf")
|
|
69
|
+
|
|
70
|
+
print(f"Resume ID: {result.resume_id}")
|
|
71
|
+
print(f"Message: {result.message}")
|
|
72
|
+
print(f"Credits Used: {result.credits_used}")
|
|
79
73
|
```
|
|
80
74
|
|
|
81
|
-
**
|
|
75
|
+
**Output:**
|
|
82
76
|
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
result._raw # dict — Full raw API response
|
|
77
|
+
```
|
|
78
|
+
Resume ID: 450
|
|
79
|
+
Message: Resume uploaded successfully
|
|
80
|
+
Credits Used: 1
|
|
88
81
|
```
|
|
89
82
|
|
|
90
83
|
---
|
|
@@ -95,25 +88,31 @@ Upload a PDF and immediately extract structured data (AI-powered parsing).
|
|
|
95
88
|
|
|
96
89
|
```python
|
|
97
90
|
result = client.resumes.upload_and_analyze("path/to/resume.pdf")
|
|
98
|
-
```
|
|
99
91
|
|
|
100
|
-
|
|
92
|
+
print(f"Resume ID: {result.resume_id}")
|
|
93
|
+
print(f"Full Name: {result.full_name}")
|
|
94
|
+
print(f"Email: {result.email}")
|
|
95
|
+
print(f"Skills: {result.skills}")
|
|
96
|
+
print(f"Job Titles: {result.job_titles}")
|
|
97
|
+
print(f"Total Experience: {result.total_experience}")
|
|
98
|
+
print(f"Credits Used: {result.credits_used}")
|
|
99
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
100
|
+
```
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
result.resume_id # int — Unique resume ID
|
|
104
|
-
result.parsed_data # dict — Full parsed data (see structure below)
|
|
105
|
-
result.credits_used # int — Credits consumed by this call
|
|
106
|
-
result._raw # dict — Full raw API response
|
|
102
|
+
**Output:**
|
|
107
103
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
104
|
+
```
|
|
105
|
+
Resume ID: 450
|
|
106
|
+
Full Name: John Doe
|
|
107
|
+
Email: john@example.com
|
|
108
|
+
Skills: ['Python', 'Django', 'AWS']
|
|
109
|
+
Job Titles: ['Senior Developer', 'Tech Lead']
|
|
110
|
+
Total Experience: 8 years
|
|
111
|
+
Credits Used: 5
|
|
112
|
+
Parsed Data: {'full_name': 'John Doe', 'email': 'john@example.com', ...}
|
|
114
113
|
```
|
|
115
114
|
|
|
116
|
-
|
|
115
|
+
**Full `parsed_data` structure:**
|
|
117
116
|
|
|
118
117
|
```python
|
|
119
118
|
{
|
|
@@ -139,20 +138,25 @@ result.total_experience # str | None
|
|
|
139
138
|
Upload a resume, parse it, and compare against a job posting in one call.
|
|
140
139
|
|
|
141
140
|
```python
|
|
142
|
-
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=
|
|
141
|
+
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=56)
|
|
142
|
+
|
|
143
|
+
print(f"Resume ID: {result.resume_id}")
|
|
144
|
+
print(f"Job ID: {result.job_id}")
|
|
145
|
+
print(f"Score: {result.comparison_score}")
|
|
146
|
+
print(f"Reason: {result.comparison_reason}")
|
|
147
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
148
|
+
print(f"Credits Used: {result.credits_used}")
|
|
143
149
|
```
|
|
144
150
|
|
|
145
|
-
**
|
|
151
|
+
**Output:**
|
|
146
152
|
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
result.credits_used # int — Credits consumed by this call
|
|
155
|
-
result._raw # dict — Full raw API response
|
|
153
|
+
```
|
|
154
|
+
Resume ID: 449
|
|
155
|
+
Job ID: 56
|
|
156
|
+
Score: 30
|
|
157
|
+
Reason: The candidate has a strong technical background...
|
|
158
|
+
Parsed Data: {'full_name': 'Salem O. Ba Atya', 'email': 'Baatyaso@gmail.com', ...}
|
|
159
|
+
Credits Used: 9
|
|
156
160
|
```
|
|
157
161
|
|
|
158
162
|
---
|
|
@@ -162,30 +166,43 @@ result._raw # dict — Full raw API response
|
|
|
162
166
|
Parse an already-uploaded resume by its ID.
|
|
163
167
|
|
|
164
168
|
```python
|
|
165
|
-
result = client.resumes.analyze(resume_id=
|
|
169
|
+
result = client.resumes.analyze(resume_id=444)
|
|
170
|
+
|
|
171
|
+
print(f"Resume ID: {result.resume_id}")
|
|
172
|
+
print(f"Partner: {result.partner}")
|
|
173
|
+
print(f"Full Name: {result.full_name}")
|
|
174
|
+
print(f"Email: {result.email}")
|
|
175
|
+
print(f"Phone: {result.phone}")
|
|
176
|
+
print(f"LinkedIn: {result.linkedin}")
|
|
177
|
+
print(f"Location: {result.location}")
|
|
178
|
+
print(f"Skills: {result.skills}")
|
|
179
|
+
print(f"Job Titles: {result.job_titles}")
|
|
180
|
+
print(f"Companies: {result.companies}")
|
|
181
|
+
print(f"Education: {result.education}")
|
|
182
|
+
print(f"Total Experience: {result.total_experience}")
|
|
183
|
+
print(f"Certifications: {result.certifications}")
|
|
184
|
+
print(f"Credits Used: {result.credits_used}")
|
|
185
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
166
186
|
```
|
|
167
187
|
|
|
168
|
-
**
|
|
188
|
+
**Output:**
|
|
169
189
|
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
result.education # list[str]
|
|
187
|
-
result.total_experience # str | None
|
|
188
|
-
result.certifications # list[str]
|
|
190
|
+
```
|
|
191
|
+
Resume ID: 444
|
|
192
|
+
Partner: your-partner-id
|
|
193
|
+
Full Name: John Doe
|
|
194
|
+
Email: john@example.com
|
|
195
|
+
Phone: +1234567890
|
|
196
|
+
LinkedIn: linkedin.com/in/johndoe
|
|
197
|
+
Location: New York, NY
|
|
198
|
+
Skills: ['Python', 'Django', 'AWS']
|
|
199
|
+
Job Titles: ['Senior Developer', 'Tech Lead']
|
|
200
|
+
Companies: ['Google', 'Meta']
|
|
201
|
+
Education: ['BSc Computer Science - MIT']
|
|
202
|
+
Total Experience: 8 years
|
|
203
|
+
Certifications: ['AWS Certified Solutions Architect']
|
|
204
|
+
Credits Used: 3
|
|
205
|
+
Parsed Data: {'full_name': 'John Doe', ...}
|
|
189
206
|
```
|
|
190
207
|
|
|
191
208
|
---
|
|
@@ -199,18 +216,24 @@ job = client.jobs.create(
|
|
|
199
216
|
title="Senior Python Developer",
|
|
200
217
|
description="We are looking for an experienced Python developer..."
|
|
201
218
|
)
|
|
219
|
+
|
|
220
|
+
print(f"Job ID: {job.job_id}")
|
|
221
|
+
print(f"Title: {job.title}")
|
|
222
|
+
print(f"Description: {job.description}")
|
|
223
|
+
print(f"Created By: {job.created_by}")
|
|
224
|
+
print(f"Created At: {job.created_at}")
|
|
225
|
+
print(f"Credits Used: {job.credits_used}")
|
|
202
226
|
```
|
|
203
227
|
|
|
204
|
-
**
|
|
228
|
+
**Output:**
|
|
205
229
|
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
job._raw # dict — Full raw API response
|
|
230
|
+
```
|
|
231
|
+
Job ID: 57
|
|
232
|
+
Title: Senior Python Developer
|
|
233
|
+
Description: We are looking for an experienced Python developer...
|
|
234
|
+
Created By: your-partner-id
|
|
235
|
+
Created At: 2026-02-06T10:30:00Z
|
|
236
|
+
Credits Used: 1
|
|
214
237
|
```
|
|
215
238
|
|
|
216
239
|
---
|
|
@@ -220,18 +243,25 @@ job._raw # dict — Full raw API response
|
|
|
220
243
|
Compare an existing resume against an existing job posting.
|
|
221
244
|
|
|
222
245
|
```python
|
|
223
|
-
result = client.resumes.compare_resumes(resume_id=
|
|
246
|
+
result = client.resumes.compare_resumes(resume_id=445, job_id=56)
|
|
247
|
+
|
|
248
|
+
print(f"Resume ID: {result.resume_id}")
|
|
249
|
+
print(f"Job ID: {result.job_id}")
|
|
250
|
+
print(f"Score: {result.comparison_score}")
|
|
251
|
+
print(f"Reason: {result.comparison_reason}")
|
|
252
|
+
print(f"Language: {result.language}")
|
|
253
|
+
print(f"Credits Used: {result.credits_used}")
|
|
224
254
|
```
|
|
225
255
|
|
|
226
|
-
**
|
|
256
|
+
**Output:**
|
|
227
257
|
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
258
|
+
```
|
|
259
|
+
Resume ID: 445
|
|
260
|
+
Job ID: 56
|
|
261
|
+
Score: 75
|
|
262
|
+
Reason: The candidate demonstrates strong alignment with the role requirements...
|
|
263
|
+
Language: en
|
|
264
|
+
Credits Used: 5
|
|
235
265
|
```
|
|
236
266
|
|
|
237
267
|
---
|
|
@@ -242,23 +272,28 @@ List all uploaded resumes with pagination.
|
|
|
242
272
|
|
|
243
273
|
```python
|
|
244
274
|
result = client.resumes.list(page=1, limit=50)
|
|
245
|
-
```
|
|
246
275
|
|
|
247
|
-
|
|
276
|
+
print(f"Total: {result.total}")
|
|
277
|
+
print(f"Page: {result.page}")
|
|
278
|
+
print(f"Limit: {result.limit}")
|
|
279
|
+
print(f"Has More: {result.has_more}")
|
|
280
|
+
print(f"Count: {len(result)}")
|
|
248
281
|
|
|
249
|
-
```python
|
|
250
|
-
result.resumes # list[dict] — List of resume objects
|
|
251
|
-
result.total # int — Total number of resumes
|
|
252
|
-
result.page # int — Current page
|
|
253
|
-
result.limit # int — Items per page
|
|
254
|
-
result.has_more # bool — Whether more pages exist
|
|
255
|
-
result._raw # dict — Full raw API response
|
|
256
|
-
|
|
257
|
-
# Iterable
|
|
258
282
|
for resume in result:
|
|
259
|
-
print(resume[
|
|
283
|
+
print(f" ID: {resume['id']}, Name: {resume.get('full_name')}, File: {resume.get('filename')}")
|
|
284
|
+
```
|
|
260
285
|
|
|
261
|
-
|
|
286
|
+
**Output:**
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
Total: 120
|
|
290
|
+
Page: 1
|
|
291
|
+
Limit: 50
|
|
292
|
+
Has More: True
|
|
293
|
+
Count: 50
|
|
294
|
+
ID: 450, Name: John Doe, File: resume.pdf
|
|
295
|
+
ID: 449, Name: Salem O. Ba Atya, File: Salem_20220524.pdf
|
|
296
|
+
...
|
|
262
297
|
```
|
|
263
298
|
|
|
264
299
|
---
|
|
@@ -269,21 +304,28 @@ List all job postings with pagination.
|
|
|
269
304
|
|
|
270
305
|
```python
|
|
271
306
|
result = client.jobs.list(page=1, limit=50)
|
|
272
|
-
```
|
|
273
307
|
|
|
274
|
-
|
|
308
|
+
print(f"Total: {result.total}")
|
|
309
|
+
print(f"Page: {result.page}")
|
|
310
|
+
print(f"Limit: {result.limit}")
|
|
311
|
+
print(f"Has More: {result.has_more}")
|
|
312
|
+
print(f"Count: {len(result)}")
|
|
275
313
|
|
|
276
|
-
```python
|
|
277
|
-
result.jobs # list[dict] — List of job objects
|
|
278
|
-
result.total # int — Total number of jobs
|
|
279
|
-
result.page # int — Current page
|
|
280
|
-
result.limit # int — Items per page
|
|
281
|
-
result.has_more # bool — Whether more pages exist
|
|
282
|
-
result._raw # dict — Full raw API response
|
|
283
|
-
|
|
284
|
-
# Iterable
|
|
285
314
|
for job in result:
|
|
286
|
-
print(job[
|
|
315
|
+
print(f" ID: {job['id']}, Title: {job['title']}")
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Output:**
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
Total: 10
|
|
322
|
+
Page: 1
|
|
323
|
+
Limit: 50
|
|
324
|
+
Has More: False
|
|
325
|
+
Count: 10
|
|
326
|
+
ID: 56, Title: Senior Python Developer
|
|
327
|
+
ID: 55, Title: Data Scientist
|
|
328
|
+
...
|
|
287
329
|
```
|
|
288
330
|
|
|
289
331
|
---
|
|
@@ -292,18 +334,22 @@ for job in result:
|
|
|
292
334
|
|
|
293
335
|
```python
|
|
294
336
|
balance = client.credits.balance()
|
|
337
|
+
|
|
338
|
+
print(f"Total: {balance.get('total')}")
|
|
339
|
+
print(f"Used This Month: {balance.get('used_mtd')}")
|
|
340
|
+
print(f"Remaining: {balance.get('remaining')}")
|
|
341
|
+
print(f"Plan: {balance.get('plan_name')}")
|
|
342
|
+
print(f"Resets At: {balance.get('resets_at')}")
|
|
295
343
|
```
|
|
296
344
|
|
|
297
|
-
**
|
|
345
|
+
**Output:**
|
|
298
346
|
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
"resets_at": "2026-03-01T00:00:00Z"
|
|
306
|
-
}
|
|
347
|
+
```
|
|
348
|
+
Total: 1000
|
|
349
|
+
Used This Month: 150
|
|
350
|
+
Remaining: 850
|
|
351
|
+
Plan: Professional
|
|
352
|
+
Resets At: 2026-03-01T00:00:00Z
|
|
307
353
|
```
|
|
308
354
|
|
|
309
355
|
---
|
|
@@ -312,8 +358,11 @@ balance = client.credits.balance()
|
|
|
312
358
|
|
|
313
359
|
```python
|
|
314
360
|
usage = client.credits.usage()
|
|
361
|
+
print(usage)
|
|
362
|
+
|
|
315
363
|
# Or with date filters
|
|
316
364
|
usage = client.credits.usage(start_date="2026-01-01", end_date="2026-01-31")
|
|
365
|
+
print(usage)
|
|
317
366
|
```
|
|
318
367
|
|
|
319
368
|
---
|
|
@@ -365,8 +414,7 @@ job = client.jobs.create(
|
|
|
365
414
|
title="Senior Python Developer",
|
|
366
415
|
description="5+ years Python, Django, AWS, PostgreSQL required..."
|
|
367
416
|
)
|
|
368
|
-
print(f"Created job #{job.job_id}: {job.title}")
|
|
369
|
-
print(f"Credits used: {job.credits_used}")
|
|
417
|
+
print(f"Created job #{job.job_id}: {job.title} ({job.credits_used} credits)")
|
|
370
418
|
|
|
371
419
|
# Step 2: Upload and analyze a resume
|
|
372
420
|
analysis = client.resumes.upload_and_analyze("candidate_resume.pdf")
|
|
@@ -381,7 +429,6 @@ comparison = client.resumes.compare_resumes(
|
|
|
381
429
|
job_id=job.job_id
|
|
382
430
|
)
|
|
383
431
|
print(f"Score: {comparison.comparison_score}%")
|
|
384
|
-
print(f"Language: {comparison.language}")
|
|
385
432
|
print(f"Reasoning: {comparison.comparison_reason}")
|
|
386
433
|
print(f"Credits used: {comparison.credits_used}")
|
|
387
434
|
|
|
@@ -62,7 +62,7 @@ class HTTPClient:
|
|
|
62
62
|
self.session = requests.Session()
|
|
63
63
|
self.session.headers.update({
|
|
64
64
|
"Accept": "application/json",
|
|
65
|
-
"User-Agent": "aiondtech-python/2.
|
|
65
|
+
"User-Agent": "aiondtech-python/2.3.0",
|
|
66
66
|
"X-API-Key": api_key,
|
|
67
67
|
})
|
|
68
68
|
|
|
@@ -299,10 +299,11 @@ class Resumes:
|
|
|
299
299
|
print(f"Name: {parsed.full_name}")
|
|
300
300
|
print(f"Skills: {parsed.skills}")
|
|
301
301
|
"""
|
|
302
|
+
form_data = {"resume_id": str(resume_id)}
|
|
302
303
|
data = self._client.request(
|
|
303
304
|
"POST",
|
|
304
305
|
"/external/analyze-resume-by-id",
|
|
305
|
-
|
|
306
|
+
data=form_data
|
|
306
307
|
)
|
|
307
308
|
return ParsedResumeResult.from_response(data)
|
|
308
309
|
|
|
@@ -358,14 +359,14 @@ class Resumes:
|
|
|
358
359
|
print(f"Reasoning: {result.comparison_reason}")
|
|
359
360
|
print(f"Language: {result.language}")
|
|
360
361
|
"""
|
|
361
|
-
|
|
362
|
-
"resume_id": resume_id,
|
|
363
|
-
"job_id": job_id
|
|
362
|
+
form_data = {
|
|
363
|
+
"resume_id": str(resume_id),
|
|
364
|
+
"job_id": str(job_id)
|
|
364
365
|
}
|
|
365
366
|
data = self._client.request(
|
|
366
367
|
"POST",
|
|
367
368
|
"/external/compare-resumes",
|
|
368
|
-
|
|
369
|
+
data=form_data
|
|
369
370
|
)
|
|
370
371
|
return ResumeComparisonResult.from_response(data)
|
|
371
372
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aiondtech
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Official Python SDK for AiondTech Resume Analyser API
|
|
5
5
|
Author-email: AiondTech <support@aiondtech.com>
|
|
6
6
|
Maintainer-email: AiondTech <support@aiondtech.com>
|
|
@@ -92,16 +92,6 @@ Credit usage varies depending on resume size and complexity. Every response incl
|
|
|
92
92
|
| `credits.balance()` | 0 | Check credit balance |
|
|
93
93
|
| `credits.usage()` | 0 | View usage history |
|
|
94
94
|
|
|
95
|
-
**Tracking credits:**
|
|
96
|
-
|
|
97
|
-
```python
|
|
98
|
-
result = client.resumes.upload_and_analyze("resume.pdf")
|
|
99
|
-
print(f"This call used {result.credits_used} credits")
|
|
100
|
-
|
|
101
|
-
balance = client.credits.balance()
|
|
102
|
-
print(f"Remaining: {balance['remaining']}")
|
|
103
|
-
```
|
|
104
|
-
|
|
105
95
|
---
|
|
106
96
|
|
|
107
97
|
## Detailed Usage
|
|
@@ -112,15 +102,18 @@ Upload a PDF resume without parsing. Returns a `resume_id` for later use.
|
|
|
112
102
|
|
|
113
103
|
```python
|
|
114
104
|
result = client.resumes.upload("path/to/resume.pdf")
|
|
105
|
+
|
|
106
|
+
print(f"Resume ID: {result.resume_id}")
|
|
107
|
+
print(f"Message: {result.message}")
|
|
108
|
+
print(f"Credits Used: {result.credits_used}")
|
|
115
109
|
```
|
|
116
110
|
|
|
117
|
-
**
|
|
111
|
+
**Output:**
|
|
118
112
|
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
result._raw # dict — Full raw API response
|
|
113
|
+
```
|
|
114
|
+
Resume ID: 450
|
|
115
|
+
Message: Resume uploaded successfully
|
|
116
|
+
Credits Used: 1
|
|
124
117
|
```
|
|
125
118
|
|
|
126
119
|
---
|
|
@@ -131,25 +124,31 @@ Upload a PDF and immediately extract structured data (AI-powered parsing).
|
|
|
131
124
|
|
|
132
125
|
```python
|
|
133
126
|
result = client.resumes.upload_and_analyze("path/to/resume.pdf")
|
|
134
|
-
```
|
|
135
127
|
|
|
136
|
-
|
|
128
|
+
print(f"Resume ID: {result.resume_id}")
|
|
129
|
+
print(f"Full Name: {result.full_name}")
|
|
130
|
+
print(f"Email: {result.email}")
|
|
131
|
+
print(f"Skills: {result.skills}")
|
|
132
|
+
print(f"Job Titles: {result.job_titles}")
|
|
133
|
+
print(f"Total Experience: {result.total_experience}")
|
|
134
|
+
print(f"Credits Used: {result.credits_used}")
|
|
135
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
136
|
+
```
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
result.resume_id # int — Unique resume ID
|
|
140
|
-
result.parsed_data # dict — Full parsed data (see structure below)
|
|
141
|
-
result.credits_used # int — Credits consumed by this call
|
|
142
|
-
result._raw # dict — Full raw API response
|
|
138
|
+
**Output:**
|
|
143
139
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
140
|
+
```
|
|
141
|
+
Resume ID: 450
|
|
142
|
+
Full Name: John Doe
|
|
143
|
+
Email: john@example.com
|
|
144
|
+
Skills: ['Python', 'Django', 'AWS']
|
|
145
|
+
Job Titles: ['Senior Developer', 'Tech Lead']
|
|
146
|
+
Total Experience: 8 years
|
|
147
|
+
Credits Used: 5
|
|
148
|
+
Parsed Data: {'full_name': 'John Doe', 'email': 'john@example.com', ...}
|
|
150
149
|
```
|
|
151
150
|
|
|
152
|
-
|
|
151
|
+
**Full `parsed_data` structure:**
|
|
153
152
|
|
|
154
153
|
```python
|
|
155
154
|
{
|
|
@@ -175,20 +174,25 @@ result.total_experience # str | None
|
|
|
175
174
|
Upload a resume, parse it, and compare against a job posting in one call.
|
|
176
175
|
|
|
177
176
|
```python
|
|
178
|
-
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=
|
|
177
|
+
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=56)
|
|
178
|
+
|
|
179
|
+
print(f"Resume ID: {result.resume_id}")
|
|
180
|
+
print(f"Job ID: {result.job_id}")
|
|
181
|
+
print(f"Score: {result.comparison_score}")
|
|
182
|
+
print(f"Reason: {result.comparison_reason}")
|
|
183
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
184
|
+
print(f"Credits Used: {result.credits_used}")
|
|
179
185
|
```
|
|
180
186
|
|
|
181
|
-
**
|
|
187
|
+
**Output:**
|
|
182
188
|
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
result.credits_used # int — Credits consumed by this call
|
|
191
|
-
result._raw # dict — Full raw API response
|
|
189
|
+
```
|
|
190
|
+
Resume ID: 449
|
|
191
|
+
Job ID: 56
|
|
192
|
+
Score: 30
|
|
193
|
+
Reason: The candidate has a strong technical background...
|
|
194
|
+
Parsed Data: {'full_name': 'Salem O. Ba Atya', 'email': 'Baatyaso@gmail.com', ...}
|
|
195
|
+
Credits Used: 9
|
|
192
196
|
```
|
|
193
197
|
|
|
194
198
|
---
|
|
@@ -198,30 +202,43 @@ result._raw # dict — Full raw API response
|
|
|
198
202
|
Parse an already-uploaded resume by its ID.
|
|
199
203
|
|
|
200
204
|
```python
|
|
201
|
-
result = client.resumes.analyze(resume_id=
|
|
205
|
+
result = client.resumes.analyze(resume_id=444)
|
|
206
|
+
|
|
207
|
+
print(f"Resume ID: {result.resume_id}")
|
|
208
|
+
print(f"Partner: {result.partner}")
|
|
209
|
+
print(f"Full Name: {result.full_name}")
|
|
210
|
+
print(f"Email: {result.email}")
|
|
211
|
+
print(f"Phone: {result.phone}")
|
|
212
|
+
print(f"LinkedIn: {result.linkedin}")
|
|
213
|
+
print(f"Location: {result.location}")
|
|
214
|
+
print(f"Skills: {result.skills}")
|
|
215
|
+
print(f"Job Titles: {result.job_titles}")
|
|
216
|
+
print(f"Companies: {result.companies}")
|
|
217
|
+
print(f"Education: {result.education}")
|
|
218
|
+
print(f"Total Experience: {result.total_experience}")
|
|
219
|
+
print(f"Certifications: {result.certifications}")
|
|
220
|
+
print(f"Credits Used: {result.credits_used}")
|
|
221
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
202
222
|
```
|
|
203
223
|
|
|
204
|
-
**
|
|
224
|
+
**Output:**
|
|
205
225
|
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
result.education # list[str]
|
|
223
|
-
result.total_experience # str | None
|
|
224
|
-
result.certifications # list[str]
|
|
226
|
+
```
|
|
227
|
+
Resume ID: 444
|
|
228
|
+
Partner: your-partner-id
|
|
229
|
+
Full Name: John Doe
|
|
230
|
+
Email: john@example.com
|
|
231
|
+
Phone: +1234567890
|
|
232
|
+
LinkedIn: linkedin.com/in/johndoe
|
|
233
|
+
Location: New York, NY
|
|
234
|
+
Skills: ['Python', 'Django', 'AWS']
|
|
235
|
+
Job Titles: ['Senior Developer', 'Tech Lead']
|
|
236
|
+
Companies: ['Google', 'Meta']
|
|
237
|
+
Education: ['BSc Computer Science - MIT']
|
|
238
|
+
Total Experience: 8 years
|
|
239
|
+
Certifications: ['AWS Certified Solutions Architect']
|
|
240
|
+
Credits Used: 3
|
|
241
|
+
Parsed Data: {'full_name': 'John Doe', ...}
|
|
225
242
|
```
|
|
226
243
|
|
|
227
244
|
---
|
|
@@ -235,18 +252,24 @@ job = client.jobs.create(
|
|
|
235
252
|
title="Senior Python Developer",
|
|
236
253
|
description="We are looking for an experienced Python developer..."
|
|
237
254
|
)
|
|
255
|
+
|
|
256
|
+
print(f"Job ID: {job.job_id}")
|
|
257
|
+
print(f"Title: {job.title}")
|
|
258
|
+
print(f"Description: {job.description}")
|
|
259
|
+
print(f"Created By: {job.created_by}")
|
|
260
|
+
print(f"Created At: {job.created_at}")
|
|
261
|
+
print(f"Credits Used: {job.credits_used}")
|
|
238
262
|
```
|
|
239
263
|
|
|
240
|
-
**
|
|
264
|
+
**Output:**
|
|
241
265
|
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
job._raw # dict — Full raw API response
|
|
266
|
+
```
|
|
267
|
+
Job ID: 57
|
|
268
|
+
Title: Senior Python Developer
|
|
269
|
+
Description: We are looking for an experienced Python developer...
|
|
270
|
+
Created By: your-partner-id
|
|
271
|
+
Created At: 2026-02-06T10:30:00Z
|
|
272
|
+
Credits Used: 1
|
|
250
273
|
```
|
|
251
274
|
|
|
252
275
|
---
|
|
@@ -256,18 +279,25 @@ job._raw # dict — Full raw API response
|
|
|
256
279
|
Compare an existing resume against an existing job posting.
|
|
257
280
|
|
|
258
281
|
```python
|
|
259
|
-
result = client.resumes.compare_resumes(resume_id=
|
|
282
|
+
result = client.resumes.compare_resumes(resume_id=445, job_id=56)
|
|
283
|
+
|
|
284
|
+
print(f"Resume ID: {result.resume_id}")
|
|
285
|
+
print(f"Job ID: {result.job_id}")
|
|
286
|
+
print(f"Score: {result.comparison_score}")
|
|
287
|
+
print(f"Reason: {result.comparison_reason}")
|
|
288
|
+
print(f"Language: {result.language}")
|
|
289
|
+
print(f"Credits Used: {result.credits_used}")
|
|
260
290
|
```
|
|
261
291
|
|
|
262
|
-
**
|
|
292
|
+
**Output:**
|
|
263
293
|
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
294
|
+
```
|
|
295
|
+
Resume ID: 445
|
|
296
|
+
Job ID: 56
|
|
297
|
+
Score: 75
|
|
298
|
+
Reason: The candidate demonstrates strong alignment with the role requirements...
|
|
299
|
+
Language: en
|
|
300
|
+
Credits Used: 5
|
|
271
301
|
```
|
|
272
302
|
|
|
273
303
|
---
|
|
@@ -278,23 +308,28 @@ List all uploaded resumes with pagination.
|
|
|
278
308
|
|
|
279
309
|
```python
|
|
280
310
|
result = client.resumes.list(page=1, limit=50)
|
|
281
|
-
```
|
|
282
311
|
|
|
283
|
-
|
|
312
|
+
print(f"Total: {result.total}")
|
|
313
|
+
print(f"Page: {result.page}")
|
|
314
|
+
print(f"Limit: {result.limit}")
|
|
315
|
+
print(f"Has More: {result.has_more}")
|
|
316
|
+
print(f"Count: {len(result)}")
|
|
284
317
|
|
|
285
|
-
```python
|
|
286
|
-
result.resumes # list[dict] — List of resume objects
|
|
287
|
-
result.total # int — Total number of resumes
|
|
288
|
-
result.page # int — Current page
|
|
289
|
-
result.limit # int — Items per page
|
|
290
|
-
result.has_more # bool — Whether more pages exist
|
|
291
|
-
result._raw # dict — Full raw API response
|
|
292
|
-
|
|
293
|
-
# Iterable
|
|
294
318
|
for resume in result:
|
|
295
|
-
print(resume[
|
|
319
|
+
print(f" ID: {resume['id']}, Name: {resume.get('full_name')}, File: {resume.get('filename')}")
|
|
320
|
+
```
|
|
296
321
|
|
|
297
|
-
|
|
322
|
+
**Output:**
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
Total: 120
|
|
326
|
+
Page: 1
|
|
327
|
+
Limit: 50
|
|
328
|
+
Has More: True
|
|
329
|
+
Count: 50
|
|
330
|
+
ID: 450, Name: John Doe, File: resume.pdf
|
|
331
|
+
ID: 449, Name: Salem O. Ba Atya, File: Salem_20220524.pdf
|
|
332
|
+
...
|
|
298
333
|
```
|
|
299
334
|
|
|
300
335
|
---
|
|
@@ -305,21 +340,28 @@ List all job postings with pagination.
|
|
|
305
340
|
|
|
306
341
|
```python
|
|
307
342
|
result = client.jobs.list(page=1, limit=50)
|
|
308
|
-
```
|
|
309
343
|
|
|
310
|
-
|
|
344
|
+
print(f"Total: {result.total}")
|
|
345
|
+
print(f"Page: {result.page}")
|
|
346
|
+
print(f"Limit: {result.limit}")
|
|
347
|
+
print(f"Has More: {result.has_more}")
|
|
348
|
+
print(f"Count: {len(result)}")
|
|
311
349
|
|
|
312
|
-
```python
|
|
313
|
-
result.jobs # list[dict] — List of job objects
|
|
314
|
-
result.total # int — Total number of jobs
|
|
315
|
-
result.page # int — Current page
|
|
316
|
-
result.limit # int — Items per page
|
|
317
|
-
result.has_more # bool — Whether more pages exist
|
|
318
|
-
result._raw # dict — Full raw API response
|
|
319
|
-
|
|
320
|
-
# Iterable
|
|
321
350
|
for job in result:
|
|
322
|
-
print(job[
|
|
351
|
+
print(f" ID: {job['id']}, Title: {job['title']}")
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Output:**
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
Total: 10
|
|
358
|
+
Page: 1
|
|
359
|
+
Limit: 50
|
|
360
|
+
Has More: False
|
|
361
|
+
Count: 10
|
|
362
|
+
ID: 56, Title: Senior Python Developer
|
|
363
|
+
ID: 55, Title: Data Scientist
|
|
364
|
+
...
|
|
323
365
|
```
|
|
324
366
|
|
|
325
367
|
---
|
|
@@ -328,18 +370,22 @@ for job in result:
|
|
|
328
370
|
|
|
329
371
|
```python
|
|
330
372
|
balance = client.credits.balance()
|
|
373
|
+
|
|
374
|
+
print(f"Total: {balance.get('total')}")
|
|
375
|
+
print(f"Used This Month: {balance.get('used_mtd')}")
|
|
376
|
+
print(f"Remaining: {balance.get('remaining')}")
|
|
377
|
+
print(f"Plan: {balance.get('plan_name')}")
|
|
378
|
+
print(f"Resets At: {balance.get('resets_at')}")
|
|
331
379
|
```
|
|
332
380
|
|
|
333
|
-
**
|
|
381
|
+
**Output:**
|
|
334
382
|
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
"resets_at": "2026-03-01T00:00:00Z"
|
|
342
|
-
}
|
|
383
|
+
```
|
|
384
|
+
Total: 1000
|
|
385
|
+
Used This Month: 150
|
|
386
|
+
Remaining: 850
|
|
387
|
+
Plan: Professional
|
|
388
|
+
Resets At: 2026-03-01T00:00:00Z
|
|
343
389
|
```
|
|
344
390
|
|
|
345
391
|
---
|
|
@@ -348,8 +394,11 @@ balance = client.credits.balance()
|
|
|
348
394
|
|
|
349
395
|
```python
|
|
350
396
|
usage = client.credits.usage()
|
|
397
|
+
print(usage)
|
|
398
|
+
|
|
351
399
|
# Or with date filters
|
|
352
400
|
usage = client.credits.usage(start_date="2026-01-01", end_date="2026-01-31")
|
|
401
|
+
print(usage)
|
|
353
402
|
```
|
|
354
403
|
|
|
355
404
|
---
|
|
@@ -401,8 +450,7 @@ job = client.jobs.create(
|
|
|
401
450
|
title="Senior Python Developer",
|
|
402
451
|
description="5+ years Python, Django, AWS, PostgreSQL required..."
|
|
403
452
|
)
|
|
404
|
-
print(f"Created job #{job.job_id}: {job.title}")
|
|
405
|
-
print(f"Credits used: {job.credits_used}")
|
|
453
|
+
print(f"Created job #{job.job_id}: {job.title} ({job.credits_used} credits)")
|
|
406
454
|
|
|
407
455
|
# Step 2: Upload and analyze a resume
|
|
408
456
|
analysis = client.resumes.upload_and_analyze("candidate_resume.pdf")
|
|
@@ -417,7 +465,6 @@ comparison = client.resumes.compare_resumes(
|
|
|
417
465
|
job_id=job.job_id
|
|
418
466
|
)
|
|
419
467
|
print(f"Score: {comparison.comparison_score}%")
|
|
420
|
-
print(f"Language: {comparison.language}")
|
|
421
468
|
print(f"Reasoning: {comparison.comparison_reason}")
|
|
422
469
|
print(f"Credits used: {comparison.credits_used}")
|
|
423
470
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|