---
title: "Create mission"
method: POST
path: "/v1/{domainId}/missions"
tags: ["missions"]
---

# Create mission

`POST /v1/{domainId}/missions`

## Request

- Base URL: `https://api.morningscore.io`
- URL: `https://api.morningscore.io/v1/{domainId}/missions`
- Auth: HTTP bearer

Creates a new mission for the domain. Supported `mission_type` values: `keywords_target_position`, `keywords_morningscore`, `keywords_gsc`, `links_count`, `links_count_rating`, `links_specific`, `links_rank`, `onsite_page_tasks`, `health_score`, `health_validator`, `ai_geo_score_low`, `ai_geo_health_weak`, `geo_prompt_answer`, `custom`. You can create many missions; Laravel only deduplicates **incomplete** missions with the same type and parameters.

## Path parameters

- `domainId` string, required

## Request body

- object: Mission creation payload. `company_id` and `domain_id` are set from the path. You may create multiple missions per domain; Laravel removes other **incomplete** missions that match the same type and parameters.
  - `mission_type` 'keywords_target_position' | 'keywords_morningscore' | 'keywords_gsc' | 'links_count' | 'links_count_rating' | 'links_specific' | 'links_rank' | 'onsite_page_tasks' | 'health_score' | 'health_validator' | 'ai_geo_score_low' | 'ai_geo_health_weak' | 'geo_prompt_answer' | 'custom', required: Mission type to create. One of: `keywords_target_position`, `keywords_morningscore`, `keywords_gsc`, `links_count`, `links_count_rating`, `links_specific`, `links_rank`, `onsite_page_tasks`, `health_score`, `health_validator`, `ai_geo_score_low`, `ai_geo_health_weak`, `geo_prompt_answer`, `custom`.
  - `keyword` string: **Required** for `keywords_target_position`. Keyword to rank for.
  - `target` number: **Required** for every creatable type. Meaning varies: rank position, Morningscore, link count, link rank, tasks to fix, etc.
  - `target_currency` string: **Required** for `keywords_morningscore`. Currency for the target score (e.g. `USD`, `DKK`).
  - `target_domain` string: **Required** for `links_specific`. Referring domain to obtain a link from.
  - `rating` number: **Required** for `links_count_rating`. Minimum link rating threshold.
  - `page` string: **Required** for `onsite_page_tasks`. Landing page path (e.g. `/blog/post/`).
  - `onsite_page_id` string: Optional for `onsite_page_tasks`. Onsite crawler page id when known.
  - `validator` string: **Required** for `health_validator`. Validator slug, for example `missing_alt_tags`.
  - `prompt` string: **Required** for `geo_prompt_answer`. The prompt the brand should appear in the answer for. A prompt that is not tracked yet is added to the AI prompt tracker and uses one tracked-prompt credit; creation fails when no credits are left.
  - `headline` string: **Required** for `custom`. Mission headline, at most 20 words.
  - `details` string: Optional for `custom`. Mission description, at most 200 words.
  - `sort_index` integer
  - `initial` integer
  - `currency` string

## Response `200`

200

- object: Response from Laravel `api.app.missions.missions.create`.
  - `missions` object[], required: Domain missions relation after create (raw model attributes).
  - `mission` object, required: Created mission; includes `MissionResource` fields plus any extra model attributes.
    - `is_disabled` boolean, required
    - `xp` number, nullable, required
    - `xp_claimed_at` string, nullable, required: ISO 8601 datetime string from Laravel serialization.
    - `category` 'keywords' | 'links' | 'onsite' | 'ai' | 'custom' | 'onboarding' | 'unknown', required: High-level mission category derived from mission type.
    - `translated_category` string, required
    - `completed_at` string, nullable, required: ISO 8601 datetime string from Laravel serialization.
    - `archived_at` string, nullable, required: ISO 8601 datetime string from Laravel serialization.
    - `checking_status` boolean, required
    - `created_at` string, required: ISO 8601 datetime string from Laravel serialization.
    - `description` string, required
    - `difficulty` number, required
    - `roi_currency` number, required: Converted ROI monetary value (Laravel `getRoiCurrencyAttribute()` returns a float despite the name; not an ISO currency code).
    - `roi_slug` 'epic' | 'amazing' | 'great' | 'good' | 'fine' | 'small_fix', required: ROI tier label derived from `increase_ratio`.
    - `type` 'keywords_target_position' | 'keywords_morningscore' | 'keywords_gsc' | 'links_count' | 'links_count_rating' | 'links_specific' | 'links_rank' | 'onsite_page_tasks' | 'health_score' | 'health_validator' | 'ai_geo_score_low' | 'ai_geo_health_weak' | 'geo_prompt_answer' | 'custom' | 'onboarding_verify_account' | 'onboarding_keywords_count' | 'onboarding_competitors_count' | 'onboarding_keyword_research_count' | 'onboarding_added_missions_count' | 'onboarding_scan_website_count' | 'onboarding_prompts_count' | 'onboarding_geo_score' | 'onboarding_article_count' | 'onboarding_growth_opportunities' | 'onboarding_tooltips_clicked_count' | 'onboarding_guides_opened_count' | 'onboarding_add_domain' | 'onboarding_watch_intro_video', required: Mission type slug.
    - `is_suggested` boolean, required
    - `keyword` string, nullable, required
    - `kwHash` string, nullable, required
    - `progress_ratio` number, required
    - `roi` number, required
    - `roi_recent` number, required
    - `current` number, required
    - `target` number, required
    - `target_currency` string, required
    - `target_diff` number, required
    - `hostname` string, nullable, required
    - `page` string, nullable, required
    - `details` string, nullable
    - `prompt` string, nullable: Tracked prompt for `geo_prompt_answer` missions.
    - `onsite_page_id` union, required: Onsite page id from mission parameters (string or numeric depending on storage).
      - string
      - number
    - `notes_count` integer: Number of notes on the mission. Note bodies are not included; fetch them from the mission notes endpoint.
  - `message` string, nullable
  - `_request_uuid` string

## Other responses

- `201`: 201
- `400`: 400
- `401`: 401
- `404`: 404
- `429`: 429
- `500`: 500

---

[API](https://skmtc.dev/morningscore/apis/morningscore-api.md) · [All operations](https://skmtc.dev/morningscore/apis/morningscore-api/llms.txt) · [OpenAPI document](https://skmtc.dev/morningscore/apis/morningscore-api/revisions/c307cf2cbaa7?raw)
