Skip to content

Authorship Intake

gabep-tech edited this page May 4, 2026 · 7 revisions

Submit and list Authorship intake data for accounts and campaigns. Used when an Authorship workflow task exists and the reseller submits author profile information tied to a campaign.

All endpoints require Authorization with a Bearer JWT (and/or API key if your integration uses it—match other v1 wiki pages).

Available endpoints

Create Authorship Intake

  • Endpoint: POST /api/v1/authorship
  • Description: Creates an authorship intake for the given account and campaign, updates the Authorship task’s link_image when valid, writes intake rows and a task note. Fails if an intake already exists or prerequisites are not met.
  • Required JSON body:
    • account (object): account_id (integer), camp_id (integer)
    • author (object): full_name (string), position (string), business_name (string)
    • linked_in (object): required; url (string, optional)
  • Optional body fields (strings): linkedin_url (recommended for stored LinkedIn URL), link_image, experience_history, interests_facts, areas_expertise, education, current_work, credentials, pub_awards

List Authorship tasks (Scheduled)

  • Endpoint: GET /api/v1/authorship
  • Description: Returns Scheduled Authorship tasks (task_type_id 136, status Scheduled, not completed), optionally filtered.
  • Query parameters (all optional):
    • account_id (integer)
    • camp_id (integer)
    • start_date (date, YYYY-MM-DD) — filters on date_due ≥ start
    • end_date (date, YYYY-MM-DD) — filters on date_due ≤ end
    • needsIntakeData (true or false) — true: tasks without an intake; false: tasks with an intake

Example requests

Create intake

curl -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "account": { "account_id": 12345, "camp_id": 54321 },
    "author": {
      "full_name": "Jane Doe",
      "position": "Editor",
      "business_name": "Example Co"
    },
    "linked_in": { "url": "https://www.linkedin.com/in/janedoe" },
    "linkedin_url": "https://www.linkedin.com/in/janedoe",
    "link_image": "https://example.com/photo.jpg",
    "credentials": "Certified Example",
    "experience_history": "10 years in SEO"
  }' \
  "https://uat.services.semify.com/api/v1/authorship"

List tasks (with filters)

curl -H "Authorization: Bearer $TOKEN" \
  "https://uat.services.semify.com/api/v1/authorship?account_id=12345&needsIntakeData=true"

Sample responses

Create — success (200)

{
  "data": {},
  "error": false,
  "messages": [
    "Authorship created successfully",
    "Success"
  ]
}

Create — duplicate intake (400)

{
  "data": {},
  "error": true,
  "messages": [
    "An intake already exists for this account and campaign. - errorcode: authorship-v1-create:2",
    "Bad Request"
  ]
}

Create — no Authorship plan / task (400)

{
  "data": {},
  "error": true,
  "messages": [
    "Account does not have LR3 Authorship plans - errorcode: authorship-v1-create:4",
    "Bad Request"
  ]
}

GET — success (200)

{
  "data": [
    {
      "task_id": 1001,
      "camp_id": 54321,
      "task_name": "LR3 Authorship",
      "task_type_id": 136,
      "task_type_name": "LR3 Authorship",
      "camp_name": "Example Campaign",
      "account_id": 12345,
      "status": "Scheduled",
      "date_due": "2026-05-15",
      "created_date": "2026-05-01",
      "intake_id": null
    }
  ],
  "error": false,
  "messages": [
    "Successfully retrieved 1 scheduled Authorship tasks",
    "with filters: account_id: 12345, needsIntakeData: true"
  ]
}

GET — none found (404)

{
  "data": {},
  "error": true,
  "messages": ["No authorship tasks found"]
}

Typical workflow

  1. Confirm service / task: Ensure the account–campaign has an LR3 Authorship task in Scheduled status.
  2. Check existing intake: If an intake already exists for that account_id and camp_id, creation will fail—use support or internal tools as needed.
  3. Submit intake: POST /api/v1/authorship with author and optional profile fields.
  4. Verify: GET /api/v1/authorship with account_id / camp_id and needsIntakeData=false to confirm an intake is attached.

Important notes

  • Top-level campaign: Use the correct camp_id for the campaign you are attaching to (consistent with how other Semify APIs scope account/campaign).
  • Task type: Authorship tasks use task type 136; listing only returns tasks that are Scheduled and not completed.
  • Duplicate prevention: One intake per account + campaign pair.
  • Image URLs: Only common raster image extensions are accepted for link_image; others may be cleared.
  • Date filters: start_date / end_date apply to due date (date_due), not created date.

Recommendations

  • Validate before POST: Use GET with needsIntakeData=true to find campaigns still needing intake.
  • Store error codes: Messages include authorship-v1-create:N for troubleshooting.
  • Align LinkedIn fields: Send linkedin_url at the root for persistence until the API maps linked_in.url automatically.

Clone this wiki locally