API Reference

Welcome to MasterPlan’s API (V2)! You can use this API to access all our API endpoints

The API is organized around REST. All request and response bodies, including errors, are encoded in JSON.

Currently we support the following official client bindings:

Authentication

An example to get Job 1234 on Client 1234 using the Bearer token in the Authorization header of the cURL request.
curl -X GET 'https://masterplan.circularsoftware.com/api/v2/Client1234/Job1234/' -H 'Authorization: Bearer YmVhcmVyX3Rva2VuX2dvZXNfaGVyZQ=='
                    

We have simplified our authentication in favour of using a Bearer token. This is passed as part of the Authentication header with your cURL requests.

You create your Bearer token by base64 encoding your Secret Key as pass it as a header to every request to the API.

For brevity, we omit this section from the below code examples.

Errors

Our API returns standard HTTP success or error status codes. For errors, we will also include extra information about what went wrong encoded in the response as JSON under the variable "error". The various HTTP status codes we might return are listed below.

HTTP Status codes

Code Title Description
200 OK The request was successful.
400 Bad request Bad request
401 Unauthorized Your API key or token is invalid.
404 Not found The resource does not exist.
601 Missing Parameters Your request is not complete.
602 Invalid Parameters One or more of your parameters were invalid.
604 Request object not found Subject of the request was not found.
500 Internal Server Error An error occurred with our API.

Error types

All errors are returned in the form of JSON with a type and optional message.

Example response.

                        {"status":200}
                    
                        
{
    "status":401, 
    "error": "Your request was not valid. Please check you have included all necessary variables"
}
                        
                    

Global API

This set of endpoints allow for non-Client specific MasterPlan operations.

Job Lookup by ISBN

No Authentication Necessary - Locate a MasterPlan job associated to a specified ISBN

API Request
curl 'https://masterplan.circularsoftware.com/api/v2/ISBN/XXXXXXXXXXXXX'
Example API Request

Creates a new Job on Client0001 with the ID Job1234, sets the Title of the publication to "My New MasterPlan Job" and sets the job to LIVE mode.

curl 'https://masterplan.circularsoftware.com/api/v2/ISBN/5554567890123/'
Successful response

{
    "status":200,
    "result":[
        {
            "clientID":"5352",
            "is_membersOnly":"no",
            "isbn":"9781783425228",
            "jobID":"9781783425228",
            "mode":"WORK",
            "publication_type":"visual",
            "url":"https:\/\/masterplan.circularsoftware.com\/Client5352\/Job9781783425228\/",
            "users_only":"yes",
            "users_only_embeds":"no"
        }
    ]
}
                    
Unsuccessful response

{
    "status" : 404,
    "error" : "Unable to locate any job with ISBN \"5554567890123\""
}
                    

HTTP Request

GET https://masterplan.circularsoftware.com/api/v2/ISBN/XXXXXXXXXXXXX/

Response Types

Code Description
200 ISBN Lookup successful. Returns an array of located Jobs on MasterPlan.
404 The ISBN was not found as a JobID on the MasterPlan platform.

Client API

This set of endpoint allow for fetching, modification and deletion of Client resources such as creating, editted and deleting jobs.

Create/Update a Job

Creating and Updating a job within MasterPlan is simple. POST-ing to the client/job endpoint allows you to both create and update any job which you have access to within MasterPlan.

Please note: If the jobID exists on the given Client on MasterPlan, this endpoint will UPDATE that job rather than create a duplicate jobID.
When using this endpoint to update a pre-existing job, only supply the parameters you wish to update, blank parameters such as coverURL="" will truncate that value.

Example API Request

Creates a new Job on Client0001 with the ID Job1234, sets the Title of the publication to "My New MasterPlan Job" and sets the job to LIVE mode.

curl -d 'jobTitle=My New MasterPlan Job&jobMode=LIVE' 'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/'
Successful response
{
    "status":200
}
Unsuccessful response
{
    "status" : 602,
    "error" : "Parameter 'coverURL' is invalid. Ensure it begins with a valid protocol such as https://.", 
    "invalid_fields": [
        "coverURL"
    ]
}
Example API Request WITH publication file upload
Note that this endpoint requires FORM-DATA in order to correctly process the publication and upload it to AWS.
AWS credentials must already be supplied to MasterPlan, and where more than one set of credentials are present for your Client, there must be a default set of credentials.

Creates a new Job on Client0001 with the ID Job1234, sets the Title of the publication to "My New MasterPlan Audiobook" and uploads the LPF audiobook.

curl 
--location --request POST \
'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/' \
--header 'Authorization: Bearer XXXXXXXXXXXXXXXXXX=' \
--form 'publicationType="audiobook"' \
--form 'jobTitle="My New MasterPlan Audiobook"' \
--form 'publication=@"MyNewAudiobook.lpf"'
Example API Request WITH publication URL upload
AWS credentials must already be supplied to MasterPlan, and where more than one set of credentials are present for your Client, there must be a default set of credentials.

Creates a new Job on Client0001 with the ID Job1234, sets the Title of the publication to "My New URL-Uploaded Publication", the Job Mode to LIVE, Spread Type to Single and removes the cover from being shown alongside thumbs.

This route requires two API calls, the first to create a Job in MasterPlan and the second to request extraction of data from the uploaded publication

First API Call
curl --location 'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/' \
--header 'Authorization: Bearer XXXXXXXXXXXXXXXXXX=' \
--form 'publication_url="https://BUCKET.s3.eu-west-2.amazonaws.com/MyPDF.pdf"' \
--form 'jobTitle="My New URL-Uploaded Publication"' \
--form 'jobMode="LIVE"' \
--form 'spreadType="single"' \
--form 'showCoverWithThumbs="no"'
Response from First API Call
{
    "status": 200,
    "affected_fields": [
        "jobTitle",
        "jobMode",
        "spreadType",
        "showCoverWithThumbs"
    ],
    "completed_actions": [...],
    "xml_result": [],
    "job": {
        "jobID": "1234",
        "jobName": "My New URL-Uploaded Publication",
        "coverURL": "",
        "jobMode": "LIVE",
        "uid": "ZXUtd2VzdC0xL21hc3RlcnBsYW4tdGV...XXXXXXXXXX"
    },
    "plugins": {}
}
Second API Call

Using the resulting json.job.uid parameter from the above response as uid...

curl --location 'https://masterplan.circularsoftware.com/api/v2/Client9999/Job1234/AwsInvokeLambda' \
--header 'Authorization: Bearer XXXXXXXXXXXXXXXXXX=' \
--form 'uid="ZXUtd2VzdC0xL21hc3RlcnBsYW4tdGV...XXXXXXXXXX"' \
--form 'extraction_opts[getThumbnails]="true"' \
--form 'extraction_opts[getCover]="true"' \
--form 'extraction_opts[getTexts]="true"' \
--form 'extraction_opts[coverIsPageOne]="true"' \
--form 'extraction_opts[readerPageOne]="3"
Response from Second API Call
{
    "status": 200,
    "aws_data": {
        "uid": "ZXUtd2VzdC0xL21hc3RlcnBsYW4tdGV...XXXXXXXXXX",
        "clientID": "9999",
        "jobID": "1234",
        "region": "eu-west-1",
        "bucket": "masterplan-bucket",
        "prefix": "uploads/Client9999/Job1234"
    }
}

HTTP Request

POST https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/

HTTP POST params

The supported parameters are:

Parameter Description Values
jobID string (required) The jobID concerned.
coverURL url (optional) A valid and complete URL to the cover. If blank, we attempt to use "cover.jpg" in your spread image folder.
slackHookURL url (optional) A valid and complete URL to a Slack Hook. Required only if you want Annotation/Status changes sent to Slack.
jobTitle string (optional) The title of the publication.
shareDescription string (optional) A description used when sharing spreads on social media platforms.
shareLink url (optional) A URL to redirect users to clicking on a spread.
epubLink url (optional) If using the Colibrio reader. Supply the EPUB to load when clicking a spread.
pdfLink url (optional) If using the Colibrio reader. Supply the PDF to load when clicking a spread.
spreadWidth int (optional) The typical width of the spreads in this publication. Used to create a ratio prior to spread loading.
spreadHeight int (optional) The typical height of the spreads in this publication. Used to create a ratio prior to spread loading.
jobMode enum (optional) The initial mode of the job. "LIVE", "WIP"
spreadType enum (optional) The spread type. "double", "single"
hasOverlay enum (optional) WIP MODE ONLY. Whether or not overlays are used, these display information about the spread when hovered over. "no", "yes"
hasAnnotator enum (optional) WIP MODE ONLY. Whether or not the annotator is permitted. "no", "yes"
annotatorAllowNonUsers enum (optional) WIP MODE ONLY. Requires "annotator" set to "yes". Allow non users to access the annotator. "no", "yes"
hideMembersOnlySpreads enum (optional) Hides Members Only spreads to Non-Memebers. Non-Members will only see public spreads in Job View. "no", "yes"
showCoverWithThumbs enum (optional) Show the publication's cover alongside the spreads. "yes", "no"
jobIsAdminOnly enum (optional) Set whether or not the job is only viewable to Admin accounts. "no", "yes"
spreadViewType enum (optional) The means of viewing spreads when clicked. "slides", "epub", "custom", "pdf_colibrio", "epub_colibrio"
readerFirstPage int (optional) If using the Colibrio reader. Supply the First Page of the main publication. Used to factor in prelims.
jobIsSample enum (optional) Set whether this job is a sample for another Job within MasterPlan "no", "yes"
fullVersionJobID string (optional) Required if jobIsSample is set to "yes". Supply the JobID for the Main Publication.
enableTwitterCard enum (optional) Allow interactive Colibrio reader when sharing to Twitter. "no", "yes"
enableWatermarking enum (optional) Switch on or off spread watermarking. "no", "yes"
forceRenderer enum (optional) Require Colibrio to force a given renderer. "none", "__responsive", "flipbookRenderer", "stackRenderer", "verticalScrollRenderer"
jobIsMembersOnly enum (optional) Set whether job is only viewable by logged in members. "no", "yes"
publicationType enum (optional) Specify the type of publication. "visual", "textual", "audiobook", "data"
onixXML string (optional) Specify an XML datasource
publication FILE (optional) Upload a publication for this Job. Accepted filetypes: pdf, epub, lpf.
NOTE: You must use FORM-DATA to upload files to MasterPlan. See example.
cf-_draft bool (optional) If Webflow is enabled and setup, whether to create this job in draft mode "true", "false"

Response Types

Code Description
200 Job has been created or updated successfully.
402 Unauthorised. You do not have the appropriate access to perform the requested action.
601 A parameter was missing. See "invalid_fields" and "error" for more information.
602 A parameter was invalid. See "invalid_fields" and "error" for more information.

Add/Update Spreads

Main API Request
curl -X POST -d 'spreads=[json]&texts=[json]' 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/Spreads/'
Example API Request

Adds the following spreads and texts to Job1234 on Client0001.

Spread 001 - 001_1234567.jpg, members only with Status "2".
Spread 002 - 002_1234567.jpg
Spread Text for Spread 001 - Contents of file found on CDN PATH /uploads/Client0001/Job1234/TXT/001.txt
Spread Text for Spread 002 - "Test Spread Text"

curl -X POST -d 'spreads={\"001\":{\"spreadID\":\"001_1234567\", \"membersOnly\":\"yes\", \"status\":2}, \"002\":{\"spreadID\":\"002_1234567\"}}&texts={\"001\":{\"filename\":\"001.txt\"}, \"002\":{\"data\":\"Test Spread Text\"}}' 'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/Spreads/'
Example XML Request
curl -T '/path/to/xml/file.xhtml' 'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/Spreads/'
Successful response

{
    "status":200
}
                    
Unsuccessful response

{
    "status" : 402,
    "error" : "You are not authorised to commit this action. Requires administrator access."
}
                    

HTTP Request

POST/PUT https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/Spreads/

Notes - Purging

Sometimes our CDN will have cached the thumbnail images and a full purge will need to take place to see updated spreads. Load MasterPlan with the ?purge query string to run a purge.

https://masterplan.circularsoftware.com/ClientXXXX/JobXXXX/?purge

HTTP POST/PUT params

The supported parameters are:

Parameter Description
spreads json (optional) A JSON string containing a list of Spreads (as key) and the value containg the key "spreadID".
i.e. {"001":{"spreadID":"001_1122334455"}}

Permitted JSON keys:
  • spreadID - the new SpreadID for the given spread, including timestamp where applicable
  • membersOnly - whether the spread should be shown to members only. Values accepted: "yes" or "no".
  • status - numerical representation for the status to give the spread
  • imageType - Values accepted: "jpg", "png", "gif"
texts json (optional) A JSON string containing a list of Spreads (as key) and the value containg the key "filename" or "data".
i.e. {"001":{"filename":"myfile.txt"}} or {"001":{"data":"Spread Text Here in full"}}
file json, xml (optional) Providing an JSON or XML file as your page list.
It does not work alongside the spreads parameter.
JSON not yet implemented. Example XHTML file

Response Types

Code Description
200 Spreads and texts successfully created.
402 Unauthorised. You do not have the appropriate access to perform the requested action.

Get Spreads

Main API Request
curl 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/Spreads/'
Successful response

{
    "status":200,
    "data":[
    {
        "spreadID":"008_15717XXXXX",
        "clientID":"XXXX",
        "jobID":"XXXX",
        "date_created":"2019-10-11 14:12:59",
        "is_membersOnly":"no",
        "revertOn":null,
        "is_commented":"no",
        "commented_icon":null,
        "last_modified_date":"2019-10-22 13:04:21",
        "last_modified_byUserID":"2",
        "last_modified_byUserName":"Ken Jones",
        "last_modified_byUserEmail":"ken@circularsoftware.com",
        "spread_status":"1"
    },
    {
        "spreadID":"010_15717XXXXX",
        "clientID":"XXXX",
        "jobID":"XXXX",
        "date_created":
        "2019-10-11 14:12:59",
        "is_membersOnly":"no",
        "revertOn":null,
        "is_commented":"yes",
        "commented_icon":{
            "icon":"fa-comment",
            "color":"rgb(83, 164, 176)"
        },
        "last_modified_date":"2019-10-22 14:29:25",
        "last_modified_byUserID":null,
        "last_modified_byUserName":null,
        "last_modified_byUserEmail":null,
        "spread_status":"2"
    }
    ]
}
                    
Unsuccessful response

{
    "status" : 402,
    "error" : "You are not authorised to commit this action. Requires administrator access."
}
                    

HTTP Request

GET https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/Spreads/

HTTP GET params

The supported parameters are:

Parameter Description
fields A comma separated list of fields to include in the response

Accepted fields include:
Field Name Resulting Data Resulting JSON variable
membersOnlyInfo Info on MembersOnly status of the spread
  • is_membersOnly ("yes"/"no")
  • revertOn (date)
commentInfo Comment Data
  • is_commented ("yes"/"no")
  • commented_icon (json object)
    • icon (i.e. fa-pencil)
    • color (i.e. rgb(255,211,255))
modifiedInfo Last Modified Data
  • last_modified_date
  • last_modified_byUserID
  • last_modified_byUserName
  • last_modified_byUserEmail
statusInfo Status Data
  • spread_status
order The order in which to return the spreads, comma separated field and order direction i.e. spreadID,asc or last_modified_date,desc
Order By Field
spreadID
last_modified_date
spread_status

Response Types

Code Description
200 Spreads lookup successful.
402 Unauthorised. You do not have the appropriate access to perform the requested action.

Delete Spreads

Main API Request
curl -X DELETE -G 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/Spreads/'
Example API Request - Single Spread

Delete Spread 002 on Client0001 Job1234

curl -X DELETE -G 'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/Spreads/' --data-raw '["002"]'
Example API Request - Multiple Spreads

Delete Spread 002 and 004 on Client0001 Job1234

curl -X DELETE -G 'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/Spreads/' --data-raw '["002","004"]'
Successful response

{
    "status":200,
    "result": [
        "002",
        "004"
    ]
}
                    
Unsuccessful response

{
    "status" : 402,
    "error" : "You are not authorised to commit this action. Requires administrator access."
}
                    

HTTP Request

DELETE https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/Spreads/

HTTP DELETE params

The supported parameters are:

Parameter Description
Body A RAW JSON post body containing the SpreadIDs to delete.

Response Types

Code Description
200 Spreads successfully deleted.
402 Unauthorised. You do not have the appropriate access to perform the requested action.

Get a Job

Main API Request
curl -X GET -G 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/'
Example API Request

Get Job1234 on Client0001

curl -X GET -G 'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/'
Successful response

{
    "status":200,
    "data": {
        "jobID":"1234",
        "jobTitle":"My New MasterPlan Job",
        "spreadWidth":"976",
        "spreadHeight":"732",
        "author":"",
        "publisher":"",
        "slackHookURL":"",
        "coverURL":""
    }
}
                    
Unsuccessful response

{
    "status" : 404,
    "error" : "Job not found on Client0001."
}
                    

HTTP Request

GET https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/

HTTP GET params

There are no additional parameters for this request.

Response Types

Code Description
200 Job lookup successful. Job details found in "result" object.
402 Unauthorised. You do not have the appropriate access to perform the requested action.
404 The requested Job doesn't exist on this Client.

Get all Jobs

Main API Request
curl -X GET -G 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Jobs/'
Example API Request

Get all Jobs on Client0001

curl -X GET -G 'https://masterplan.circularsoftware.com/api/v2/Client0001/Jobs/'
Successful response

{
    "status":200,
    "data":[{
        "jobID":"1234",
        "jobTitle":"My New MasterPlan Job",
        "spreadWidth":"976",
        "spreadHeight":"732",
        "author":"",
        "publisher":"",
        "slackHookURL":"",
        "coverURL":""
    },
    {
        "jobID":"5678",
        "jobTitle":"My Second MasterPlan Job",
        "spreadWidth":"976",
        "spreadHeight":"732",
        "author":"",
        "publisher":"",
        "slackHookURL":"",
        "coverURL":""
    }]
}
                    
Unsuccessful response

{
    "status" : 402,
    "error" : "You are not authorised to commit this action. Requires administrator access."
}
                    

HTTP Request

GET https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Jobs/

HTTP GET params

There are no additional parameters for this request.

Response Types

Code Description
200 Job lookup successful. Job details found in "result" object.
402 Unauthorised. You do not have the appropriate access to perform the requested action.

Delete Job

Main API Request
curl -X DELETE -G 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/'
Example API Request

Delete Job1234 on Client0001

curl -X DELETE -G 'https://masterplan.circularsoftware.com/api/v2/Client0001/Job1234/'
Successful response

{
    "status":200,
}
                    
Unsuccessful response

{
    "status" : 402,
    "error" : "You are not authorised to commit this action. Requires administrator access."
}
                    

HTTP Request

DELETE https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/

HTTP GET params

There are no additional parameters for this request.

Response Types

Code Description
200 Job was successfully deleted.
402 Unauthorised. You do not have the appropriate access to perform the requested action.

Get Statuses

Main API Request
curl -G 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Statuses/'
Example API Request

Get Statuses for Client0001

curl -G 'https://masterplan.circularsoftware.com/api/v2/Client0001/Statuses/'
Successful response

{
    "status":200,
    "data": {
        "status1": {
            "name": "Planning",
            "color": "255, 0, 0"
        },
        "status2": {
            "name": "Work In Progress",
            "color": "255, 165, 8"
        },
        "status3": {
            "name": "Images Approved",
            "color": "255, 255, 0"
        },
        "status4": {
            "name": "Editorial Approved",
            "color": "33, 153, 204"
        },
        "status5": {
            "name": "Proof Approved",
            "color": "148, 0, 211"
        },
        "status6": {
            "name": "Print Ready",
            "color": "54, 211, 0"
        }
    }
}
                    
Unsuccessful response

{
    "status" : 402,
    "error" : "You are not authorised to commit this action. Requires administrator access."
}
                    

HTTP Request

GET https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Statuses/

HTTP GET params

There are no additional parameters for this request.

Response Types

Code Description
200 Statuses were found and resulted in the data parameter
402 Unauthorised. You do not have the appropriate access to perform the requested action.

Get a User by ID

Access a user on the Client.

API Request
curl 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Users/XXXX/'
Example API Request
curl 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Users/XXXX/'
Getting a User using the DesktopID
curl 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Users/?desktopId=1234567890'
Successful response

{
    "status":200,
    "data":[
        {
            "userId": "1648",
            "userType": "User",
            "userPass": "*********",
            "userName": "User Name",
            "userEmail": "user.name@example.com",
            "memberstackId": "mem_sag4gr8s64g846sxxxxxx",
            "assignedClient": "0001",
            "userPermissions": [
                "clientAdmin"
            ],
            "accessScheme": "",
            "desktopId": "1234578900",
            "passwordToken": "*********",
            "customAccess": null,
            "isSuperAdmin": false,
            "isClientAdmin": true,
            "isJobAdmin": false,
            "isClientMember": null
        }
    ]
}
                    
Unsuccessful response

{
    "status":404,
    "error":"User \"XXXX\" not found on Client XXXX."
}

                    

HTTP Request

GET https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Users/XXXX/

GET https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Users/?desktopId=XXXX

Response Types

Code Description
200 Fetch was successful. Returns data for the given user on this Client.
404 User was not found on this Client.

Get all Users

Access all users on the Client.

API Request
curl 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Users/'
Example API Request
curl 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Users/'
Successful response

{
    "status":200,
    "data":[
        {
            "userID":"XXXX",
            "userName":"Name",
            "userEmail":"email",
            "desktopID":"XXXXXXXXXXXXX",
            "clientAccessLevel":"2",
            "spreadAccess":null,
            "customAccess":null
        },
        {
            "userID":"XXXX",
            "userName":"Name",
            "userEmail":"email",
            "desktopID":"XXXXXXXXXXXXX",
            "clientAccessLevel":"2",
            "spreadAccess":null,
            "customAccess":null
        },
        {
            "userID":"XXXX",
            "userName":"Name",
            "userEmail":"email",
            "desktopID":"XXXXXXXXXXXXX",
            "clientAccessLevel":"2",
            "spreadAccess":"{\"0000\": {\"access\": \"default\"}, \"XXXXXXXXXXXXX\": {\"access\": \"001~016\"}, \"XXXXXXXXXXXXX\": {\"access\": \"all\"}, \"XXXXXXXXXXXXX\":{\"access\": \"none\"}}",
            "customAccess":null
        }
    ]
}
                    

HTTP Request

GET https://masterplan.circularsoftware.com/api/v2/ClientXXXX/Users/

Response Types

Code Description
200 Returns an array of users on the supplied Client.

Get Annotations for Spread

Get all of the annotations (including Notes and Regions) for a given spreadID.

API Request
curl 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/SpreadXXXX/Annotations'
Example API Request
curl 'https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/SpreadXXXX/Annotations'
Successful response

{
    "status": 200,
    "result": {
        "notes": [
            {
                "note": "Text attached to note",
                "x": 0.000,
                "y": 0.00,
                "colour": "rgb(0, 0, 0)",
                "icon": "fa-solid fa-thumbs-down fa-xl",
                "user": "Creator Name",
                "userID": "1",
                "ts": 1681749666311,
                "last_modified": 1681749671471
            }
        ],
        "regions": [
            {
                "x": 10.000,
                "y": 10.000,
                "user": "Creator Name",
                "width": 100.000,
                "height": 100.000,
                "userID": "1"
            }
        ]
    }
}
                    

HTTP Request

GET https://masterplan.circularsoftware.com/api/v2/ClientXXXX/JobXXXX/SpreadXXXX/Annotations/

Response Types

Code Description
200 Returns an array containing the keys notes and regions.