Operating your own Social Server 

Access to the social networks is performed exclusively through a Social Server. The extension itself never communicates directly with the individual networks, but only sends requests to the Social Server configured in the extension settings.

By default, the SaaS service operated by fixpunkt is used. Costs may apply for its use.

If you do not want to use this service, you can develop and operate your own Social Server. Afterwards, enter its URL as apiUrl in the extension settings. This chapter describes which interface such a server must provide.

Authentication 

All requests to the Social Server are POST requests to the respective endpoint URL. This URL is composed of the configured apiUrl and the path of the endpoint, e. g.:

https://my-server.example.com/api/ + networks/facebook/posts
Copied!

The parameters are passed as form_params (application/x-www-form-urlencoded). In addition to the endpoint-specific parameters, every request contains the following fields:

Parameter Description
version Version of the interface. Currently always 2. This corresponds to the namespace v2 of the classes mentioned further below.
auth[username] The username stored in the access credentials.
auth[accesstoken] The access token stored in the access credentials.

The server is responsible for verifying auth[username] and auth[accesstoken]. With your own server, you assign these credentials yourself.

Expected response format 

The server's response must be a JSON that can be deserialized by the extension, with the help of the extension fixpunkt/fp-social-bridge, into one of the following response objects:

Class Usage
Fixpunkt\FpSocialBridge\v2\Response\SocialServerPostsResponse Response for a list endpoint (multiple posts).
Fixpunkt\FpSocialBridge\v2\Response\SocialServerPostResponse Response for an endpoint for a single post.
Fixpunkt\FpSocialBridge\v2\Response\SocialServerErrorResponse Response in case of an error.

The individual posts are expected as objects of type Fixpunkt\FpSocialBridge\v2\Data\Post.

Endpoints 

For each network, endpoints are needed for reading a list of posts as well as for reading a single post. Each endpoint is described individually below.

The JSON examples each show the complete POST body including the version and auth fields described under Authentication, so they can be copied directly. Depending on the endpoint, the response is expected to be either a list of posts (SocialServerPostsResponse) or a single post (SocialServerPostResponse); the exact format is described in the section Expected response format.

Facebook 

networks/facebook/posts 

Reads the posts of a Facebook page.

POST request to networks/facebook/posts. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "pageId": "Facebook page ID"
}
Copied!
  • pageId – ID of the Facebook page from which the posts are read. Corresponds to the channel stored in the account.

Response: List of posts (SocialServerPostsResponse).

networks/facebook/post 

Reads a single Facebook post.

POST request to networks/facebook/post. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "postId": "Post ID"
}
Copied!
  • postId – ID of the post. Corresponds to the ID under which the post was stored when it was read.

Response: Single post (SocialServerPostResponse).

Instagram 

Depending on whether the account is operated in Profile or Hashtag mode, either networks/instagram/posts or networks/instagram/hashtag is requested to read the list.

networks/instagram/posts 

Reads the posts of an Instagram profile (Profile mode).

POST request to networks/instagram/posts. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "pageId": "Instagram profile ID"
}
Copied!
  • pageId – ID of the Instagram profile from which the posts are read. Corresponds to the channel stored in the account.

Response: List of posts (SocialServerPostsResponse).

networks/instagram/hashtag 

Reads posts for a hashtag (Hashtag mode).

POST request to networks/instagram/hashtag. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "pageId": "Instagram profile ID",
    "hashtag": "fixpunkt",
    "mode": "recent_media"
}
Copied!
  • pageId – ID of the Instagram profile through which the search is performed. Corresponds to the channel stored in the account.
  • hashtag – The hashtag to search for (without #).
  • mode – Search mode for the hashtag. Possible values:

    • recent_media – the most recent posts for the hashtag.
    • top_media – the top posts for the hashtag.

Response: List of posts (SocialServerPostsResponse).

networks/instagram/post 

Reads a single Instagram post.

POST request to networks/instagram/post. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "postId": "Post ID"
}
Copied!
  • postId – ID of the post. Corresponds to the ID under which the post was stored when it was read.

Response: Single post (SocialServerPostResponse).

LinkedIn 

Depending on whether the account is operated in Shares or UGC Posts mode, either networks/linkedin/posts or networks/linkedin/ugcPosts is requested to read the list.

networks/linkedin/posts 

Reads the posts of a LinkedIn page (Shares mode).

POST request to networks/linkedin/posts. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "pageId": "LinkedIn page ID"
}
Copied!
  • pageId – ID of the LinkedIn page from which the posts are read. Corresponds to the channel stored in the account.

Response: List of posts (SocialServerPostsResponse).

networks/linkedin/ugcPosts 

Reads the user-generated-content posts of a LinkedIn page (UGC Posts mode).

POST request to networks/linkedin/ugcPosts. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "pageId": "LinkedIn page ID"
}
Copied!
  • pageId – ID of the LinkedIn page from which the posts are read. Corresponds to the channel stored in the account.

Response: List of posts (SocialServerPostsResponse).

networks/linkedin/post 

Reads a single LinkedIn post.

POST request to networks/linkedin/post. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "postId": "Post ID"
}
Copied!
  • postId – ID of the post. Corresponds to the ID under which the post was stored when it was read.

Response: Single post (SocialServerPostResponse).

Youtube 

networks/youtube/videos 

Reads the videos of a YouTube channel.

POST request to networks/youtube/videos. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "channel": "YouTube channel ID"
}
Copied!
  • channel – ID of the YouTube channel from which the videos are read. Corresponds to the channel stored in the account.

Response: List of posts (SocialServerPostsResponse).

networks/youtube/video 

Reads a single YouTube video.

POST request to networks/youtube/video. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "videoId": "Video ID"
}
Copied!
  • videoId – ID of the video. Corresponds to the ID under which the video was stored when it was read.

Response: Single post (SocialServerPostResponse).

Wordpress 

Depending on the selected mode of the account, one of the following three endpoints is requested to read the list.

networks/wordpress/posts 

Reads all posts of a Wordpress blog.

POST request to networks/wordpress/posts. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "baseUrl": "https://my-blog.example.com"
}
Copied!
  • baseUrl – Base URL of the Wordpress blog from which the posts are read.

Response: List of posts (SocialServerPostsResponse).

networks/wordpress/postsWithTag 

Reads the posts of a Wordpress blog that are tagged with a specific tag.

POST request to networks/wordpress/postsWithTag. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "baseUrl": "https://my-blog.example.com",
    "tag": "Tag"
}
Copied!
  • baseUrl – Base URL of the Wordpress blog.
  • tag – Tag by which the posts are filtered.

Response: List of posts (SocialServerPostsResponse).

networks/wordpress/postsFromAuthor 

Reads the posts of a specific author of a Wordpress blog.

POST request to networks/wordpress/postsFromAuthor. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "baseUrl": "https://my-blog.example.com",
    "author": "Author"
}
Copied!
  • baseUrl – Base URL of the Wordpress blog.
  • author – Author by which the posts are filtered.

Response: List of posts (SocialServerPostsResponse).

networks/wordpress/post 

Reads a single Wordpress post.

POST request to networks/wordpress/post. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "postId": "Post ID",
    "baseUrl": "https://my-blog.example.com"
}
Copied!
  • postId – ID of the post. Corresponds to the ID under which the post was stored when it was read.
  • baseUrl – Base URL of the Wordpress blog to which the post belongs.

Response: Single post (SocialServerPostResponse).

Bluesky 

networks/bluesky/posts 

Reads the posts of a Bluesky profile.

POST request to networks/bluesky/posts. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "clientHandle": "profil.bsky.social"
}
Copied!
  • clientHandle – Handle of the Bluesky profile from which the posts are read. Corresponds to the channel stored in the account.

Response: List of posts (SocialServerPostsResponse).

networks/bluesky/post 

Reads a single Bluesky post.

POST request to networks/bluesky/post. The body is transmitted as form_params (application/x-www-form-urlencoded):

{
    "version": 2,
    "auth": {
        "username": "Your username",
        "accesstoken": "Your access token"
    },
    "uri": "at://…"
}
Copied!
  • uri – AT URI of the post. Corresponds to the ID under which the post was stored when it was read.

Response: Single post (SocialServerPostResponse).

Error handling 

If an error occurs on the server, you have two options:

  • You respond with a JSON that can be deserialized into a SocialServerErrorResponse.
  • You respond with an HTTP error status (4xx) and a body in the following form:

    {
        "error": {
            "message": "Error description",
            "code": 1652117377
        }
    }
    Copied!

In both cases, message and code are evaluated by the extension and displayed in the backend as a synchronization error.