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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiondtech
3
- Version: 2.2.0
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
- **Return type:** `ResumeUploadResult`
111
+ **Output:**
118
112
 
119
- ```python
120
- result.resume_id # int — Unique resume ID
121
- result.message # str — "Resume uploaded successfully"
122
- result.credits_used # int — Credits consumed by this call
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
- **Return type:** `ResumeAnalysisResult`
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
- ```python
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
- # Convenience properties
145
- result.full_name # str | None
146
- result.email # str | None
147
- result.skills # list[str]
148
- result.job_titles # list[str]
149
- result.total_experience # str | None
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
- **`parsed_data` structure:**
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=42)
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
- **Return type:** `ResumeComparisonResult`
187
+ **Output:**
182
188
 
183
- ```python
184
- result.resume_id # int — Resume ID
185
- result.job_id # int — Job ID compared against
186
- result.comparison_score # float — Match score (0-100)
187
- result.comparison_reason # str Detailed reasoning
188
- result.language # str | None Detected language (e.g. "en", "ar")
189
- result.parsed_data # dict | None — Parsed resume data
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=123)
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
- **Return type:** `ParsedResumeResult`
224
+ **Output:**
205
225
 
206
- ```python
207
- result.resume_id # int — Resume ID
208
- result.partner # str — Partner identifier
209
- result.parsed_data # dict Full parsed data
210
- result.credits_used # int — Credits consumed by this call
211
- result._raw # dict — Full raw API response
212
-
213
- # Convenience properties
214
- result.full_name # str | None
215
- result.email # str | None
216
- result.phone # str | None
217
- result.linkedin # str | None
218
- result.location # str | None
219
- result.skills # list[str]
220
- result.job_titles # list[str]
221
- result.companies # list[str]
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
- **Return type:** `JobResult`
264
+ **Output:**
241
265
 
242
- ```python
243
- job.job_id # int — Unique job ID
244
- job.title # str Job title
245
- job.description # str Job description
246
- job.created_by # str — Creator identifier
247
- job.created_at # str | None — Creation timestamp
248
- job.credits_used # int — Credits consumed by this call
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=123, job_id=456)
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
- **Return type:** `ResumeComparisonResult`
292
+ **Output:**
263
293
 
264
- ```python
265
- result.resume_id # int — Resume ID
266
- result.job_id # int — Job ID
267
- result.comparison_score # float — Match score (0-100)
268
- result.comparison_reason # str Detailed reasoning
269
- result.credits_used # int — Credits consumed by this call
270
- result._raw # dict — Full raw API response
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
- **Return type:** `ResumeListResult`
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["id"], resume.get("full_name"))
319
+ print(f" ID: {resume['id']}, Name: {resume.get('full_name')}, File: {resume.get('filename')}")
320
+ ```
296
321
 
297
- len(result) # Number of resumes on this page
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
- **Return type:** `JobListResult`
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["id"], job["title"])
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
- **Returns:** `dict`
381
+ **Output:**
334
382
 
335
- ```python
336
- {
337
- "total": 1000,
338
- "used_mtd": 150,
339
- "remaining": 850,
340
- "plan_name": "Professional",
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
- **Return type:** `ResumeUploadResult`
75
+ **Output:**
82
76
 
83
- ```python
84
- result.resume_id # int — Unique resume ID
85
- result.message # str — "Resume uploaded successfully"
86
- result.credits_used # int — Credits consumed by this call
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
- **Return type:** `ResumeAnalysisResult`
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
- ```python
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
- # Convenience properties
109
- result.full_name # str | None
110
- result.email # str | None
111
- result.skills # list[str]
112
- result.job_titles # list[str]
113
- result.total_experience # str | None
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
- **`parsed_data` structure:**
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=42)
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
- **Return type:** `ResumeComparisonResult`
151
+ **Output:**
146
152
 
147
- ```python
148
- result.resume_id # int — Resume ID
149
- result.job_id # int — Job ID compared against
150
- result.comparison_score # float — Match score (0-100)
151
- result.comparison_reason # str Detailed reasoning
152
- result.language # str | None Detected language (e.g. "en", "ar")
153
- result.parsed_data # dict | None — Parsed resume data
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=123)
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
- **Return type:** `ParsedResumeResult`
188
+ **Output:**
169
189
 
170
- ```python
171
- result.resume_id # int — Resume ID
172
- result.partner # str — Partner identifier
173
- result.parsed_data # dict Full parsed data
174
- result.credits_used # int — Credits consumed by this call
175
- result._raw # dict — Full raw API response
176
-
177
- # Convenience properties
178
- result.full_name # str | None
179
- result.email # str | None
180
- result.phone # str | None
181
- result.linkedin # str | None
182
- result.location # str | None
183
- result.skills # list[str]
184
- result.job_titles # list[str]
185
- result.companies # list[str]
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
- **Return type:** `JobResult`
228
+ **Output:**
205
229
 
206
- ```python
207
- job.job_id # int — Unique job ID
208
- job.title # str Job title
209
- job.description # str Job description
210
- job.created_by # str — Creator identifier
211
- job.created_at # str | None — Creation timestamp
212
- job.credits_used # int — Credits consumed by this call
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=123, job_id=456)
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
- **Return type:** `ResumeComparisonResult`
256
+ **Output:**
227
257
 
228
- ```python
229
- result.resume_id # int — Resume ID
230
- result.job_id # int — Job ID
231
- result.comparison_score # float — Match score (0-100)
232
- result.comparison_reason # str Detailed reasoning
233
- result.credits_used # int — Credits consumed by this call
234
- result._raw # dict — Full raw API response
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
- **Return type:** `ResumeListResult`
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["id"], resume.get("full_name"))
283
+ print(f" ID: {resume['id']}, Name: {resume.get('full_name')}, File: {resume.get('filename')}")
284
+ ```
260
285
 
261
- len(result) # Number of resumes on this page
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
- **Return type:** `JobListResult`
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["id"], job["title"])
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
- **Returns:** `dict`
345
+ **Output:**
298
346
 
299
- ```python
300
- {
301
- "total": 1000,
302
- "used_mtd": 150,
303
- "remaining": 850,
304
- "plan_name": "Professional",
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
 
@@ -31,7 +31,7 @@ Environment Variables:
31
31
  AIONDTECH_BASE_URL: Custom API URL (default: https://api.dev.aiondtech.com)
32
32
  """
33
33
 
34
- __version__ = "2.2.0"
34
+ __version__ = "2.3.0"
35
35
  __author__ = "AiondTech"
36
36
 
37
37
  from .client import ResumeAnalyser, Client
@@ -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.2.0",
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
- params={"resume_id": resume_id}
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
- payload = {
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
- json_data=payload
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.2.0
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
- **Return type:** `ResumeUploadResult`
111
+ **Output:**
118
112
 
119
- ```python
120
- result.resume_id # int — Unique resume ID
121
- result.message # str — "Resume uploaded successfully"
122
- result.credits_used # int — Credits consumed by this call
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
- **Return type:** `ResumeAnalysisResult`
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
- ```python
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
- # Convenience properties
145
- result.full_name # str | None
146
- result.email # str | None
147
- result.skills # list[str]
148
- result.job_titles # list[str]
149
- result.total_experience # str | None
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
- **`parsed_data` structure:**
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=42)
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
- **Return type:** `ResumeComparisonResult`
187
+ **Output:**
182
188
 
183
- ```python
184
- result.resume_id # int — Resume ID
185
- result.job_id # int — Job ID compared against
186
- result.comparison_score # float — Match score (0-100)
187
- result.comparison_reason # str Detailed reasoning
188
- result.language # str | None Detected language (e.g. "en", "ar")
189
- result.parsed_data # dict | None — Parsed resume data
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=123)
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
- **Return type:** `ParsedResumeResult`
224
+ **Output:**
205
225
 
206
- ```python
207
- result.resume_id # int — Resume ID
208
- result.partner # str — Partner identifier
209
- result.parsed_data # dict Full parsed data
210
- result.credits_used # int — Credits consumed by this call
211
- result._raw # dict — Full raw API response
212
-
213
- # Convenience properties
214
- result.full_name # str | None
215
- result.email # str | None
216
- result.phone # str | None
217
- result.linkedin # str | None
218
- result.location # str | None
219
- result.skills # list[str]
220
- result.job_titles # list[str]
221
- result.companies # list[str]
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
- **Return type:** `JobResult`
264
+ **Output:**
241
265
 
242
- ```python
243
- job.job_id # int — Unique job ID
244
- job.title # str Job title
245
- job.description # str Job description
246
- job.created_by # str — Creator identifier
247
- job.created_at # str | None — Creation timestamp
248
- job.credits_used # int — Credits consumed by this call
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=123, job_id=456)
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
- **Return type:** `ResumeComparisonResult`
292
+ **Output:**
263
293
 
264
- ```python
265
- result.resume_id # int — Resume ID
266
- result.job_id # int — Job ID
267
- result.comparison_score # float — Match score (0-100)
268
- result.comparison_reason # str Detailed reasoning
269
- result.credits_used # int — Credits consumed by this call
270
- result._raw # dict — Full raw API response
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
- **Return type:** `ResumeListResult`
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["id"], resume.get("full_name"))
319
+ print(f" ID: {resume['id']}, Name: {resume.get('full_name')}, File: {resume.get('filename')}")
320
+ ```
296
321
 
297
- len(result) # Number of resumes on this page
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
- **Return type:** `JobListResult`
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["id"], job["title"])
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
- **Returns:** `dict`
381
+ **Output:**
334
382
 
335
- ```python
336
- {
337
- "total": 1000,
338
- "used_mtd": 150,
339
- "remaining": 850,
340
- "plan_name": "Professional",
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
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "aiondtech"
7
- version = "2.2.0"
7
+ version = "2.3.0"
8
8
  description = "Official Python SDK for AiondTech Resume Analyser API"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
File without changes
File without changes
File without changes
File without changes