Recruit · Muse connector
Intoola Recruit connector for Muse
Overview
Intoola Recruit helps students and early-career job seekers find professionals, track recruiting and networking, and prepare. The Muse connector, intoola Recruit: Recruiting, Simplified, lets a Muse user do that from a conversation: search for people at a school or company, look up a professional email, keep a tracker up to date, get a draft outreach or follow-up email, prepare for an interview, and get feedback on a resume or cover letter.
Requirements. The user needs an Intoola account (sign in with Google) and an active paid Intoola Recruit subscription. The subscription is verified on Intoola's servers on every request. Without one, the API returns HTTP 402 with subscription_required and a link to subscribe. Muse does not add a separate subscription or extra allowance: search results, email lookups, and AI requests made through Muse count against the same monthly and daily limits as the Intoola Recruit website and Chrome extension.
Drafts only. Intoola never sends email or messages for the user. Outreach and follow-up actions return draft text that the user reviews and sends themselves. See the Recruit Privacy Policy (Section 15) for how data is handled.
Endpoints
| Purpose | URL |
|---|---|
| API base URL | https://intoola-recruit.intoola-recruit.workers.dev |
| OpenAPI 3.1 description | /muse/v1/openapi.json |
| OAuth server metadata (RFC 8414) | /.well-known/oauth-authorization-server |
| Authorization | GET /oauth/authorize |
| Token | POST /oauth/token |
| Revocation (RFC 7009) | POST /oauth/revoke |
| Account and allowance status | GET /muse/v1/status |
| Actions | POST /muse/v1/actions/<action> |
Authentication
OAuth 2.0 authorization code flow with PKCE (S256, required). Intoola never handles a password: the user signs in with Google on an Intoola-hosted page and then approves the connection.
- Authorization request:
response_type=code,client_id,redirect_uri(must exactly match a registered https URI),state,code_challenge,code_challenge_method=S256, optionalscope. - Token request:
grant_type=authorization_codewithcode,code_verifier, andredirect_uri; client authentication by HTTP Basic orclient_secretin the body. - Tokens: opaque bearer access token (1 hour) and refresh token (30 days). Refresh tokens rotate on each use; replaying a rotated token revokes the grant. Send
Authorization: Bearer <access_token>on API calls. Users can disconnect at any time, which revokes the tokens.
| Scope | Allows |
|---|---|
recruit.search | Search for professionals and look up a professional email. |
recruit.track | View and update contacts in the user's Recruit tracker. |
recruit.outreach | Draft networking and follow-up emails (never sent). |
recruit.prep | Create interview preparation plans. |
recruit.feedback | AI feedback on a resume or cover letter the user provides. |
account.status | See whether the subscription is active and the remaining allowance. |
Actions
All actions take a JSON body and return JSON. Unknown fields are rejected. An optional Idempotency-Key header (8–128 characters) makes retries safe: a repeated request replays the first result instead of running (and counting) again. Contacts belong to the signed-in user only; a contact_id or person_ref from another account is never accepted.
| Action (scope) | Parameters | Returns |
|---|---|---|
search_people (search) | school, company, position, keywords (at least one); search_id, pagination_token for the next page | people[] with person_ref, name, position, company, school, location, profile URL (no email); next_page; usage |
find_professional_email (search) | person_ref (required, from a search result) | status: found, already_had, not_found, quota_reached, or provider_error; email; usage. Only a found email uses an email credit. |
add_contact_to_tracker (track) | person_ref, or full_name and company (with optional position, profile_url); optional status | contact and already_tracked |
get_tracked_contacts (track) | optional company, status, limit 1–50, cursor | contacts[], total, next_cursor |
get_contact (track) | contact_id (required) | contact |
update_contact_status (track) | contact_id, status (both required) | contact, changed |
draft_outreach (outreach) | recipient_name, role_or_goal (required); company, context, target_words 60–250, tone, directness | subject, body, sent: false |
draft_follow_up (outreach) | recipient_name, previous_message_summary (required); role_or_goal, company, target_words 40–200, tone, directness | subject, body, sent: false |
prepare_for_interview (prep) | industry (required); role, level, focus (Complete prep, Behavioral, Role-specific, Technical, Case interview) | preparation (Markdown), practice_question |
analyze_resume (feedback) | resume_text and/or cover_letter_text (up to 60,000 characters each); optional review_type, job_description_text | feedback (Markdown) |
Tracker statuses are the same as in the Recruit app: not_contacted, connection_requested, contacted, followed_up, replied, meeting_scheduled, referral_received, no_response, not_interested.
Example request:
POST /muse/v1/actions/search_people
Authorization: Bearer <access_token>
Content-Type: application/json
{ "school": "Tufts University", "company": "Evercore" }
Errors
Errors use the shape { "error": { "code", "message" }, "request_id" }.
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_parameters | A parameter is missing, out of range, or unknown. |
| 401 | missing_authorization, invalid_token | No token, or the token is invalid, expired, or revoked. Refresh or re-link. |
| 402 | subscription_required | No active Intoola Recruit subscription (or no account). error.upgrade_url points to the subscribe page. |
| 403 | insufficient_scope | The authorization does not include the required scope. |
| 404 | person_not_found, contact_not_found | Unknown or expired person_ref, or a contact that is not in the user's tracker. |
| 409 / 422 | request_in_progress, tracker_full, idempotency_key_reuse | Duplicate request in flight, the tracker is at its size limit, or an Idempotency-Key reused with different parameters. |
| 413 | payload_too_large | The request body is too large. |
| 429 | rate_limited, usage_limit_reached | Per-minute rate limit, or the user's monthly or daily allowance is used up; see Retry-After. |
| 502 / 503 / 504 | upstream_error, service_unavailable, upstream_timeout | Temporary problem; nothing was charged. Retry later. |
Limits
- People search and email lookups use the user's existing monthly Intoola Recruit allowances, and AI actions use the existing daily AI allowance. These are shared with the Recruit website and Chrome extension; using Muse does not add extra allowance.
- The same per-minute limits that apply in the Recruit app also apply through Muse, plus a per-user request limit on the connector itself.
Support and legal
Questions or issues: info@intoola.com. Recruit Privacy Policy · Recruit Terms of Service · About Intoola Recruit.