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. Use this when an Authorship workflow task exists and the reseller submits author profile information for a campaign.

All endpoints require Authorization (Bearer JWT and/or API key — match other v1 Semify API wiki pages).

Available endpoints

Create Authorship Intake

  • Endpoint: POST /api/v1/authorship
  • Description: Creates an authorship intake for the account and campaign: writes authorship_intake and related content rows, updates the task’s link_image when valid, adds a task note, and may add a LinkedIn entry to the campaign password locker (URL only, or username + encrypted password). 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): all keys optional, but typically provide at least one of:
      • url (string) — public LinkedIn profile URL; stored on the intake and duplicated in locker note when applicable
      • username (string) and password (string) — when both are non-empty, the password is stored encrypted in the password locker; only transmit over HTTPS
  • Optional body fields (strings): 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, end_date (YYYY-MM-DD) — filter on task due date (date_due)
    • needsIntakeData (true or false) — true: tasks without an intake; false: tasks with an intake

Example requests

Create intake (URL only)

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" },
    "link_image": "https://example.com/photo.jpg",
    "credentials": "Certified Example",
    "experience_history": "10 years in SEO"
  }' \
  "https://uat.services.semify.com/api/v1/authorship"

Create intake (LinkedIn login for password locker)

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",
      "username": "user@example.com",
      "password": "useStrongSecretsOnlyOnHTTPS"
    }
  }' \
  "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 — validation (422) — invalid date range or needsIntakeData

{
  "data": {},
  "error": true,
  "messages": [
    "start_date must be in YYYY-MM-DD format; needsIntakeData must be either 'true' or 'false'"
  ]
}

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 the account–campaign has an LR3 Authorship task in Scheduled status.
  2. If an intake already exists for that account_id and camp_id, creation returns an error—resolve via internal process if needed.
  3. Submit POST /api/v1/authorship with author profile fields and linked_in as required by your integration (URL and/or credentials).
  4. Confirm with GET /api/v1/authorship?...&needsIntakeData=false that an intake is attached.

Important notes

  • HTTPS: Always use TLS; never send LinkedIn passwords over insecure connections.
  • Task type: Listing targets task type 136, Scheduled, not completed.
  • One intake per account_id + camp_id pair.
  • Image URLs: link_image must use a common raster extension (.png, .gif, .jpg, .jpeg, .bmp) or it may be cleared.
  • Due-date filters: start_date / end_date apply to date_due, not task created date.
  • Password storage: LinkedIn passwords are stored encrypted for Semify locker workflows; treat API credentials as highly sensitive.

Clone this wiki locally