SkillHub

blossom-hire

v1.0.8

Offer a paid job or task and find someone to do it, or search for local work, apply, and interview. Blossom connects people who need help with people who can help — whether it's a café shift, a moving job, or a weekend task.

Sourced from ClawHub, Authored by robbiwu

Installation

Please help me install the skill `blossom-hire` from SkillHub official store. npx skills add robbiwu/blossom-hire

Blossom Hire

Operator

Service Blossom — local jobs marketplace
Operator Blossom AI Ltd
Website https://blossomai.org
Privacy policy https://blossomai.org/privacypolicy.html
Contact https://blossomai.org/contact.html
API host hello.blossomai.org

Data handling

This skill collects personal data and sends it to the Blossom API. Be transparent with the user about what is collected.

Data When collected Why
Name, surname, email Registration Account identity
Mobile number Registration (optional) Employer contact
Password (passKey) Registration Account authentication
Street, city, postcode, country Address creation Job search radius / role location
Job details (headline, description, pay) Role creation Published listing
  • All data is transmitted over HTTPS.
  • The API key is permanent and grants full account access — treat it as a secret.
  • No data is stored locally by this skill. All persistence is server-side.

What this skill does

Blossom is a local jobs marketplace. This skill connects to it via a REST API so you can:

  • Offer work — Post a paid job, task, or shift. Describe what you need, where, when, and how much you'll pay. Real people in the area will see it and can apply.
  • Find work — Search for jobs near a location, apply to roles that match, and answer any screening questions the employer has set.

Everything goes through a single API with permanent Bearer-key authentication. No sessions, no expiry.

Two account types

Account userType Purpose
Employer employer You have work that needs doing. You post roles and review who applies.
Job-seeker support You're available to work. You search for roles, apply, and get interviewed.

The same six endpoints serve both types. The /ask endpoint adapts its responses based on account type — employers get candidate information, job-seekers get job matches and screening questions.


When to activate

Use this skill when the user wants to:

Offer work (employer): - Post a job, task, or shift - Hire someone or find staff - See who applied / check candidates - Update or remove a listing

Find work (job-seeker): - Search for jobs or shifts nearby - Apply to a role - Answer screening questions from an employer - Check the status of applications

General: - Create a Blossom account - Add or update a location / address

Trigger phrases: "Post a job", "Hire someone", "I need staff", "I need help with…", "Find me work", "Search for jobs near me", "Apply to that role", "Any candidates?", "Update my listing".


API reference

Base URL

https://hello.blossomai.org/api/v1/blossom/protocol

Endpoints

Method Path Auth Purpose
POST /register None Create account → get API key
POST /address Bearer Create / update address(es)
DELETE /address Bearer Soft-delete address(es)
POST /role Bearer Create / update role(s)
DELETE /role Bearer Soft-delete role(s)
POST /ask Bearer Conversational AI endpoint

Session state

Store and reuse across calls: - API_KEY — returned from /register, used as Bearer token for all subsequent calls - PERSON_ID — returned from /register - ADDRESS_ID — returned from /address, needed when creating a role

The API key is permanent. There is no session expiry or login flow.

Important: Never store the API key in global config. Keep it in runtime memory for the current session only.


Conversation flow

Determine the mode

Ask early: "Are you looking to hire, or looking for work?"

  • Hiring → register as userType: "employer" (optionally with companyName)
  • Looking for work → register as userType: "support" (must include rightToWork: true)

Collecting information

Gather details conversationally — don't front-load. Ask only for what's missing.

Identity (ask when ready to call the API) - Email, first name, surname - Mobile country code (e.g. +44), mobile number - A passKey (password) they choose

Employer: role details (required to post a job)

  1. Headline — one line
  2. Description — 2–6 lines of what the helper will do
  3. When — working hours, or "flexible"
  4. Where — street, city, postcode, country
  5. Pay — amount + frequency (total | per hour | per week | per month | per year)

Optional extras - Requirements — screening questions (name + mandatory flag) - Benefits — perks (name + mandatory flag)

Job-seeker: location only

  • Where they are (street, city, postcode, country) — needed for job search radius

Employer step sequence

  1. Collect role details.
  2. Confirm back in one compact summary: headline, when, where, pay.
  3. Collect identity if not already known.
  4. Register (userType: "employer") → store API_KEY and PERSON_ID.
  5. Create address → store ADDRESS_ID.
  6. Create role with the ADDRESS_ID → confirm with role ID.
  7. When asked to check candidates → call /ask.

Job-seeker step sequence

  1. Collect identity and location.
  2. Register (userType: "support", rightToWork: true) → store API_KEY and PERSON_ID.
  3. Create address (their home/base location) → store ADDRESS_ID.
  4. Call /ask to search for nearby jobs: "Find jobs near me" or "What work is available?"
  5. The API returns matching roles. Present them to the user.
  6. To apply: call /ask with "Apply to role <id>" — the API handles the application.
  7. The API may return follow-up screening questions. Relay the questions to the user and send their answers back to /ask.

API contract

1. Register

POST /register — no auth required.

Request:

{
  "name": "<first name>",
  "surname": "<surname>",
  "email": "<email>",
  "userType": "support",
  "passKey": "<password>",
  "rightToWork": true,
  "mobileCountry": "<+44>",
  "mobileNo": "<number>"
}
Field Required Notes
name yes
surname yes
email yes Must be unique
userType yes support (job-seeker) or employer
passKey yes User-chosen password
rightToWork yes* Must be true when userType is support
companyName no Required-ish for employer type
mobileCountry no e.g. +44
mobileNo no

Success response 201:

{
  "success": true,
  "apiKey": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "personId": 803
}

If the email already exists the API returns 400 with an error message. Do not retry — inform the user.


2. Create address

POST /address — Bearer auth required.

Request:

{
  "addresses": [
    {
      "id": 0,
      "houseNumber": "<optional>",
      "street": "<street>",
      "area": "<optional>",
      "city": "<city>",
      "country": "<country>",
      "postcode": "<postcode>",
      "label": "Work location",
      "isHome": false,
      "isActive": true
    }
  ]
}
  • id: 0 creates a new address.
  • To update an existing address, set id to the address ID.
  • The response includes the created/updated address with its assigned id — store this as ADDRESS_ID.

3. Delete address

DELETE /address — Bearer auth required.

{
  "addresses": [
    { "id": <addressId> }
  ]
}
  • Cannot delete an address linked to an active role (returns 409).

4. Create role

POST /role — Bearer auth required.

Request:

{
  "roles": [
    {
      "id": 0,
      "headline": "<headline>",
      "jobDescription": "<description>",
      "introduction": "",
      "workingHours": "<when>",
      "salary": <amount>,
      "currencyName": "GBP",
      "currencySymbol": "£",
      "paymentFrequency": {
        "choices": ["<frequency>"],
        "selectedIndex": 0
      },
      "requirements": [
        { "requirementName": "<name>", "mandatory": false, "originalRequirement": true }
      ],
      "benefits": [
        { "benefitName": "<name>", "mandatory": false }
      ],
      "addressId": <ADDRESS_ID>,
      "isRemote": false,
      "isActive": true,
      "days": 30,
      "maxCrew": 1,
      "modified": <epochMillis>,
      "roleIdentifier": "openclaw-<epochMillis>"
    }
  ]
}
Field Required Notes
id yes 0 to create, existing ID to update
headline yes Short title
jobDescription yes Full description
workingHours yes e.g. "Saturday 11am–5pm" or "Flexible"
salary yes Numeric amount
paymentFrequency yes choices array with one entry, selectedIndex: 0
addressId yes From the address creation step
days yes Listing duration (default 30)
maxCrew yes Positions available (default 1)
modified yes Current epoch millis
roleIdentifier yes Unique string, e.g. "openclaw-" + epochMillis
requirements no Screening questions
benefits no Perks

Success response 201: The role(s) with assigned IDs.


5. Delete role

DELETE /role — Bearer auth required.

{
  "roles": [
    { "id": <roleId> }
  ]
}
  • Every role id must belong to the authenticated account (returns 403 otherwise).

6. Ask

POST /ask — Bearer auth required.

{
  "instructions": "<natural language>"
}

Send a plain-language message. The API knows the account type and full state — it handles everything and returns a JSON response. Just relay what the user said.


Request examples

Reference curl examples — replace <placeholders> with real values. All authenticated endpoints need the Authorization header.

Environment

API="https://hello.blossomai.org/api/v1/blossom/protocol"
KEY="<apiKey>"
AUTH="Authorization: Bearer $KEY"

Register

curl -sS "$API/register" 
  -H "content-type: application/json" 
  -d '{
    "name": "<name>",
    "surname": "<surname>",
    "email": "<email>",
    "userType": "support",
    "passKey": "<passKey>",
    "rightToWork": true,
    "mobileCountry": "<+44>",
    "mobileNo": "<number>"
  }' | jq .

Create address

curl -sS "$API/address" 
  -H "content-type: application/json" 
  -H "$AUTH" 
  -d '{
    "addresses": [{
      "id": 0,
      "street": "<street>",
      "city": "<city>",
      "country": "<country>",
      "postcode": "<postcode>",
      "label": "Work location",
      "isHome": false,
      "isActive": true
    }]
  }' | jq .

Create role

NOW=$(date +%s000)

curl -sS "$API/role" 
  -H "content-type: application/json" 
  -H "$AUTH" 
  -d '{
    "roles": [{
      "id": 0,
      "headline": "<headline>",
      "jobDescription": "<description>",
      "introduction": "",
      "workingHours": "<when>",
      "salary": <amount>,
      "currencyName": "GBP",
      "currencySymbol": "£",
      "paymentFrequency": { "choices": ["<frequency>"], "selectedIndex": 0 },
      "requirements": [],
      "benefits": [],
      "addressId": <ADDRESS_ID>,
      "isRemote": false,
      "isActive": true,
      "days": 30,
      "maxCrew": 1,
      "modified": '"$NOW"',
      "roleIdentifier": "openclaw-'"$NOW"'"
    }]
  }' | jq .

Delete role

curl -sS -X DELETE "$API/role" 
  -H "content-type: application/json" 
  -H "$AUTH" 
  -d '{ "roles": [{ "id": <roleId> }] }' | jq .

Delete address

curl -sS -X DELETE "$API/address" 
  -H "content-type: application/json" 
  -H "$AUTH" 
  -d '{ "addresses": [{ "id": <addressId> }] }' | jq .

Ask (employer)

curl -sS "$API/ask" 
  -H "content-type: application/json" 
  -H "$AUTH" 
  -d '{ "instructions": "Do I have any candidates?" }' | jq .

Ask (job-seeker — find work)

curl -sS "$API/ask" 
  -H "content-type: application/json" 
  -H "$AUTH" 
  -d '{ "instructions": "Find jobs near me" }' | jq .

Ask (job-seeker — apply)

curl -sS "$API/ask" 
  -H "content-type: application/json" 
  -H "$AUTH" 
  -d '{ "instructions": "Apply to role 1042" }' | jq .

Examples

Example 1 — Employer: post a shift

User: I need café cover this Saturday 11–5 in Sherwood. £12/hour.

Flow: 1. Missing: street, postcode. Ask for them. 2. Confirm: "Café cover — Sat 11am–5pm, Sherwood NG5 1AA — £12/hr. Shall I post it?" 3. Collect identity (email, name, surname, mobile, passKey). 4. POST /register (userType: "employer") → store API_KEY, PERSON_ID. 5. POST /address → store ADDRESS_ID. 6. POST /role → return: "Posted! Role ID 1042."

Example 2 — Employer: check candidates

User: Any candidates yet?

Flow: 1. If API_KEY not stored → ask for identity, register first. 2. POST /ask with "Do I have any candidates?". 3. If empty: "Waiting for responses." 4. Otherwise: display the candidate list as returned.

Example 3 — Employer: update a listing

User: Change the pay to £14/hour on my café role.

Flow: 1. POST /role with the existing role id and updated salary: 14. 2. Confirm: "Updated — café cover now shows £14/hr."

Example 4 — Employer: remove a listing

User: Take down the café role.

Flow: 1. DELETE /role with the role id. 2. Confirm: "Removed."

Example 5 — Job-seeker: find and apply

User: I'm looking for bar work in Nottingham this weekend.

Flow: 1. Collect identity (email, name, surname, mobile, passKey). 2. POST /register (userType: "support", rightToWork: true) → store API_KEY, PERSON_ID. 3. POST /address (their Nottingham location) → store ADDRESS_ID. 4. POST /ask with "Find bar work near me this weekend" → API returns matching roles. 5. Present results: "Found 3 roles near you…" 6. User picks one → POST /ask with "Apply to role 1055" → API confirms application. 7. The API may return screening questions (e.g. "Do you have a personal licence?"). Relay the user's answers back via /ask.

Example 6 — Job-seeker: check application status

User: How are my applications going?

Flow: 1. POST /ask with "What's the status of my applications?". 2. Display the response.