Kula APIcareers.kula.ai ↗
Retrieve Kula-hosted job application form definitions: sections, fields, custom questions, EEOC status, and post-submit messages for any listing.
What is the Kula API?
The get_application_form endpoint returns the complete application form definition for any job listing hosted on careers.kula.ai, exposing 7 top-level response fields including sections with nested field arrays, employer-defined custom_fields, custom_field_groups, and the after_submit_message. Given an account_name slug and numeric job_id from the listing URL, it returns the full field schema a candidate would see when applying.
curl -X GET 'https://api.parse.bot/scraper/c5ba82f6-8391-4d76-8942-202efbfe886a/get_application_form?job_id=52506&account_name=covergenius' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace careers-kula-ai-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Kula Careers — fetch and inspect a job application form."""
from parse_apis.careers_kula_ai_api import KulaCareers, FormNotFound
client = KulaCareers()
# Fetch the application form for a specific job listing.
try:
form = client.application_forms.get(account_name="covergenius", job_id="52506")
except FormNotFound:
print("Job listing not found or no longer available.")
raise
print(f"{form.company_name} — Job {form.job_id}")
print(f"EEOC enabled: {form.eeoc_enabled}")
# Walk the standard form sections and their fields.
for section in form.sections:
print(f"\n[{section.label}]")
for field in section.fields:
req = "required" if field.required else "optional"
print(f" {field.label} ({field.type}, {req})")
# Complex fields may have nested sub-fields.
if field.fields:
for sub in field.fields:
sub_req = "required" if sub.required else "optional"
print(f" └ {sub.label} ({sub.type}, {sub_req})")
# Show custom employer questions grouped by heading.
for group in form.custom_field_groups:
print(f"\n[{group.label}]")
for cf in form.custom_fields:
if cf.group == group.label:
req = "required" if cf.required else "optional"
print(f" {cf.label} — {cf.description} (kind={cf.kind}, {req})")
print(f"\nPost-submit message: {form.after_submit_message}")
print("exercised: application_forms.get")
Returns the application form definition for one job listing on a Kula-hosted careers site, identified by the company slug and numeric job id taken from the listing URL (careers.kula.ai/<account_name>/jobs/<job_id>). One page request per call. The result contains the standard form sections in display order (e.g. 'Personal Information' and 'Profile'), each with its fields (id, label, type such as string/email/phone/url/text/range/rel_tag/rel_file/complex, required flag); a 'complex' field (e.g. Education, Experience) carries its own nested 'fields'. Employer-defined custom questions are returned separately in custom_fields with their kind (e.g. enum_boolean), description, required flag and the group heading they appear under (custom_field_groups). Also returns the company name, whether EEOC questions are enabled, and the post-submission message. A job id that the site reports as no longer available yields a stale_input (input_not_found) error; malformed inputs yield stale_input (input_format_invalid).
| Param | Type | Description |
|---|---|---|
| job_idrequired | string | Numeric job identifier from the listing URL (the segment after /jobs/). Passed as a string of digits. |
| account_namerequired | string | Company slug from the careers URL path, e.g. the first path segment of careers.kula.ai/<account_name>/jobs/<job_id>. Letters, digits, hyphen or underscore. |
{
"type": "object",
"fields": {
"job_id": "job identifier echoed from the request",
"sections": "array of standard form sections in display order; each has id, label and fields (array of {id, label, type, required, optional nested fields for type 'complex'})",
"account_name": "company slug echoed from the request",
"company_name": "employer display name shown on the careers site",
"eeoc_enabled": "boolean, whether the form includes EEOC questions",
"custom_fields": "array of employer-defined questions: id, label, description, placeholder, kind (input kind, e.g. enum_boolean), multi, required, position, group (heading label), options (array of choices when the site provides them, otherwise null)",
"custom_field_groups": "array of {index, label} headings under which custom questions are grouped",
"after_submit_message": "message shown to the applicant after submission"
},
"sample": {
"data": {
"job_id": "52506",
"sections": [
{
"id": "info",
"label": "Personal Information",
"fields": [
{
"id": "name",
"type": "string",
"label": "Name",
"required": true
},
{
"id": "email",
"type": "email",
"label": "Email",
"required": true
},
{
"id": "phone",
"type": "phone",
"label": "Phone",
"required": true
},
{
"id": "linkedin_url",
"type": "url",
"label": "LinkedIn URL",
"required": true
}
]
},
{
"id": "profile",
"label": "Profile",
"fields": [
{
"id": "education",
"type": "complex",
"label": "Education",
"fields": [
{
"id": "institution",
"type": "rel_tag",
"label": "Institution",
"required": false
},
{
"id": "discipline",
"type": "rel_tag",
"label": "Discipline",
"required": false
},
{
"id": "degree",
"type": "rel_tag",
"label": "Degree",
"required": false
},
{
"id": "location",
"type": "rel_tag",
"label": "Location",
"required": false
},
{
"id": "summary",
"type": "text",
"label": "Summary",
"required": false
},
{
"id": "date",
"type": "range",
"label": "Start Date / End Date",
"required": false
}
],
"required": true
},
{
"id": "experience",
"type": "complex",
"label": "Experience",
"fields": [
{
"id": "title",
"type": "string",
"label": "Title",
"required": false
},
{
"id": "company",
"type": "rel_tag",
"label": "Company",
"required": false
},
{
"id": "industry",
"type": "rel_tag",
"label": "Industry",
"required": false
},
{
"id": "location",
"type": "rel_tag",
"label": "Location",
"required": false
},
{
"id": "summary",
"type": "text",
"label": "Summary",
"required": false
},
{
"id": "date",
"type": "range",
"label": "Start Date / End Date",
"required": false
}
],
"required": true
},
{
"id": "resume",
"type": "rel_file",
"label": "Resume",
"required": true
},
{
"id": "cover_letter",
"type": "rel_file",
"label": "Cover Letter",
"required": false
}
]
}
],
"account_name": "covergenius",
"company_name": "Cover Genius",
"eeoc_enabled": false,
"custom_fields": [
{
"id": "187136",
"kind": "enum_boolean",
"group": "ADDITIONAL INFORMATION",
"label": "Political Ties",
"multi": false,
"options": null,
"position": 1,
"required": true,
"description": "Do you or anyone in your family hold a political position of any sort?",
"placeholder": null
}
],
"custom_field_groups": [
{
"index": "1",
"label": "ADDITIONAL INFORMATION"
}
],
"after_submit_message": "Thanks for your interest in Cover Genius! Your application was submitted successfully. We will contact you for next steps."
},
"status": "success"
}
}About the Kula API
What the API Returns
The single get_application_form endpoint accepts two required parameters — account_name (the company slug from the first path segment of the careers URL) and job_id (the numeric segment after /jobs/) — and returns a structured definition of the application form for that listing. The response echoes both inputs and adds company_name, the employer's display name as shown on the careers site.
Form Sections and Fields
The sections array lists standard form sections in display order. Each section carries an id, a label (e.g. "Personal Information" or "Profile"), and a fields array. Each field object includes id, label, type, and a required flag, with optional nested sub-fields for composite inputs. This gives you the exact field structure a candidate encounters before they start filling in the form.
Custom Questions and EEOC
Employer-defined questions appear in custom_fields. Each entry includes id, label, description, placeholder, kind (the input type, such as enum_boolean), a multi flag, and a required flag. Related questions are organized under headings via custom_field_groups, where each group has an index and a label. The eeoc_enabled boolean indicates whether the form includes Equal Employment Opportunity Commission questions for that listing.
Post-Submission State
The after_submit_message field returns the confirmation text shown to a candidate after they submit an application. This is useful for auditing employer messaging or verifying form configuration across multiple listings.
The Kula API is a managed, monitored endpoint for careers.kula.ai — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when careers.kula.ai changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official careers.kula.ai API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Audit custom screening questions across multiple Kula-hosted job listings using custom_fields
- Check whether EEOC data collection is enabled for a specific role via the eeoc_enabled flag
- Mirror application form structure into an internal ATS or recruiting tool using sections and fields
- Validate that required fields and custom questions match internal hiring templates before a role goes live
- Aggregate after_submit_message copy across employer accounts to benchmark candidate communication
- Detect changes to application form configuration by periodically fetching and diffing the field schema
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.