Skip to main content

Published API

Published API

All these api calls are HTTPS only and rooted at your tenant. For example: https://your-tenant.pathfinderedge.com/api/v1/profiles.

This API reads and writes your profile library. It does not send profiles to a machine — machines pull their own updates on a schedule, filtered by catalog. See Machine sync before integrating, especially if your goal is to get a profile onto a machine.

Security

The Edge api uses api keys to provide authentication. Users generate their own keys using their tenant on the Pathfinder Edge website. Using an admin account, login to a tenant and navigate to Admin -> Api Keys. From there you can view and create keys. Eventually, you will be able to revoke/delete them here as well.

Api keys are a roughly 40 character string.

The key goes in the Authorization header raw, with no scheme prefix

Authorization: OQNRuUVWSEcyMkJZSEhYSlg3SEEHoTdMMzZ9SlA4

The server compares the entire header value against your key. Anything you add in front of it — or any transformation of the key itself — makes the comparison fail and returns 401. These all fail:

Header sentResult
Authorization: <key>correct
Authorization: Bearer <key>❌ 401 — the scheme prefix is part of the compared value
Authorization: ApiKey <key>❌ 401 — this is the Eclipse Pro format, not Edge's
X-API-Key: <key>❌ 401 — this header is not read at all
Authorization: <base64-decoded key>❌ 401 — send the key exactly as issued; do not decode it

Keys are usable the moment they are created — there is nothing to activate, and there are no scopes or per-endpoint permissions. A key grants full access to its tenant's library.

Here is an example http post to create a new profile using the web api.

POST /api/v1/profiles HTTP/1.1 Host: ams-test.pathfinderedge.com Authorization: OQNRuUVWSEcyMkJZSEhYSlg3SEEHoTdMMzZ9SlA4 Content-Type: application/json Cache-Control: no-cache

{
"profileName": "A Sample Profile",
"description": "Quite nifty",
"owningCatalogId": 1,
"category": "Quirky Parts",
"subCategory": "Awkward",
"features": [
{"type":"Straight", "length":0.5},
{"type":"OpenHem", "hemHeight": 0.25, "hemDirection":"Negative"},
{"type":"Straight", "length":10},
{"type":"Angle", "angle": 90.0},
{"type":"Straight", "length":10},
{"type":"TearDropHem", "hemDirection":"Positive"},
{"type":"Straight", "length":0.5}
]
}

The Authorization header, OQNRuUVWSEcyMkJZSEhYSlg3SEEHoTdMMzZ9SlA4, is the api key.

Diagnosing a 401

A 401 response body tells you which of the two failure modes you hit:

{
"error": "You are unauthorized to make this request.",
"reason": "SchemePrefixed",
"expectedFormat": "The Edge API expects the API key as the raw Authorization header value, with no scheme prefix (Authorization: <key>) — not 'Bearer <key>', not 'ApiKey <key>', and not base64-decoded. Generate keys under Admin > Api Keys.",
"keyFingerprint": "9f2a1c4d7b03"
}
reasonMeaning
MissingHeaderNo Authorization header, or it was blank.
SchemePrefixedThe value carried a scheme prefix (Bearer, ApiKey, Basic, …). Send the raw key.
UnknownKeyCorrectly formatted, but no key on this tenant matches. Either the key is wrong or it was deleted — keys are deleted outright, not marked revoked, so the two are indistinguishable by design.

keyFingerprint is a short non-reversible hash of what you sent. It is safe to quote in a support request and lets us match your attempts to our server-side logs; identical values mean you sent the same key twice. Failed attempts are logged server-side with this fingerprint, so support can confirm what reached us without you ever sharing the key.

List Profiles

Returns list of profiles in json format.

  • URL

    /api/v1/profiles

  • Method:

    GET

  • URL Params

    Optional:

    • catalog=[integer] — return only profiles in this catalog.
    • skip=[integer] and take=[integer] — paging. Both are required together; sending only one, or skip < 0 / take < 1, returns 400 rather than falling back to a default.

    Archived (deleted) profiles are never returned.

  • Data Params

    None

  • Success Response:

    • Code: 200
      Content:
[{
"profileId": 10001,
"profileName": "test1",
"description": "A sample profile",
"owningCatalogId": 1,
"category": "",
"subCategory": "",
"blankWidth": 4.75,
"bendCount": 3,
"hemCount": 1
}, ... ]
  • Error Response:

    • Code: 401 UNAUTHORIZED
      Content: see Diagnosing a 401

    • Code: 400 BAD REQUEST
      Content: empty — an invalid skip/take pair

Get Profile

Returns single profile in json format.

  • URL

    /api/v1/profiles/:id

  • Method:

    GET

  • URL Params

    Required:

    • id=[someidvalue] Profile Id
  • Data Params

    None

  • Success Response:

    • Code: 200
      Content:
{
"profileId": 10001,
"profileName": "test1",
"owningCatalogId": 1,
"category": "",
"subCategory": "",
"blankWidth": 4.75,
"bendCount": 3,
"hemCount": 1
}
  • Error Response:

    • Code: 401 UNAUTHORIZED
      Content: see Diagnosing a 401

    • Code: 404 NOT FOUND
      Content: empty — the profile does not exist, is archived, or belongs to another tenant. These are deliberately not distinguished.

Post Profile

Create a new profile.

  • URL

    /api/v1/profiles

  • Method:

    POST

  • Data Params

    A profile object in json format, in the body. See The profile object for the full field-by-field format, including which fields apply to which feature type.

    Two fields deserve attention:

    • owningCatalogId — optional, but if you send it, it must be the id of a catalog belonging to your tenant; anything else is a 400. Get valid ids from List Catalogs. If you omit it, the profile lands in your tenant's default catalog.

      Which catalog you choose determines which machines can see the profile

      A machine only receives profiles from the catalogs it is subscribed to under Admin > Machines > (your machine). Posting to a catalog no machine subscribes to succeeds and is a perfectly valid library entry — it just never reaches a machine. See Machine sync.

    • blankWidthnot accepted on input; the server computes it as the sum of your feature lengths and returns it in the response. Sending it has no effect.

  • Success Response:

    • Code: 200
      Content:
{
"profileName": "test1",
"owningCatalogId": 1,
"category": "",
"subCategory": "",
"blankWidth": 4.75,
"bendCount": 3,
"hemCount": 1
}

Upon successfully posting a new profile, the profile header data is echoed back. profileId (notably absent in the sample above) will be assigned by the server, and can be used to fetch the header details for this profile later.

Check the echoed owningCatalogId and blankWidth — they confirm which catalog the profile actually landed in and what the server computed, which is what a machine will act on.

  • Error Response:

    • Code: 401 UNAUTHORIZED
      Content: see Diagnosing a 401

    • Code: 400 BAD REQUEST
      Content: [ "Hems must have a hemDirection of 'Positive' or 'Negative'.", "Radius bends require a non-negative radius." ]

Bad request errors mean the profile data failed validation. It will be a list of messages that hopefully highlight the problem. [ "OwningCatalogId must refer to a valid catalog." ] means the catalog id you sent is not one of your tenant's catalogs.

Get Profile Thumbnail

Returns a rendered image of the profile. Useful for showing an operator or a picker what a profile looks like without reimplementing the geometry.

  • URL

    /api/v1/profiles/:id/thumbnail or /api/v1/profiles/:id/thumbnail.png — PNG
    /api/v1/profiles/:id/thumbnail.svg — SVG

  • Method:

    GET

  • URL Params

    Required:

    • id=[someidvalue] Profile Id
  • Success Response:

    • Code: 200
      Content: the image, image/png or image/svg+xml. Rendered on request, white-on-black.
  • Error Response:

    • Code: 401 UNAUTHORIZED
      Content: see Diagnosing a 401

    • Code: 404 NOT FOUND
      Content: empty

Delete Profile

Remove the profile from the catalog.

Deleting archives the profile rather than erasing it: it stops appearing in list/get results, and the deletion propagates to every machine subscribed to its catalog on that machine's next sync.

  • URL

    /api/v1/profiles/:id

  • Method:

    DELETE

  • URL Params

    Required:

    • id=[someidvalue] Profile Id
  • Data Params

    None

  • Success Response:

    • Code: 200
      Content:

    None

  • Error Response:

    • Code: 401 UNAUTHORIZED
      Content: see Diagnosing a 401

    • Code: 404 NOT FOUND
      Content: empty

List Catalogs

Returns list of catalogs in json format. Start here: these are the only valid values for owningCatalogId when posting a profile.

  • URL

    /api/v1/catalogs

  • Method:

    GET

  • URL Params

    None

  • Data Params

    None

  • Success Response:

    • Code: 200
      Content:
[{
"catalogId": 1,
"catalogName": "Standards"
}, ... ]

This endpoint is the quickest way to confirm a key works — it needs no body and no parameters.

GET /api/v1/catalogs HTTP/1.1 Host: your-tenant.pathfinderedge.com Authorization: OQNRuUVWSEcyMkJZSEhYSlg3SEEHoTdMMzZ9SlA4