Discover/Kula API
live

Kula APIcareers.kula.ai

Retrieve Kula-hosted job application form definitions: sections, fields, custom questions, EEOC status, and post-submit messages for any listing.

Endpoint health
verified 2h ago
get_application_form
1/1 passing latest checkself-healing
Endpoints
1
Updated
3h ago

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.

This call costs1 credit / call— charged only on success
Try it
Numeric job identifier from the listing URL (the segment after /jobs/). Passed as a string of digits.
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.
api.parse.bot/scraper/c5ba82f6-8391-4d76-8942-202efbfe886a/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
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'
Python SDK · recommended

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")
All endpoints · 1 totalmissing one? ·

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).

Input
ParamTypeDescription
job_idrequiredstringNumeric job identifier from the listing URL (the segment after /jobs/). Passed as a string of digits.
account_namerequiredstringCompany 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.
Response
{
  "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.

Reliability & maintenanceVerified

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.

Last verified
2h ago
Latest check
1/1 endpoint passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • 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
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does Kula have an official developer API for careers site data?+
Kula offers a recruiting platform but does not publish a public developer API for reading job application form definitions from careers.kula.ai. This Parse API covers that gap.
What exactly does get_application_form return for the custom questions?+
The custom_fields array returns each employer-defined question with its id, label, description, placeholder text, kind (input type such as enum_boolean), whether multiple selections are allowed (multi), and whether the field is required. Questions are grouped under headings via custom_field_groups, each of which has an index and a label.
Does the API return submitted application data or candidate responses?+
No. The API returns form definitions only — the structure, fields, and configuration an employer has set up. It does not expose submitted responses, candidate profiles, or any application-tracking data. You can fork this API on Parse and revise it to add an endpoint targeting a different data surface if your use case requires it.
Can I retrieve application forms for multiple jobs in a single call?+
Each call to get_application_form covers one job listing, identified by a single account_name and job_id pair. Bulk retrieval across multiple listings is not currently supported in a single request. You can fork this API on Parse and revise it to add a batch endpoint.
Are all Kula-hosted careers pages covered, or only certain accounts?+
The endpoint works for any job listing accessible at the careers.kula.ai/<account_name>/jobs/<job_id> URL pattern. Listings behind login walls or unlisted postings not accessible via that public URL pattern are not covered by this API.
Page content last updated . Spec covers 1 endpoint from careers.kula.ai.
Related APIs in JobsSee all →